平均情報量でクラスタリングの曖昧さを図ってみる(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()
混合ガウスモデルでサンプル点の所属度を求める
#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()