1. 程式人生 > >scipy做層級聚類(轉)

scipy做層級聚類(轉)

#!/usr/bin/python3
# -*- coding: utf-8 -*-

###cluster.py
#匯入相應的包
import scipy
import scipy.cluster.hierarchy as sch
from scipy.cluster.vq import vq,kmeans,whiten
import numpy as np
import matplotlib.pylab as plt


#生成待聚類的資料點,這裡生成了20個點,每個點4維:
points=scipy.randn(20,4)
print("pints=",points)
#1. 層次聚類
#生成點與點之間的距離矩陣,這裡用的歐氏距離:
disMat = sch.distance.pdist(points,'euclidean')
#進行層次聚類:
Z=sch.linkage(disMat,method='average')

#將層級聚類結果以樹狀圖表示出來並儲存為plot_dendrogram.png
P=sch.dendrogram(Z)
plt.savefig('plot_dendrogram.png')
#根據linkage matrix Z得到聚類結果:
cluster= sch.fcluster(Z, t=1,criterion='inconsistent')

print ("Original cluster by hierarchy clustering:\n",cluster)

#2. k-means聚類
#將原始資料做歸一化處理
data=whiten(points)

print("data:",data)
#使用kmeans函式進行聚類,輸入第一維為資料,第二維為聚類個數k.
#有些時候我們可能不知道最終究竟聚成多少類,一個辦法是用層次聚類的結果進行初始化.當然也可以直接輸入某個數值.
#k-means最後輸出的結果其實是兩維的,第一維是聚類中心,第二維是損失distortion,我們在這裡只取第一維,所以最後有個[0]
centroid=kmeans(data,max(cluster))[0]

#使用vq函式根據聚類中心對所有資料進行分類,vq的輸出也是兩維的,[0]表示的是所有資料的label
label=vq(data,centroid)[0]

print ("Final clustering by k-means:\n",label)
# centroid=kmeans(data,max(cluster))[0]
centroid=kmeans(data,5)[0]

#使用vq函式根據聚類中心對所有資料進行分類,vq的輸出也是兩維的,[0]表示的是所有資料的label
label=vq(data,centroid)[0]

print ("Final clustering by k-means:\n",label)

KMeans=KMeans(n_clusters=5,random_state=0)
KMeans.fit(data)
print("using sklean package")
print(KMeans.labels_)

 

 兩個包的結果還是有點不一樣的