在谱聚类(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)