k-平均法は非階層型クラスタリング手法の一つである。
参考
クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた(てっく煮ブログ)
以前つくった串本浦神の潮位差と黒潮緯度の分布(下図)を2つのグループに分けてみる。
道具はscipyのk-means2関数を用いる。分けられたグループで色分けする。大きな●はそれぞれのグループの重心である(kmeans2で出てくる重心はNormarizeされたデータのものなのでそのままはつかわないこと)。重心が収束しているかの確認もおこなっている。
#read module from read_kuroshio_lat import read_kuroshio_lat from read_kushimoto_uragami import read_kushimoto_uragami import matplotlib.pyplot as plt import numpy as np from scipy.cluster.vq import kmeans2, whiten,vq # functions for k-means #read data kuroshio_lat=read_kuroshio_lat() kushimoto_uragami=read_kushimoto_uragami() #kmeans nomissing=np.logical_and(~kuroshio_lat.mask,~kushimoto_uragami.mask) #missing value should be excluded. lat=kuroshio_lat.data[nomissing] level=kushimoto_uragami.data[nomissing] data=np.column_stack((level,lat)) whiteneddata=whiten(data) #whitened beforehand centroids,index=kmeans2(whiteneddata,2,iter=20) #k-means #check centroids are converged label = vq(whiteneddata, centroids)[0] for i in range(2): print 'group=',i print 'estimated=', centroids[i,:] print 'actual =',whiteneddata[label==i,:].mean(axis=0) #### plot plt.figure() #1stgroup plt.plot(level[index==0],lat[index==0],'r.') plt.plot(level[index==1].mean(),lat[index==1].mean(),'go',markersize=12) #2nd group plt.plot(level[index==1],lat[index==1],'g.') plt.plot(level[index==0].mean(),lat[index==0].mean(),'ro',markersize=12) plt.xlabel("Kushimoto-Uragami") plt.ylabel("Kuroshio Latitude") plt.savefig("kurosho_kmeans.png") plt.show()
出力
group= 0 estimated= [ 1.58989573 42.05977249] actual = [ 1.58989573 42.05977249] group= 1 estimated= [ 0.14166519 40.3829155 ] actual = [ 0.14166519 40.3829155 ] |
0 件のコメント:
コメントを投稿