1. 程式人生 > >使用Python進行層次聚類(一)——基本使用+主成分分析繪圖觀察結果+繪製熱圖

使用Python進行層次聚類(一)——基本使用+主成分分析繪圖觀察結果+繪製熱圖

Python常用資料探勘的工具包

python對於資料處理非常有好的語言,比如常用的scikit-learnscipy都可以用來進行機器學習和資料探勘。同時為了使得結果視覺化,Python還提供了非常好用的視覺化工具包matplotlibseaborn

使用Python進行層次聚類

聚類對於機器學習和資料探勘來說都是一個非常常用的的工具。其中層次聚類又以其顯示效果和可解釋效果好而在資料處理中非常常用,那是其缺點就是所需的
時間複雜度———

O(m2logm)和空間複雜度———O(m2)比較高,但是對於少量資料來說無疑是最好的選擇。

我們首先用excle的隨機函式RAND()

生成一個隨機資料列表,進行測試,取名為test.xlsx,表格內容如下圖所示:

糟糕:圖片顯示失敗,請通知我,非常感謝!

然後就可以開始寫程式碼了,首先需要匯入要用到的包:

import pandas as pd
import seaborn as sns  #用於繪製熱圖的工具包
from scipy.cluster import hierarchy  #用於進行層次聚類,話層次聚類圖的工具包
from scipy import cluster   
import matplotlib.pyplot as plt
from sklearn import decomposition as skldec #用於主成分分析降維的包

1. 使用pandas裡面的檔案讀取函式進行

pandas工具包是Python語言中專門進行資料結構化儲存和資料分析的工具包,很多其他包都以pandas的結構化資料作為其函式的輸入,因此資料處理的第一步大多使用pandas進行資料結構化儲存,關於excel檔案,pandas就要專門的讀取函式read_excel,根據函式的說明文件,我們寫下如下讀取檔案的程式碼

df = pd.read_excel("test.xlsx")
#df = df.T    #python預設每行是一個樣本,如果資料每列是一個樣本的話,轉置一下即可

這樣裡需要注意,後面使用各種Python的資料探勘或者機器學習演算法包時,預設每一行代表一個樣本,
我生成的excel測試資料滿足這個要求,因此不用改變,如果你讀取的excel資料每一列是一個數據的話
需要先將資料轉置一下,才能進行後面的操作

2. 繪製層次聚類圖

讀取資料後,我們就可以進行層次聚類圖的繪製了,首先進入scipy參考文件頁面,然後找到聚類包Clustering package (scipy.cluster)->層次聚類scipy.cluster.hierarchy,在當前頁面下,就可以看到所有層次聚類相關的函數了,我們找到可以畫圖的函式dendrogram,進入該函式的文件頁面,發現該函式需要傳入的第一個引數是linkage矩陣,這個矩陣需要函式linkage,進入該函式的文件頁面我們看到linkage的說明文件上面的函式scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False),傳入第一個引數是需要進行層次聚類的資料,這裡即可用使用開始讀取的資料變數df,第二個引數代表層次聚類選用的方法,底下羅列了七種方法,比如:

  • single方法代表將兩個組合資料點中距離最近的兩個資料點間的距離作為這兩個組合資料點的距離。這種方法容易受到極端值的影響。
    兩個很相似的組合資料點可能由於其中的某個極端的資料點距離較近而組合在一起。
    即兩個簇之間的距離使用公式:d(u,v)=min(dist(u[i],v[j])) 計算。
  • complete方法代表與Single Linkage相反,將兩個組合資料點中距離最遠的兩個資料點間的距離作為這兩個組合資料點的距離。
    Complete Linkage的問題也與Single Linkage相反,兩個不相似的組合資料點可能由於其中的極端值距離較遠而無法組合在一起。
    即兩個簇之間的距離使用公式:d(u,v)=max(dist(u[i],v[j])) 計算。
  • average方法代表是計算兩個組合資料點中的每個資料點與其他所有資料點的距離。將所有距離的均值作為兩個組合資料點間的距離。這種方法計算量比較大,但結果比前兩種方法更合理。
    即兩個簇之間的距離使用公式:d(u,v)=ijd(u[i],v[j])(|u||v|) 計算。
  • weighted 即兩個簇之間的距離使用公式:d(u,v)=(dist(s,v)+dist(t,v))/2 計算。
  • centroid 即兩個簇之間的距離使用公式:dist(s,t)=csct2 計算。
  • mediancentroid
  • ward 即兩個簇之間的距離使用公式:d(u,v)=|v|+|s|Td(v,s)2+|v|+|t|Td(v,t)2|v|Td(s,t)2 計算。

