何らかの方法でクラスタリングして、その分類を示しつつ、もとのデータの状態をヒートマップで確認したいというような要望が良くあるような気がします。例えば、AffinityPropagation法を使ってデータをクラスタリングした場合はこんな感じです。
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
# dataはいつものように、pandas.DataFrame(サンプルは列方向)
# 行方向にサンプルが並んでいるときはTいりません。
af = AffinityPropagation(preference=-2000).fit(data.T)
# サンプルをクラスターグループごとに並べます。
_idx = []
for i,c in enumerate(af.labels_):
_idx.append((c,data.columns[i]))
_idx.sort()
sorted_data = data[[v[1] for v in _idx ]]
# サイズはお好みで。
fig = pylab.figure(figsize=(16,9))
ax1 = fig.add_axes([0.07,0.2,0.85,.6])
im = ax1.matshow(sorted_data.ix[idx],vmin=0.0,vmax=1.0,aspect='auto',cmap = plt.get_cmap('Blues'))
ax1.set_axis_off()
axcolor = fig.add_axes([0.94,0.4,0.02,0.2])
pylab.colorbar(im, cax=axcolor)
# クラスター番号の並び配列を用意します。
import copy
c_data = copy.deepcopy(af.labels_)
c_data.sort()
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
random.shuffle(cmaplist)
cmap = cmap.from_list('My cmap', cmaplist)
ax2 = fig.add_axes([0.07,0.17,0.85,0.02])
ax2.matshow([c_data], cmap=cmap, interpolation='nearest',aspect='auto')
ax2.set_axis_off()
fig.show()
fig.savefig('my_img.png')
出来上がりはこんな感じ。ちなみに、クラスターの色分けをrandom.shuffleしているのは、そのままだと隣り合った色がどうしても似てしまって分かりにくいから。しかし、これだと結果がその都度変わるなーと思ったり。
スポンサーサイト