データ分析の精度向上: PyTorch MultivariateNormalで共分散行列を解析


torch.distributions.multivariate_normal.MultivariateNormal.covariance_matrix は、PyTorchのProbability Distributionsモジュールにおける多変量正規分布クラスMultivariateNormalの属性であり、分布の共分散行列を取得するためのメソッドです。

多変量正規分布とは

多変量正規分布は、複数の変数の確率分布を表現するものであり、各変数の平均値と共分散行列によってパラメータ化されます。共分散行列は、変数間の相関関係を表す行列であり、対称かつ正定値である必要があります。

covariance_matrix 属性

covariance_matrix 属性は、MultivariateNormal オブジェクトの共分散行列を返します。この行列は、torch.Tensor オブジェクトとして表現され、形状は (d, d) となります。ここで、d は分布の次元数です。

以下のコードは、MultivariateNormal オブジェクトを作成し、その covariance_matrix 属性を取得する方法を示しています。

import torch
from torch.distributions import MultivariateNormal

mean = torch.tensor([1.0, 2.0])
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 2.0]])
mvn = MultivariateNormal(loc=mean, covariance_matrix=covariance_matrix)
covariance = mvn.covariance_matrix
print(covariance)

このコードを実行すると、以下の出力が得られます。

tensor([[1., 0.5],
       [0.5, 2.]])

covariance_matrix 属性の活用例

covariance_matrix 属性は、多変量正規分布の統計量を計算したり、サンプリングを行ったりする際に役立ちます。例えば、以下のコードは、covariance_matrix 属性を使用して、分布の標準偏差を計算する方法を示しています。

import torch
from torch.distributions import MultivariateNormal

mean = torch.tensor([1.0, 2.0])
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 2.0]])
mvn = MultivariateNormal(loc=mean, covariance_matrix=covariance_matrix)
covariance = mvn.covariance_matrix
std_dev = torch.sqrt(covariance.diag())
print(std_dev)
tensor([1., 1.4142])

torch.distributions.multivariate_normal.MultivariateNormal.covariance_matrix 属性は、多変量正規分布の共分散行列を取得するための重要なメソッドです。この属性を活用することで、分布の統計量を計算したり、サンプリングを行ったりすることができます。

  • MultivariateNormal オブジェクトのサンプリングを行うには、sample() メソッドを使用します。
  • MultivariateNormal オブジェクトの共分散行列は、covariance_matrix 属性以外にも、precision_matrix 属性や scale_tril 属性を使用して設定することができます。


import torch
from torch.distributions import MultivariateNormal

# 分布のパラメータを設定
mean = torch.tensor([1.0, 2.0])
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 2.0]])

# 多変量正規分布を作成
mvn = MultivariateNormal(loc=mean, covariance_matrix=covariance_matrix)

# サンプル数を指定
num_samples = 10000

# サンプリングを実行
samples = mvn.sample(sample_shape=(num_samples,))

# サンプルを表示
print(samples)
tensor([[ 1.1203,  1.8103],
       [ 0.7939,  2.4581],
       [ 1.2302,  1.6214],
       [ 1.0582,  2.1178],
       [ 0.9047,  1.9474],
       [ 1.3941,  2.0421],
       [ 1.1795,  1.7344],
       [ 1.0244,  2.2740],
       [ 0.8470,  2.3153],
       [ 1.4827,  1.7061],
       [ ... ],
       [ 1.0332,  1.9847],
       [ 1.2021,  1.6988],
       [ 0.9611,  2.1422],
       [ 1.3094,  1.8929],
       [ 0.8179,  2.5102],
       [ 1.1402,  1.7980],
       [ 1.0118,  2.2223],
       [ 0.7785,  2.4117],
       [ 1.4451,  1.7586]], device='cpu')

このコードでは、以下の処理が行われています。

  1. 分布のパラメータである平均ベクトルと共分散行列を定義します。
  2. MultivariateNormal クラスを使用して、多変量正規分布オブジェクトを作成します。
  3. サンプリングするサンプル数を指定します。
  4. sample() メソッドを使用して、指定されたサンプル数のサンプルを生成します。
  5. 生成されたサンプルを表示します。

分布のパラメータの設定

mean = torch.tensor([1.0, 2.0])
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 2.0]])

この部分では、多変量正規分布のパラメータである平均ベクトルと共分散行列を定義しています。

  • covariance_matrix は、分布の各変数間の共分散関係を表す行列です。この例では、以下の行列が設定されています。
  • mean は、分布の各変数の平均値を表すベクトルです。この例では、[1.0, 2.0] というベクトルが設定されています。
[[1.0, 0.5],
 [0.5, 2.0]]

この行列は、対称かつ正定値である必要があります。

多変量正規分布の作成

mvn = MultivariateNormal(loc=mean, covariance_matrix=covariance_matrix)

この部分では、MultivariateNormal クラスを使用して、定義したパラメータに基づいて多変量正規分布オブジェクトを作成しています。

サンプリングするサンプル数の指定

num_samples = 10000

この部分では、サンプリングするサンプル数を 10000 に設定しています。

samples = mvn.sample(sample_shape=(num_samples,))


precision_matrix 属性

covariance_matrix 属性は共分散行列を使用しますが、precision_matrix 属性は精度行列を使用します。精度行列は共分散行列の逆行列であり、こちらも多変量正規分布のパラメータとして用いることができます。

コード例:

import torch
from torch.distributions import MultivariateNormal

mean = torch.tensor([1.0, 2.0])
precision_matrix = torch.tensor([[1.0, -0.5], [-0.5, 0.5]])
mvn = MultivariateNormal(loc=mean, precision_matrix=precision_matrix)

scale_tril 属性

covariance_matrix 属性は密度行列全体を使いますが、scale_tril 属性は下三角行列のみを使って表現します。メモリ効率が良い場合や、共分散行列が対称行列であることが保証されている場合に便利です。

import torch
from torch.distributions import MultivariateNormal

mean = torch.tensor([1.0, 2.0])
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 2.0]])
lower_triangular = torch.cholesky(covariance_matrix)
mvn = MultivariateNormal(loc=mean, scale_tril=lower_triangular)

Independent(Normal(...), dim=d) (条件付き)

注意
この方法は、共分散行列が対角行列 (各変数が独立) である場合にのみ使えます。

もし共分散行列が対角行列であれば、Independent モジュールと Normal 分布を組み合わせて表現できます。これは、各変数が独立な多変量正規分布を表現します。

import torch
from torch.distributions import Independent, Normal

mean = torch.tensor([1.0, 2.0])
std_dev = torch.tensor([1.0, 1.4142])  # 共分散行列の分散部分の平方根
mvn = Independent(Normal(loc=mean, scale=std_dev), dim=1)

選択基準

使用する代替方法は、以下の点に応じて選択してください。

  • 共分散行列が対角行列であるか
  • メモリ効率を優先するか
  • 共分散行列の情報が精度行列として利用可能か