多次元正規分布からd次元ベクトルからなる標本を作成(python.numpy)

2クラスの分類問題に対して確率的なアプローチを取るとき, クラス0とクラス1の平均がほぼ同じであるような場合に遭遇することが多い気がする(個人的に). こういう時,k-NNとかは歯が立たないような印象を受ける. さらに,標本平均ってかなりの分類アルゴリズムで用いられると思うので,これにあまり差がない場合,どうしたらいいのかわからない. 素朴な意見として,確率的アプローチを自分なりに考えてみる. 例えばクラス0を生成する分布p0と,クラス1を生成する分布p1を考えるとする (ここで,標本はpx0,px1の混合分布から生成されたと考えるのが素直). そしてこれらが二つとも正規分布だとする. そうすると,パラメータはmu0, mu1, sigma0, sigma1の4つであり,これらを推定することで,分類問題を解くことになる. このとき,上で述べた僕が遭遇する状況はmu0=mu1の場合のことである (=というのは言い過ぎかもしれないが).

つまり,推定するパラメータはmu(mu=mu0=mu1), sigma0, sigma1の3つである. こういう状況を人工的に作り出すためにタイトルの実験を行う. 環境はOSX10.8, Python2.7である.

実装は以下のようになった.rand_vcmでランダムな正定値対称行列を作成して,それを分散共分散行列にしている.

import numpy as np
import matplotlib.pyplot as plt

# create random variance-covariance matrix (positive-definite symmetric matrix)
def rand_vcm(d):
    A = np.random.normal(size=(d,d)) + np.eye(d)
    return A.T.dot(A)

d = 2
mu = np.random.normal(size=d)
sigma0 = rand_vcm(d)
sigma1 = rand_vcm(d)
print mu
print sigma0
print sigma1

n0, n1 = 100, 100
N = n0 + n1
x0 = np.random.multivariate_normal(mu, sigma0, n0)
x1 = np.random.multivariate_normal(mu, sigma1, n1)
x = np.concatenate((x0, x1))

plt.figure()
plt.plot(x0, "ro")
plt.plot(x1, "bx")
plt.show()

プロットした結果は以下のようになった. mixture_test2.png

Summary

今回は,2クラス分類問題の確率的アプローチを検討するために,2つの分布(平均は等しく分散共分散行列が異なる)から標本を作成した. 具体的には,Pythonで多次元正規分布に従う標本を2つ作成した. 次回から,この人口データを利用して平均が同じで,分散共分散行列が異なる2つ分布からなる混合分布から生成されたという仮定のもとでの分類問題を考えていきたい.

多次元正規分布からd次元ベクトルからなる標本を作成(python.numpy)」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中