第三個引數代表距離計算的方法,即上面方法中的dist()函式具體的計算方式,具體方式可以見這個頁面
然後這裡我隨便選擇兩個,然後將返回的結果Z傳入dendrogram函式,程式碼如下:

Z = hierarchy.linkage(df, method ='ward',metric='euclidean')
hierarchy.dendrogram(Z,labels = df.index)

執行程式,即可得到層次聚類圖如下:
糟糕:圖片顯示失敗,請通知我,非常感謝!

根據上圖,我們即可看到在不同的位置裁剪即可得到不同的聚類數目。但是我們具體要聚集多少類呢?
我們先寫上裁剪的程式碼:

label = cluster.hierarchy.cut_tree(Z,height=0.8)
label = label.reshape(label.size,)

上面程式碼中的高度我取的是0.8,根據層次聚類圖明顯是聚成三類,為啥我要這樣取值呢?下一小節給出答案。

3. 繪製兩個主成分方向座標的散點圖

為了將聚類結果視覺化,我們需要降維,因為在大多數情況下,我們處理資料的維度超過三維,因此可以使用主成分分析法,找到佔據方差最大的兩個維度的散點得到,然後進行繪圖,來觀察結果。
由於我沒有在scipy裡面找到主成分分析的相關函式,因此就在scikit-learn包裡找相關函式,發現裡面有主成分分析的函式PCA,進入該函式的說明文件,我們可以進行相關操作和繪圖,程式碼如下:

#根據兩個最大的主成分進行繪圖
pca = skldec.PCA(n_components = 0.95)    #選擇方差95%的佔比
pca.fit(df)   #主城分析時每一行是一個輸入資料
result = pca.transform(df)  #計算結果
plt.figure()  #新建一張圖進行繪製
plt.scatter(result[:, 0], result[:, 1], c=label, edgecolor='k') #繪製兩個主成分組成座標的散點圖
for i in range(result[:,0].size):
    plt.text(result[i,0],result[i,1],df.index[i])     #在每個點邊上繪製資料名稱
x_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[0]*100.0),2)   #x軸標籤字串
y_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[1]*100.0),2)   #y軸標籤字串
plt.xlabel(x_label)    #繪製x軸標籤
plt.ylabel(y_label)    #繪製y軸標籤

執行程式碼,得到下圖:
糟糕:圖片顯示失敗,請通知我,非常感謝!

根據改圖,我們可以看到大致分為三類比較合理,因此上一小節層次聚類裁剪的高度取了一個可以裁剪得到三類的高度0.8

4. 繪製熱圖

熱圖的繪製非常簡單,因為seaborn的工具包非常強大,我們使用clustermap函式即可,該函式的說明文件
中有詳細介紹,僅需一行程式碼,即可搞定,程式碼如下:

sns.clustermap(df,method ='ward',metric='euclidean')

執行程式碼,得到下圖:
糟糕:圖片顯示失敗,請通知我,非常感謝!

最後,本篇的全部程式碼在下面這個網頁可以下載:

相關推薦

使用Python進行層次——基本使用+成分分析繪圖觀察結果+繪製

Python常用資料探勘的工具包 python對於資料處理非常有好的語言,比如常用的scikit-learn和scipy都可以用來進行機器學習和資料探勘。同時為了使得結果視覺化,Python還提供了非常好用的視覺化工具包matplotlib和seaborn。

使用Python進行層次——層次簇間自然分割方法和評價方法

簇間自然分割方法 今天,主要研究一下層次聚類在進行資料運算的時候,對資料結果進行自然簇分離而需要分析的API————inconsistent()。該函式是計算層次聚類不一致係數的,不一致係數越大,表明使用該閾值進行聚類的偏差越大。這樣按照該不一致係數下的閾值進

使用Python進行層次——scipy中層次的自定義距離度量問題

今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量 層次聚類上次已經總結過。 這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。 我們進入該函式的文件頁面我們看到linkage的說明文件上面的函式scipy.cluster.hiera

原型k均值演算法和python實現

