在譜聚類(spectral clustering)原理總結中,咱們對譜聚類的原理作了總結。這裏咱們就對scikit-learn中譜聚類的使用作一個總結。html
在scikit-learn的類庫中,sklearn.cluster.SpectralClustering實現了基於Ncut的譜聚類,沒有實現基於RatioCut的切圖聚類。同時,對於類似矩陣的創建,也只是實現了基於K鄰近法和全鏈接法的方式,沒有基於\(\epsilon\)-鄰近法的類似矩陣。最後一步的聚類方法則提供了兩種,K-Means算法和 discretize算法。python
對於SpectralClustering的參數,咱們主要須要調參的是類似矩陣創建相關的參數和聚類類別數目,它對聚類的結果有很大的影響。固然其餘的一些參數也須要理解,在必要時須要修改默認參數。git
下面咱們就對SpectralClustering的重要參數作一個介紹,對於調參的注意事項會一塊兒介紹。github
1)n_clusters:表明咱們在對譜聚類切圖時降維到的維數(原理篇第7節的\(k_1\)),同時也是最後一步聚類算法聚類到的維數(原理篇第7節的\(k_2\))。也就是說scikit-learn中的譜聚類對這兩個參數統一到了一塊兒。簡化了調參的參數個數。雖然這個值是可選的,可是通常仍是推薦調參選擇最優參數。算法
2) affinity: 也就是咱們的類似矩陣的創建方式。能夠選擇的方式有三類,第一類是 'nearest_neighbors'即K鄰近法。第二類是'precomputed'即自定義類似矩陣。選擇自定義類似矩陣時,須要本身調用set_params來本身設置類似矩陣。第三類是全鏈接法,能夠使用各類核函數來定義類似矩陣,還能夠自定義核函數。最經常使用的是內置高斯核函數'rbf'。其餘比較流行的核函數有‘linear’即線性核函數, ‘poly’即多項式核函數, ‘sigmoid’即sigmoid核函數。若是選擇了這些核函數, 對應的核函數參數在後面有單獨的參數須要調。自定義核函數我沒有使用過,這裏就很少講了。affinity默認是高斯核'rbf'。通常來講,類似矩陣推薦使用默認的高斯核函數。微信
3) 核函數參數gamma: 若是咱們在affinity參數使用了多項式核函數 'poly',高斯核函數‘rbf’, 或者'sigmoid'核函數,那麼咱們就須要對這個參數進行調參。dom
多項式核函數中這個參數對應\(K(x, z) = (\gamma x \bullet z + r)^d\)中的\(\gamma\)。通常須要經過交叉驗證選擇一組合適的\(\gamma, r, d\)函數
高斯核函數中這個參數對應\(K(x, z) = exp(-\gamma||x-z||^2)\)中的\(\gamma\)。通常須要經過交叉驗證選擇合適的\(\gamma\)工具
sigmoid核函數中這個參數對應\(K(x, z) = tanh(\gamma x \bullet z + r)\)中的\(\gamma\)。通常須要經過交叉驗證選擇一組合適的\(\gamma, r\)post
\(\gamma\)默認值爲1.0,若是咱們affinity使用'nearest_neighbors'或者是'precomputed',則這麼參數無心義。
4)核函數參數degree:若是咱們在affinity參數使用了多項式核函數 'poly',那麼咱們就須要對這個參數進行調參。這個參數對應\(K(x, z) = (\gamma x \bullet z + r)^d\)中的\(d\)。默認是3。通常須要經過交叉驗證選擇一組合適的\(\gamma, r, d\)
5)核函數參數coef0: 若是咱們在affinity參數使用了多項式核函數 'poly',或者sigmoid核函數,那麼咱們就須要對這個參數進行調參。
多項式核函數中這個參數對應\(K(x, z) = (\gamma x \bullet z + r)^d\)中的\(r\)。通常須要經過交叉驗證選擇一組合適的\(\gamma, r, d\)
sigmoid核函數中這個參數對應\(K(x, z) = tanh(\gamma x \bullet z + r)\)中的\(r\)。通常須要經過交叉驗證選擇一組合適的\(\gamma, r\)
coef0默認爲1.
6)kernel_params:若是affinity參數使用了自定義的核函數,則須要經過這個參數傳入核函數的參數。
****7 )n_neighbors: 若是咱們affinity參數指定爲'nearest_neighbors'即K鄰近法,則咱們能夠經過這個參數指定KNN算法的K的個數。默認是10.咱們須要根據樣本的分佈對這個參數進行調參。若是咱們affinity不使用'nearest_neighbors',則無需理會這個參數。
8)eigen_solver:1在降維計算特徵值特徵向量的時候,使用的工具。有 None, ‘arpack’, ‘lobpcg’, 和‘amg’4種選擇。若是咱們的樣本數不是特別大,無需理會這個參數,使用''None暴力矩陣特徵分解便可,若是樣本量太大,則須要使用後面的一些矩陣工具來加速矩陣特徵分解。它對算法的聚類效果無影響。
9)eigen_tol:若是eigen_solver使用了arpack’,則須要經過eigen_tol指定矩陣分解中止條件。
10)assign_labels:即最後的聚類方法的選擇,有K-Means算法和 discretize算法兩種算法能夠選擇。通常來講,默認的K-Means算法聚類效果更好。可是因爲K-Means算法結果受初始值選擇的影響,可能每次都不一樣,若是咱們須要算法結果能夠重現,則能夠使用discretize。
11)n_init:即便用K-Means時用不一樣的初始值組合跑K-Means聚類的次數,這個和K-Means類裏面n_init的意義徹底相同,默認是10,通常使用默認值就能夠。若是你的n_clusters值較大,則能夠適當增大這個值。
從上面的介紹能夠看出,須要調參的部分除了最後的類別數n_clusters,主要是類似矩陣affinity的選擇,以及對應的類似矩陣參數。當我選定一個類似矩陣構建方法後,調參的過程就是對應的參數交叉選擇的過程。對於K鄰近法,須要對n_neighbors進行調參,對於全鏈接法裏面最經常使用的高斯核函數rbf,則須要對gamma進行調參。
這裏咱們用一個例子講述下SpectralClustering的聚類。咱們選擇最經常使用的高斯核來創建類似矩陣,用K-Means來作最後的聚類。
完整代碼參見個人github: https://github.com/nickchen121/machinelearning/blob/master/classic-machine-learning/spectral_cluster.ipynb
首先咱們生成500個個6維的數據集,分爲5個簇。因爲是6維,這裏就不可視化了,代碼以下:
import numpy as np from sklearn import datasets X, y = datasets.make_blobs(n_samples=500, n_features=6, centers=5, cluster_std=[0.4, 0.3, 0.4, 0.3, 0.4], random_state=11)
接着咱們看看默認的譜聚類的效果:
from sklearn.cluster import SpectralClustering y_pred = SpectralClustering().fit_predict(X) from sklearn import metrics print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
輸出的Calinski-Harabasz分數爲:
Calinski-Harabasz Score 14908.9325026
因爲咱們使用的是高斯核,那麼咱們通常須要對n_clusters和gamma進行調參。選擇合適的參數值。代碼以下:
for index, gamma in enumerate((0.01,0.1,1,10)): for index, k in enumerate((3,4,5,6)): y_pred = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(X) print "Calinski-Harabasz Score with gamma=", gamma, "n_clusters=", k,"score:", metrics.calinski_harabaz_score(X, y_pred)
輸出以下:
Calinski-Harabasz Score with gamma= 0.01 n_clusters= 3 score: 1979.77096092
Calinski-Harabasz Score with gamma= 0.01 n_clusters= 4 score: 3154.01841219
Calinski-Harabasz Score with gamma= 0.01 n_clusters= 5 score: 23410.63895
Calinski-Harabasz Score with gamma= 0.01 n_clusters= 6 score: 19303.7340877
Calinski-Harabasz Score with gamma= 0.1 n_clusters= 3 score: 1979.77096092
Calinski-Harabasz Score with gamma= 0.1 n_clusters= 4 score: 3154.01841219
Calinski-Harabasz Score with gamma= 0.1 n_clusters= 5 score: 23410.63895
Calinski-Harabasz Score with gamma= 0.1 n_clusters= 6 score: 19427.9618944
Calinski-Harabasz Score with gamma= 1 n_clusters= 3 score: 687.787319232
Calinski-Harabasz Score with gamma= 1 n_clusters= 4 score: 196.926294549
Calinski-Harabasz Score with gamma= 1 n_clusters= 5 score: 23410.63895
Calinski-Harabasz Score with gamma= 1 n_clusters= 6 score: 19384.9657724
Calinski-Harabasz Score with gamma= 10 n_clusters= 3 score: 43.8197355672
Calinski-Harabasz Score with gamma= 10 n_clusters= 4 score: 35.2149370067
Calinski-Harabasz Score with gamma= 10 n_clusters= 5 score: 29.1784898767
Calinski-Harabasz Score with gamma= 10 n_clusters= 6 score: 47.3799111856
可見最好的n_clusters是5,而最好的高斯核參數是1或者0.1.
咱們能夠看看不輸入可選的n_clusters的時候,僅僅用最優的gamma爲0.1時候的聚類效果,代碼以下:
y_pred = SpectralClustering(gamma=0.1).fit_predict(X) print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
輸出爲:
Calinski-Harabasz Score 14950.4939717
可見n_clusters通常仍是調參選擇比較好。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)