python层次聚类_python实现层次聚类
BAFIMINARMTO
BA0662877255412996
FI6620295468268400
MI8772950754564138
NA2554687540219869
RM4122685642190669
TO9964001388696690
這是一個距離矩陣。不管是scipy還是fastcluster,都有一個計算距離矩陣的步驟(也可以不用)。距離矩陣是冗余的,因為它是對稱的。scipy里面的文檔好多的關于數學上的英文,讓我都搞糊涂了。distance = spatial.distance.pdist(data),這段代碼里,data是一個矩陣,但不是距離矩陣,而是如http://www.shahuwang.com/?p=952 這篇文章中用到的數據形式,而最后算出來的distance只是一個數組,并不是矩陣,而且是一維數組,這是為什么呢?仔細看上面的那個矩陣,就知道我們只需要記錄對角線上或者下面的一部分就可以了。廢話不說,來看最簡單的一個層次聚類實現(我現在主要將scipy的,fastcluster的使用幾乎一樣):
1
2from scipy.cluster.hierarchyimport fclusterdata
fclusterdata(matData,t=0.99,criterion='inconsistent',metric='euclidean',method='average',R=None)#這個不需要計算linkage就能直接出結果了
這里用到的matData來自于:http://www.shahuwang.com/?p=952 用到的數據,是矩陣形式的。輸出的結果如下:
array([15, 19, 20, 26, 23, 10, 26, 23, 18, 21, 20, 22, 10, 20, 1, 18, 11,
8, 4, 18, 21, 29, 25, 17, 18, 20, 24, 23, 3, 19, 12, 13, 15, 9,
18, 25, 16, 28, 5, 17, 25, 17, 1, 15, 7, 4, 14, 6, 20, 2, 4,
3, 9, 5, 2, 23, 1, 9, 25, 15, 23, 27, 16, 11, 22, 20, 12])
結果的意思,就是說我的矩陣的第一個數據現在被分到了第15個類中,后面的也都是這個意思,自己再整理一下,就能輸出美觀直觀的結果了。下面主要來講一下fclusterdata里面的參數的意思:
matData,這是要聚類的數據,t是一個閾值,小于1大于0,你可以根據輸出結果來設置這個閾值。criterion,是一個標準,它主要是確定形成最后結果(如上面的那個array)需要滿足什么條件,這個主要和 t 這個閾值進行合作。
1
2
3
4
5
6
7
8from scipy.cluster.hierarchyimport linkage ,fcluster,fclusterdata
import pandas as pd
data= pd.read_csv('/home/rickey/文檔/學習/數據挖掘與數據倉庫/數據挖掘作業/三圍數據',sep='t',index_col=0)
matData= data.as_matrix()
distance= spatial.distance.pdist(matData)
linkresult= linkage(distance,method='average',metric='euclidean')
fcluster(linkresult,t=0.99,criterion='inconsistent',depth=2,R=None,monocrit=None)#這個需要先計算linkage,再出結果
dendrogram(linkresult,get_leaves=False,show_leaf_counts=False)#這個可以繪制出樹形圖
這是更復雜一些的實現形式,主要有四個函數要注意,分別是pdist,linkage,fcluster,dendrogram。
這段代碼用的數據和前面那段是一樣的,結果也是一樣的。distance是一個距離數組(距離矩陣的一邊角),之前已經說明了pdist的作用了。linkage返回的是一個4×(n-1)的矩陣。比如我的數據是67個,返回的則是一個4×66的矩陣。這個矩陣的意思,scipy文檔上用的是這段話:“A 4 by
matrixZis returned. At the
-th iteration, clusters with indicesZ[i, 0]andZ[i, 1]are combined to form cluster
. A cluster with an index less than
corresponds to one of the
original observations. The distance between clustersZ[i, 0]andZ[i, 1]is given byZ[i, 2]. The fourth valueZ[i, 3]represents the number of original observations in the newly formed cluster.”
英語不濟,不是很看得明白。大概是說Z[i,0],Z[i,1]是組成n+i簇的之類的吧。
fcluster這個函數,則是把linkage算出的結果,形成一個平面數組,形成最后的聚類結果呈現出來。里面的參數和fclusterdata里面的意思是一樣的。
fcluster的這段代碼和fclusterdata的代碼相比,多了一些,不過,好處就是能設置更多的參數。
dendrogram的參數設置非常多,沒有完全搞明白,不過它會輸出一個字典,和一幅圖。字典里面有四個key,而圖則是樹形圖,如下:
不過,我覺得這個圖的用途不是很大,數據量一多,就什么都看不到了。
scipy里面關于層次聚類的函數還有不少,我也沒有搞懂,這里就不多說了。
總結
以上是生活随笔為你收集整理的python层次聚类_python实现层次聚类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linq from 多个sum_快手重拳
- 下一篇: Java多线程_1_Java内存模型_内