コンピュータサイエンス系勉強ノート

計算機科学に限らず日々学んだことを色々まとめていきます

平均情報量でクラスタリングの曖昧さを図ってみる(python)

混合ガウス分布クラスタリングを行う際に任意の点がどのクラスタに属するかの所属度を使って,その点がどのクラスタに属するかの曖昧さを平均情報量で求めてみました.何かに使えるかもしれないのでメモっておきます

まずサンプル点を生成する

まずクラスタリング用のサンプル点を生成します.4クラスタに分かれてます.

#encoding:utf-8

#平均
mu1 = [-2,-2]
mu2 = [2,2]
#共分散
cov = [[0.1,0.0],[0.0,0.1]]

#500はデータ数
x1,y1 = np.random.multivariate_normal(np.array([1.0,1.0]),cov,2000).T
x2,y2 = np.random.multivariate_normal(np.array([1.0,3.0]),cov,2000).T
x3,y3 = np.random.multivariate_normal(np.array([3.0,1.0]),cov,2000).T
x4,y4 = np.random.multivariate_normal(np.array([3.0,3.0]),cov,2000).T

plt.plot(x1,y1, "ro")
plt.plot(x2,y2, "go")
plt.plot(x3,y3, "bo")
plt.plot(x4,y4, "yo")
plt.show()

f:id:clientver2:20160217173106p:plain

混合ガウスモデルでサンプル点の所属度を求める

#encoding:utf-8

#平均
mu1 = [-2,-2]
mu2 = [2,2]
#共分散
cov = [[0.1,0.0],[0.0,0.1]]

#500はデータ数
x1,y1 = np.random.multivariate_normal(np.array([1.0,1.0]),cov,2000).T
x2,y2 = np.random.multivariate_normal(np.array([1.0,3.0]),cov,2000).T
x3,y3 = np.random.multivariate_normal(np.array([3.0,1.0]),cov,2000).T
x4,y4 = np.random.multivariate_normal(np.array([3.0,3.0]),cov,2000).T

Y = np.concatenate([y1,y2,y3,y4])
X = np.concatenate([x1,x2,x3,x4])
N = np.vstack([Y,X]).T

n_components = 4
gmm = sklearn.mixture.GMM(n_components, covariance_type='full')
gmm.fit(N)

Y, X = np.meshgrid(np.linspace(1,3,500), np.linspace(1,3,500))
prob = gmm.predict_proba(np.vstack([Y.reshape(-1), X.reshape(-1)]).T)
prob = np.sum(-prob * np.log2(prob), axis=1).reshape(500,500)
plt.imshow(prob)
plt.show()

f:id:clientver2:20160217173119p:plain

考察

平均情報量の値が高い部分が十字状に広がっていることが分かります.また,平均情報量の値は中心付近が最も高くなっていますね.これは中心付近がどのクラスタに属するのかが曖昧だということを示しています.どのクラスタ中心にも距離的に近いのでどのクラスタに属しているかははっきりとは分からないということです.