目錄
- K-Means類概述
- K-Means類主要參數
- MiniBatchKMeans類主要參數
- 其他接口
- K值的評估標准
在K-Means聚類算法原理中,我們對K-Means的原理做了總結,本文我們就來討論用scikit-learn來學習K-Means聚類。重點講述如何選擇合適的k值。
一、K-Means類概述
在scikit-learn中,包括兩個K-Means的算法,一個是傳統的K-Means算法,對應的類是KMeans。另一個是基於采樣的Mini Batch K-Means算法,對應的類是MiniBatchKMeans。一般來說,使用K-Means的算法調參是比較簡單的。
用KMeans類的話,一般要注意的僅僅就是k值的選擇,即參數n_clusters;如果是用MiniBatchKMeans的話,也僅僅多了需要注意調參的參數batch_size,即我們的Mini Batch的大小。
當然KMeans類和MiniBatchKMeans類可以選擇的參數還有不少,但是大多不需要怎么去調參。下面我們就看看KMeans類和MiniBatchKMeans類的一些主要參數。
二、K-Means類主要參數
KMeans類的主要參數有:
1) n_clusters: 即我們的k值,一般需要多試一些值以獲得較好的聚類效果。k值好壞的評估標准在下面會講。
2)max_iter: 最大的迭代次數,一般如果是凸數據集的話可以不管這個值,如果數據集不是凸的,可能很難收斂,此時可以指定最大的迭代次數讓算法可以及時退出循環。
3)n_init:用不同的初始化質心運行算法的次數。由於K-Means是結果受初始值影響的局部最優的迭代算法,因此需要多跑幾次以選擇一個較好的聚類效果,默認是10,一般不需要改。如果你的k值較大,則可以適當增大這個值。但是這種的還是基於隨機來選取的。下面的init從
4)init: 即初始值選擇的方式,可以為完全隨機選擇'random',優化過的'k-means++'(2007年論文"k-means++:The advantages of careful seeding",初始化方案使得初始質心彼此偏離,引導出比隨機更好得記過)或者自己指定初始化的k個質心。一般建議使用默認的'k-means++'。
5)algorithm:有"auto", "full" or "elkan"三種選擇。"full"就是我們傳統的K-Means算法, "elkan"是我們原理篇講的elkan K-Means算法。默認的"auto"則會根據數據值是否是稀疏的,來決定如何選擇"full"和"elkan"。一般數據是稠密的,那么就是 "elkan",否則就是"full"。一般來說建議直接用默認的"auto"
6)tol,默認為1e-4,表示兩次迭代inertia下降得量小於tol設定得值,迭代將停止。
三、MiniBatchKMeans類主要參數
MiniBatchKMeans類的主要參數比KMeans類稍多,主要有:
1) n_clusters: 即我們的k值,和KMeans類的n_clusters意義一樣。
2)max_iter:最大的迭代次數, 和KMeans類的max_iter意義一樣。
3)n_init:用不同的初始化質心運行算法的次數。這里和KMeans類意義稍有不同,KMeans類里的n_init是用同樣的訓練集數據來跑不同的初始化質心從而運行算法。而MiniBatchKMeans類的n_init則是每次用不一樣的采樣數據集來跑不同的初始化質心運行算法。
4)batch_size:即用來跑Mini Batch KMeans算法的采樣集的大小,默認是100.如果發現數據集的類別較多或者噪音點較多,需要增加這個值以達到較好的聚類效果。
5)init: 即初始值選擇的方式,和KMeans類的init意義一樣。
6)init_size: 用來做質心初始值候選的樣本個數,默認是batch_size的3倍,一般用默認值就可以了。
7)reassignment_ratio: 某個類別質心被重新賦值的最大次數比例,這個和max_iter一樣是為了控制算法運行時間的。這個比例是占樣本總數的比例,乘以樣本總數就得到了每個類別質心可以重新賦值的次數。如果取值較高的話算法收斂時間可能會增加,尤其是那些暫時擁有樣本數較少的質心。默認是0.01。如果數據量不是超大的話,比如1w以下,建議使用默認值。如果數據量超過1w,類別又比較多,可能需要適當減少這個比例值。具體要根據訓練集來決定。
8)max_no_improvement:即連續多少個Mini Batch沒有改善聚類效果的話,就停止算法, 和reassignment_ratio, max_iter一樣是為了控制算法運行時間的。默認是10.一般用默認值就足夠了。
四、其他接口
五、K值的評估標准
不像監督學習的分類問題和回歸問題,我們的無監督聚類沒有樣本輸出,也就沒有比較直接的聚類評估方法。但是我們可以從簇內的稠密程度和簇間的離散程度來評估聚類的效果。常見的方法有輪廓系數Silhouette Coefficient和Calinski-Harabasz Index。個人比較喜歡Calinski-Harabasz Index,這個計算簡單直接,得到的Calinski-Harabasz分數值s越大則聚類效果越好。
Calinski-Harabasz分數值s的數學計算公式是:
其中m為訓練集樣本數,k為類別數。Bk為類別之間的協方差矩陣,Wk為類別內部數據的協方差矩陣。tr為矩陣的跡。
也就是說,類別內部數據的協方差越小越好,類別之間的協方差越大越好,這樣的Calinski-Harabasz分數會高。在scikit-learn中, Calinski-Harabasz Index對應的方法是metrics.calinski_harabaz_score.
六,舉例
import numpy as np import os from matplotlib import pyplot as plt import wave from sklearn.cluster import KMeans,MiniBatchKMeans from sklearn.metrics import fowlkes_mallows_score,calinski_harabaz_score,silhouette_score for i in range(2,5): kmeans = MiniBatchKMeans(n_clusters= i, batch_size=10, random_state=33) # MiniBatchKMeans 加速優化 kmeans.fit(pcm_mfcc_audio) centres = kmeans.cluster_centers_ # 聚類中心 score_silhouette =silhouette_score(pcm_mfcc_audio,kmeans.labels_) silhouettescore.append(score_silhouette) print("第%d的時候,分類情況%s"% (i,kmeans.labels_)) score_calinski = calinski_harabaz_score(pcm_mfcc_audio, kmeans.labels_) #score_calinski越大越好 print("聚類%d簇的calinski_harabaz分數為:%f" % (i, score_calinski))