原型聚類 原型聚類演算法假設聚類結構能通過一組原型刻畫,在現實聚類任務中極為常用。通常情形下,演算法先對原型進行初始化,然後對原型進行迭代更新求解。這裡的“原型”我認為實際上就是“原來的模型”,這類演算法企圖模擬出生成資料集的模型。 k均值演算法(k-means

Python面向物件和

面向物件程式設計 Ojbect-Oriented Programing  什麼是物件:     物件是指現實中的物體過實體  物件有什麼特徵:     物件有很多屬性(名詞,形容詞)      

呼叫WEKA包進行kmeansjava

所用資料檔案:data1.txt @RELATION data1 @ATTRIBUTE one REAL @ATTRIBUTE two REAL @DATA 0.184000 0.482000 0.152000 0.540000 0.152000 0.5960

C語言學習重點總結基本資料型別分析

一.資料型別的含義: 1.資料型別可以理解為固定大小的別名; 2.資料型別是建立變數的模子; 二.變數的本質: 1.變數是一段實際連續儲存空間的別名; 2.程式中通過變數來申請並命名儲存空間; 3.通過關鍵字可以使用儲存空間; 例項分析: 步驟:

Pipline流水線成分分析

Pipline(流水線),這個模型的理論基礎是聯結主義,從工程實現的角度來講,我們首先呼叫spectral embedding 對訓練資料做特徵提取,再呼叫K-means完成最後的模型預算,這是pipeline的實際理念。 一個piipeline有n個模型順序組成,其中前n-1個模型被稱為Trans

機器學習十四——協同過濾的ALS演算法2成分分析

Kendall秩相關係數(Kendall rank correlation coefficient) 對於秩變數對(xi,yi),(xj,yj): (xi−xj)(yi−yj)⎧⎩⎨>0,=0,<0,concordantneither con

機器學習成分分析PCA降維_Python

六、PCA主成分分析(降維) 1、用處 資料壓縮(Data Compression),使程式執行更快 視覺化資料,例如3D-->2D等 …… 2、2D–>1D,nD–&

奇異值分解SVD成分分析PCA

設X是一個n*m的資料矩陣(在此不把它理解成變換),每一列表示一個數據點,每一行表示一維特徵。 對X做主成分分析(PCA)的時候,需要求出各維特徵的協方差,這個協方差矩陣是。 (其實需要先把資料平移使得資料的均值為0,不過在此忽略這些細節) PCA做的事情,是對這個協方差矩陣做對角化: 可以這樣理解上式右邊

機器學習回顧篇14成分分析PCA

  1 引言¶ 在展開資料分析工作時,我們經常會面臨兩種困境,一種是原始資料中特徵屬性太少,“巧婦難為無米之炊”,很難挖掘出潛在的規律,對於這種情況,我們只能在收集這一環節上多下功夫;另一種困境剛好相反,那就是特徵

python——

1〉首先,怎麼寫一個類,用個例子 class Student(object): def __init__(self,name,score,gender): self.__name=name self.__score=score self.__

層次Hierarchical Clustering

1、 層次聚類演算法概述 層次聚類演算法通過將資料組織成若干組並形成一個相應的樹狀圖來進行聚類, 它又可以分為兩類, 即自底向上的聚合層次聚類和自頂向下的分解層次聚類。聚合聚類的策略是先將每個物件各自作為一個原子聚類, 然後對這些原子聚類逐層進行聚合, 直至滿足一定的終止條件;後者則與前

原型學習向量量化LVQpython實現

學習向量量化(Learning Vector Quantization,LVQ)和k-means類似,也屬於原型聚類的一種演算法,不同的是,LVQ處理的是有標籤的樣本集,學習過程利用樣本的標籤進行輔助聚類,個人感覺這個演算法更像是一個分類演算法。。。 若存在一個

python——k-means餘弦距離,用輪廓係數確定係數K

    用scikit-learn進行k-means聚類,預設使用歐式距離,為了用餘弦距離作為度量,找了一個在生物資訊學裡比較常用的庫:Biopython。Biopython為k-means聚類提供了各種距離函式,包括餘弦距離、皮爾遜相似度量、歐式距離等。    另外,為了確

Python篇----面向物件程式設計和物件篇

1 概述     簡稱:OOP(Oriented Object Programming)。這是一種以構建物件,程式設計實現為方向的語言。現實世界中,許多問題過於複雜,需要拆分,所以用不同的物件代替各

系列-層次Hierarchical Clustering

    上篇k-means演算法卻是一種方便好用的聚類演算法,但是始終有K值選擇和初始聚類中心點選擇的問題,而這些問題也會影響聚類的效果。為了避免這些問題,我們可以選擇另外一種比較實用的聚類演算法-層次聚類演算法。顧名思義,層次聚類就是一層一層的進行聚類,可以由上向下把大的

機器學習sklearn19.0演算法——層次AGNES/DIANA、密度(DBSCAN/MDCA)、譜

一、層次聚類 BIRCH演算法詳細介紹以及sklearn中的應用如下面部落格連結: http://www.cnblogs.com/pinard/p/6179132.html http://www.cnblogs.com/pinard/p/62

“笨辦法學python”學習筆記-在終端powershell中對目錄進行簡單的編輯

1.new-item -path c:/ -name 新建資料夾或檔案的名字 -type directory 意思是在C盤新建一個資料夾 new-item: 新建專案 -path:指定路徑 -name:檔案或資料夾的名字 -type directory:型別目錄,也就是資料夾,