scipy做層級聚類(轉)
阿新 • • 發佈:2018-12-22
#!/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_)
兩個包的結果還是有點不一樣的