A. 建議收藏!10 種 python 聚類演算法完整操作示例
聚類或聚類分析是無監督學習問題。它通常被用作數據分析技術,用於發現數據中的有趣模式,例如基於其行為的客戶群。有許多聚類演算法可供選擇,對於所有情況,沒有單一的最佳聚類演算法。相反,最好探索一系列聚類演算法以及每種演算法的不同配置。在本教程中,你將發現如何在 python 中安裝和使用頂級聚類演算法。完成本教程後,你將知道:
聚類分析,即聚類,是一項無監督的機器學習任務。它包括自動發現數據中的自然分組。與監督學習(類似預測建模)不同,聚類演算法只解釋輸入數據,並在特徵空間中找到自然組或群集。
群集通常是特徵空間中的密度區域,其中來自域的示例(觀測或數據行)比其他群集更接近群集。群集可以具有作為樣本或點特徵空間的中心(質心),並且可以具有邊界或范圍。
聚類可以作為數據分析活動提供幫助,以便了解更多關於問題域的信息,即所謂的模式發現或知識發現。例如:
聚類還可用作特徵工程的類型,其中現有的和新的示例可被映射並標記為屬於數據中所標識的群集之一。雖然確實存在許多特定於群集的定量措施,但是對所識別的群集的評估是主觀的,並且可能需要領域專家。通常,聚類演算法在人工合成數據集上與預先定義的群集進行學術比較,預計演算法會發現這些群集。
有許多類型的聚類演算法。許多演算法在特徵空間中的示例之間使用相似度或距離度量,以發現密集的觀測區域。因此,在使用聚類演算法之前,擴展數據通常是良好的實踐。
一些聚類演算法要求您指定或猜測數據中要發現的群集的數量,而另一些演算法要求指定觀測之間的最小距離,其中示例可以被視為「關閉」或「連接」。因此,聚類分析是一個迭代過程,在該過程中,對所識別的群集的主觀評估被反饋回演算法配置的改變中,直到達到期望的或適當的結果。scikit-learn 庫提供了一套不同的聚類演算法供選擇。下面列出了10種比較流行的演算法:
每個演算法都提供了一種不同的方法來應對數據中發現自然組的挑戰。沒有最好的聚類演算法,也沒有簡單的方法來找到最好的演算法為您的數據沒有使用控制實驗。在本教程中,我們將回顧如何使用來自 scikit-learn 庫的這10個流行的聚類演算法中的每一個。這些示例將為您復制粘貼示例並在自己的數據上測試方法提供基礎。我們不會深入研究演算法如何工作的理論,也不會直接比較它們。讓我們深入研究一下。
在本節中,我們將回顧如何在 scikit-learn 中使用10個流行的聚類演算法。這包括一個擬合模型的例子和可視化結果的例子。這些示例用於將粘貼復制到您自己的項目中,並將方法應用於您自己的數據。
1.庫安裝
首先,讓我們安裝庫。不要跳過此步驟,因為你需要確保安裝了最新版本。你可以使用 pip Python 安裝程序安裝 scikit-learn 存儲庫,如下所示:
接下來,讓我們確認已經安裝了庫,並且您正在使用一個現代版本。運行以下腳本以輸出庫版本號。
運行該示例時,您應該看到以下版本號或更高版本。
2.聚類數據集
我們將使用 make _ classification ()函數創建一個測試二分類數據集。數據集將有1000個示例,每個類有兩個輸入要素和一個群集。這些群集在兩個維度上是可見的,因此我們可以用散點圖繪制數據,並通過指定的群集對圖中的點進行顏色繪制。這將有助於了解,至少在測試問題上,群集的識別能力如何。該測試問題中的群集基於多變數高斯,並非所有聚類演算法都能有效地識別這些類型的群集。因此,本教程中的結果不應用作比較一般方法的基礎。下面列出了創建和匯總合成聚類數據集的示例。
運行該示例將創建合成的聚類數據集,然後創建輸入數據的散點圖,其中點由類標簽(理想化的群集)著色。我們可以清楚地看到兩個不同的數據組在兩個維度,並希望一個自動的聚類演算法可以檢測這些分組。
已知聚類著色點的合成聚類數據集的散點圖接下來,我們可以開始查看應用於此數據集的聚類演算法的示例。我已經做了一些最小的嘗試來調整每個方法到數據集。3.親和力傳播親和力傳播包括找到一組最能概括數據的範例。
它是通過 AffinityPropagation 類實現的,要調整的主要配置是將「 阻尼 」設置為0.5到1,甚至可能是「首選項」。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我無法取得良好的結果。
數據集的散點圖,具有使用親和力傳播識別的聚類
4.聚合聚類
聚合聚類涉及合並示例,直到達到所需的群集數量為止。它是層次聚類方法的更廣泛類的一部分,通過 AgglomerationClustering 類實現的,主要配置是「 n _ clusters 」集,這是對數據中的群集數量的估計,例如2。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個合理的分組。
使用聚集聚類識別出具有聚類的數據集的散點圖
5.BIRCHBIRCH
聚類( BIRCH 是平衡迭代減少的縮寫,聚類使用層次結構)包括構造一個樹狀結構,從中提取聚類質心。
它是通過 Birch 類實現的,主要配置是「 threshold 」和「 n _ clusters 」超參數,後者提供了群集數量的估計。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個很好的分組。
使用BIRCH聚類確定具有聚類的數據集的散點圖
6.DBSCANDBSCAN
聚類(其中 DBSCAN 是基於密度的空間聚類的雜訊應用程序)涉及在域中尋找高密度區域,並將其周圍的特徵空間區域擴展為群集。
它是通過 DBSCAN 類實現的,主要配置是「 eps 」和「 min _ samples 」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,盡管需要更多的調整,但是找到了合理的分組。
使用DBSCAN集群識別出具有集群的數據集的散點圖
7.K均值
K-均值聚類可以是最常見的聚類演算法,並涉及向群集分配示例,以盡量減少每個群集內的方差。
它是通過 K-均值類實現的,要優化的主要配置是「 n _ clusters 」超參數設置為數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個合理的分組,盡管每個維度中的不等等方差使得該方法不太適合該數據集。
使用K均值聚類識別出具有聚類的數據集的散點圖
8.Mini-Batch
K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的樣本而不是整個數據集對群集質心進行更新,這可以使大數據集的更新速度更快,並且可能對統計雜訊更健壯。
它是通過 MiniBatchKMeans 類實現的,要優化的主配置是「 n _ clusters 」超參數,設置為數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,會找到與標准 K-均值演算法相當的結果。
帶有最小批次K均值聚類的聚類數據集的散點圖
9.均值漂移聚類
均值漂移聚類涉及到根據特徵空間中的實例密度來尋找和調整質心。
它是通過 MeanShift 類實現的,主要配置是「帶寬」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以在數據中找到一組合理的群集。
具有均值漂移聚類的聚類數據集散點圖
10.OPTICSOPTICS
聚類( OPTICS 短於訂購點數以標識聚類結構)是上述 DBSCAN 的修改版本。
它是通過 OPTICS 類實現的,主要配置是「 eps 」和「 min _ samples 」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我無法在此數據集上獲得合理的結果。
使用OPTICS聚類確定具有聚類的數據集的散點圖
11.光譜聚類
光譜聚類是一類通用的聚類方法,取自線性線性代數。
它是通過 Spectral 聚類類實現的,而主要的 Spectral 聚類是一個由聚類方法組成的通用類,取自線性線性代數。要優化的是「 n _ clusters 」超參數,用於指定數據中的估計群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,找到了合理的集群。
使用光譜聚類聚類識別出具有聚類的數據集的散點圖
12.高斯混合模型
高斯混合模型總結了一個多變數概率密度函數,顧名思義就是混合了高斯概率分布。它是通過 Gaussian Mixture 類實現的,要優化的主要配置是「 n _ clusters 」超參數,用於指定數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我們可以看到群集被完美地識別。這並不奇怪,因為數據集是作為 Gaussian 的混合生成的。
使用高斯混合聚類識別出具有聚類的數據集的散點圖
在本文中,你發現了如何在 python 中安裝和使用頂級聚類演算法。具體來說,你學到了:
B. meanshift演算法怎樣解釋
meanShift,均值漂移,在聚類、圖像平滑、分割、跟蹤等方面有著廣泛的應用。meanShift這個概念最早是由Fukunage在1975年提出的,其最初的含義正如其名:偏移的均值向量;但隨著理論的發展,meanShift的含義已經發生了很多變化。如今,我們說的meanShift演算法,一般是指一個迭代的步驟,即先算出當前點的偏移均值,然後以此為新的起始點,繼續移動,直到滿足一定的結束條件。
C. kmean演算法是干什麼的
聚類分析是一種靜態數據分析方法,常被用於機器學習,模式識別,數據挖掘等領域。通常認為,聚類是一種無監督式的機器學習方法,它的過程是這樣的:在未知樣本類別的情況下,通過計算樣本彼此間的距離(歐式距離,馬式距離,漢明距離,餘弦距離等)來估計樣本所屬類別。從結構性來劃分,聚類方法分為自上而下和自下而上兩種方法,前者的演算法是先把所有樣本視為一類,然後不斷從這個大類中分離出小類,直到不能再分為止;後者則相反,首先所有樣本自成一類,然後不斷兩兩合並,直到最終形成幾個大類。
常用的聚類方法主要有以下四種: //照搬的wiki,比較懶...
Connectivity based clustering(如hierarchical clustering 層次聚類法)
Centroid-based clustering(如kmeans)
Distribution-based clustering
Density-based clustering
Kmeans聚類是一種自下而上的聚類方法,它的優點是簡單、速度快;缺點是聚類結果與初始中心的選擇有關系,且必須提供聚類的數目。Kmeans的第二個缺點是致命的,因為在有些時候,我們不知道樣本集將要聚成多少個類別,這種時候kmeans是不適合的,推薦使用hierarchical 或meanshift來聚類。第一個缺點可以通過多次聚類取最佳結果來解決。
Kmeans的計算過程大概表示如下
隨機選擇k個聚類中心. 最終的類別個數<= k
計算每個樣本到各個中心的距離
每個樣本聚類到離它最近的中心
重新計算每個新類的中心
重復以上步驟直到滿足收斂要求。(通常就是中心點不再改變或滿足一定迭代次數).
D. 常用聚類(K-means,DBSCAN)以及聚類的度量指標:
一年前需要用聚類演算法時,自己從一些sklearn文檔和博客粗略整理了一些相關的知識,記錄在電子筆記里備忘,現在發到網上,當時就整理的就很亂,以後有空慢慢把內容整理、完善,用作備忘。之前把電影標簽信息的聚類結果作為隱式反饋放進SVD++中去訓練,裡面有兩個小例子
利用條件熵定義的同質性度量:
sklearn.metrics.homogeneity_score:每一個聚出的類僅包含一個類別的程度度量。
sklearn.metrics.completeness:每一個類別被指向相同聚出的類的程度度量。
sklearn.metrics.v_measure_score:上面兩者的一種折衷:
v = 2 * (homogeneity * completeness) / (homogeneity + completeness)
可以作為聚類結果的一種度量。
sklearn.metrics.adjusted_rand_score:調整的蘭德系數。
ARI取值范圍為[-1,1],從廣義的角度來講,ARI衡量的是兩個數據分布的吻合程度
sklearn.metrics.adjusted_mutual_info_score:調整的互信息。
利用基於互信息的方法來衡量聚類效果需要實際類別信息,MI與NMI取值范圍為[0,1],AMI取值范圍為[-1,1]。
在scikit-learn中, Calinski-Harabasz Index對應的方法是metrics.calinski_harabaz_score.
CH指標通過計算類中各點與類中心的距離平方和來度量類內的緊密度,通過計算各類中心點與數據集中心點距離平方和來度量數據集的分離度,CH指標由分離度與緊密度的比值得到。從而,CH越大代表著類自身越緊密,類與類之間越分散,即更優的聚類結果。
silhouette_sample
對於一個樣本點(b - a)/max(a, b)
a平均類內距離,b樣本點到與其最近的非此類的距離。
silihouette_score返回的是所有樣本的該值,取值范圍為[-1,1]。
這些度量均是越大越好
K-means演算法應該算是最常見的聚類演算法,該演算法的目的是選擇出質心,使得各個聚類內部的inertia值最小化,計算方法如下:
inertia可以被認為是類內聚合度的一種度量方式,這種度量方式的主要缺點是:
(1)inertia假設數據內的聚類都是凸的並且各向同性( convex and isotropic),
各項同性是指在數據的屬性在不同方向上是相同的。數據並不是總能夠滿足這些前提假設的,
所以當數據事細長簇的聚類,或者不規則形狀的流形時,K-means演算法的效果不理想。
(2)inertia不是一種歸一化度量方式。一般來說,inertia值越小,說明聚類效果越好。
但是在高維空間中,歐式距離的值可能會呈現迅速增長的趨勢,所以在進行K-means之前首先進行降維操作,如PCA等,可以解決高維空間中inertia快速增長的問題,也有主意提高計算速度。
K-means演算法可以在足夠長的時間內收斂,但有可能收斂到一個局部最小值。
聚類的結果高度依賴質心的初始化,因此在計算過程中,採取的措施是進行不止一次的聚類,每次都初始化不同的質心。
sklearn中可以通過設置參數init='kmeans++'來採取k-means++初始化方案,
即初始化的質心相互之間距離很遠,這種方式相比於隨機初始質心,能夠取得更好的效果。
另外,sklearn中可以通過參數n_job,使得K-means採用並行計算的方式。
##sklearn 中K-means的主要參數:
1) n_clusters: 設定的k值
2)max_iter: 最大的迭代次數,一般如果是凸數據集的話可以不管這個值,如果數據集不是凸的,可能很難收斂,此時可以指定最大的迭代次數讓演算法可以及時退出循環。
3)n_init:用不同的初始化質心運行演算法的次數。由於K-Means是結果受初始值影響的局部最優的迭代演算法,因此需要多跑幾次以選擇一個較好的聚類效果,默認是10。如果你的k值較大,則可以適當增大這個值。
4)init: 即初始值選擇的方式,可以為完全隨機選擇'random',優化過的'k-means++'或者自己指定初始化的k個質心。一般建議使用默認的'k-means++'。
5)algorithm:有「auto」, 「full」 or 「elkan」三種選擇。"full"就是我們傳統的K-Means演算法, 「elkan」elkan K-Means演算法。默認的"auto"則會根據數據值是否是稀疏的,來決定如何選擇"full"和「elkan」。一般來說建議直接用默認的"auto"
聚類的中心
print clf.cluster_centers_
每個樣本所屬的簇
print clf.labels_
用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
print clf.inertia_
Sum of distances of samples to their closest cluster center.
兩個小例子(很久以前弄的,寫得比較簡略比較亂,有空再改,數據是movielen中的電影標簽信息):
例1:
例2,在區間[2,200]上遍歷k,並生成兩個聚類內部評價指標CH分、輪廓系數以及kmeans自帶inertia分和對應的k值的圖片來選擇k:
其中兩點相似度s(i, j)的度量默認採用負歐氏距離。
sklearn.cluster.AffinityPropagation
有參數preference(設定每一個點的偏好,將偏好於跟其他節點的相似性進行比較,選擇
高的作為exmplar,未設定則使用所有相似性的中位數)、damping (阻尼系數,
利用阻尼系數與1-阻尼系數對r 及 a進行有關迭代步數的凸組合,使得演算法收斂
default 0.5 可以取值與[0.5, 1])
cluster_centers_indices_:中心樣本的指標。
AP演算法的主要思想是通過數據點兩兩之間傳遞的信息進行聚類。
該演算法的主要優點是能夠自主計算聚類的數目,而不用人為制定類的數目。
其缺點是計算復雜度較大 ,計算時間長同時空間復雜度大,
因此該演算法適合對數據量不大的問題進行聚類分析。
數據點之間傳遞的信息包括兩個,吸引度(responsibility)r(i,k)和歸屬度(availability)a(i,k)。
吸引度r(i,k)度量的是質心k應當作為點i的質心的程度,
歸屬度a(i,k)度量的是點i應當選擇質心k作為其質心的程度。
其中t是迭代的次數,λ是阻尼因子,其值介於[0,1],在sklearn.cluster.AffinityPropagation中通過參數damping進行設置。
每次更新完矩陣後,就可以為每個數據點分配質心,分配方式?是針對數據點i,遍歷所有數據點k(包括其自身),
找到一個k使得r(i,k)+a(i,k)的值最大,則點k就是點i所屬的質心,迭代這個過程直至收斂。
所謂收斂就是所有點所屬的質心不再變化
首先說明不引入核函數時的情況。
演算法大致流程為:隨機選取一個點作為球心,以一定半徑畫一個高維球(數據可能是高維的),
在這個球范圍內的點都是這個球心的鄰居。這些鄰居相對於球心都存在一個偏移向量,
將這些向量相加求和再平均,就得到一個mean shift,起點在原球心,重點在球內的其他位置。
以mean shift的重點作為新的球心,重復上述過程直至收斂。
這個計算過程中,高維球內的點,無論其距離球心距離多遠,對於mean shift的計算權重是一樣的。
為了改善這種情況,在迭代計算mean shift的過程中引入了核函數
sklearn中相關實現是sklearn.cluster.MeanShift。
sklearn中實現的是自底向上的層次聚類,實現方法是sklearn.cluster.AgglomerativeClustering。
初始時,所有點各自單獨成為一類,然後採取某種度量方法將相近的類進行合並,並且度量方法有多種選擇。
合並的過程可以構成一個樹結構,其根節點就是所有數據的集合,葉子節點就是各條單一數據。
sklearn.cluster.AgglomerativeClustering中可以通過參數linkage選擇不同的度量方法,用來度量兩個類之間的距離,
可選參數有ward,complete,average三個。
ward:選擇這樣的兩個類進行合並,合並後的類的離差平方和最小。
complete:兩個類的聚類被定義為類內數據的最大距離,即分屬兩個類的距離最遠的兩個點的距離。
選擇兩個類進行合並時,從現有的類中找到兩個類使得這個值最小,就合並這兩個類。
average:兩個類內數據兩兩之間距離的平均值作為兩個類的距離。
同樣的,從現有的類中找到兩個類使得這個值最小,就合並這兩個類。
Agglomerative cluster有一個缺點,就是rich get richer現象,
這可能導致聚類結果得到的類的大小不均衡。
從這個角度考慮,complete策略效果最差,ward得到的類的大小最為均衡。
但是在ward策略下,affinity參數只能是「euclidean」,即歐式距離。
如果在歐氏距離不適用的環境中,average is a good alternative。
另外還應該注意參數affinity,這個參數設置的是計算兩個點之間距離時採用的策略,
注意和參數linkage區分,linkage設置的是衡量兩個類之間距離時採用的策略,
而點之間的距離衡量是類之間距離衡量的基礎。
affinity的可選數值包括 「euclidean」, 「l1」, 「l2」, 「manhattan」, 「cosine」,
『precomputed』. If linkage is 「ward」, only 「euclidean」 is accepted.
DBSCAN演算法的主要思想是,認為密度稠密的區域是一個聚類,各個聚類是被密度稀疏的區域劃分開來的。
也就是說,密度稀疏的區域構成了各個聚類之間的劃分界限。與K-means等演算法相比,該演算法的主要優點包括:可以自主計算聚類的數目,不需要認為指定;不要求類的形狀是凸的,可以是任意形狀的。
DBSCAN中包含的幾個關鍵概念包括core sample,non-core sample,min_sample,eps。
core samle是指,在該數據點周圍eps范圍內,至少包含min_sample個其他數據點,則該點是core sample,
這些數據點稱為core sample的鄰居。與之對應的,non-sample是該點周圍eps范圍內,所包含的數據點個數少於min_sample個。從定義可知,core sample是位於密度稠密區域的點。
一個聚類就是一個core sample的集合,這個集合的構建過程是一個遞歸的構成。
首先,找到任意個core sample,然後從它的鄰居中找到core sample,
接著遞歸的從這些鄰居中的core sample的鄰居中繼續找core sample。
要注意core sample的鄰居中不僅有其他core sample,也有一些non-core smaple,
也正是因為這個原因,聚類集合中也包含少量的non-core sample,它們是聚類中core sample的鄰居,
但自己不是core sample。這些non-core sample構成了邊界。
在確定了如何通過單一core sample找到了一個聚類後,下面描述DBSCAN演算法的整個流程。
首先,掃描數據集找到任意一個core sample,以此core sample為起點,按照上一段描述的方法進行擴充,確定一個聚類。然後,再次掃描數據集,找到任意一個不屬於以確定類別的core sample,重復擴充過程,再次確定一個聚類。
迭代這個過程,直至數據集中不再包含有core sample。
這也是為什麼DBSCAN不用認為指定聚類數目的原因。
DBSCAN演算法包含一定的非確定性。數據中的core sample總是會被分配到相同的聚類中的,哪怕在統一數據集上多次運行DBSCAN。其不確定性主要體現在non-core sample的分配上。
一個non-core sample可能同時是兩個core sample的鄰居,而這兩個core sample隸屬於不同的聚類。
DBSCAN中,這個non-core sample會被分配給首先生成的那個聚類,而哪個聚類先生成是隨機的。
sklearn中DBSCAN的實現中,鄰居的確定使用的ball tree和kd-tree思想,這就避免了計算距離矩陣。