用scikit-learn学习谱聚类

    在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结。这里我们就对scikit-learn中谱聚类的使用做一个总结。

1. scikit-learn谱聚类概述

    在scikit-learn的类库中,sklearn.cluster.SpectralClustering实现了基于Ncut的谱聚类,没有实现基于RatioCut的切图聚类。同时,对于相似矩阵的建立,也只是实现了基于K邻近法和全连接法的方式,没有基于$\epsilon$-邻近法的相似矩阵。最后一步的聚类方法则提供了两种,K-Means算法和 discretize算法。

    对于SpectralClustering的参数,我们主要需要调参的是相似矩阵建立相关的参数和聚类类别数目,它对聚类的结果有很大的影响。当然其他的一些参数也需要理解,在必要时需要修改默认参数。

2. SpectralClustering重要参数与调参注意事项

    下面我们就对SpectralClustering的重要参数做一个介绍,对于调参的注意事项会一起介绍。

    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‘核函数,那么我们就需要对这个参数进行调参。

    多项式核函数中这个参数对应$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$

    $\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进行调参。     

3.SpectralClustering实例

    这里我们用一个例子讲述下SpectralClustering的聚类。我们选择最常用的高斯核来建立相似矩阵,用K-Means来做最后的聚类。

    首先我们生成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一般还是调参选择比较好。

(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])     

时间: 2024-10-24 15:30:44

用scikit-learn学习谱聚类的相关文章

机器学习-scikit learn学习笔记

scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习问题一般可以分为: 监督学习(supervised learning) 分类(classification) 回归(regression) 非监督学习(unsupervised learning) 聚类(clustering) 监督学习和非监督学习的区别就是,监督学习中,样本数据会包含要预测的标签(

谱聚类(spectral clustering)原理总结

谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也不复杂.在处理实际的聚类问题时,个人认为谱聚类是应该首先考虑的几种算法之一.下面我们就对谱聚类的算法原理做一个总结. 一.谱聚类概述 谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用.它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来.距离较远的两个点之间的边权重值较低

Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购.优惠券的检索:同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充. 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,

关于谱聚类的ng算法的实现

广义上讲,任何在学习过程中应用到矩阵特征值分解的方法均叫做谱学习方法,比如主成分分析(PCA),线性判别成分分析(LDA),流形学习中的谱嵌入方法,谱聚类等等. 由于科苑向世明老师课件上面关于ng的谱聚类算法里面与ng大神的论文中写到的算法中有所出入,导致昨天晚上调了一晚上的算法并没有调出满意的结果,今天在网上找到了ng大神的原始paper阅读一遍,虽然还是有很多不理解的地方,还是有了自己的见解.下面是ng算法的流程. 算法第一步先通过高斯函数计算出每个点与其他点的亲和度,与自己的亲和度为0,对

聚类分析之谱聚类

聚类根据给定的样本数据集定义一个描述成对数据点相似度的亲合矩阵,并且计算矩阵的特征值和特征向量 , 然后选择合适 的特征向量聚类不同的数据点. 谱聚类可以在任意形状的样本空间聚类,且收敛于全局最优解,因此在处理高维数据方面存在着明显优势.总的来说,该算法存在一些不足之处.算法在聚类之前需要设置具体应用的尺度参数,通常需要一些经验.初始聚类中心对整个聚类效果影响很大,存在初始值敏感问题.很难找到图划分的优化解,聚类数目对于整个聚类效果有很大影响. setp1:计算图的拉普拉斯矩阵L=D-w set

从拉普拉斯矩阵说到谱聚类

转载:http://blog.csdn.net/v_july_v/article/details/40738211   0 引言     11月1日上午,机器学习班第7次课,邹博讲聚类(PPT),其中的谱聚类引起了自己的兴趣,他从最基本的概念:单位向量.两个向量的正交.方阵的特征值和特征向量,讲到相似度图.拉普拉斯矩阵,最后讲谱聚类的目标函数和其算法流程.     课后自己又琢磨了番谱聚类跟拉普拉斯矩阵,打算写篇博客记录学习心得, 若有不足或建议,欢迎随时不吝指出,thanks. 1 矩阵基础

谱聚类

欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识!也可以搜索公众号:磐创AI,关注我们的文章. 作者:磐石 简述 图相关的符号符号 相似度矩阵S 拉普拉斯矩阵L性质 谱聚类算法 总结 一.简述 聚类是对探索性数据分析最广泛使用的技术,在现在各个科学领域中处理没有类标的数据时,人们总是想通过确定数据中不同样本的归类,来获取对数据的直观印象.传统的聚类方法有很多,像K-means,single linkage等,但是k

谱聚类--SpectralClustering

谱聚类一般会先对两两样本间求相似度, 然后根据相似度矩阵求出拉普拉斯矩阵,然后将每个样本映射到拉普拉斯矩阵特诊向量中,最后使用k-means聚类. scikit-learn开源包中已经有现成的接口可以使用,具体见 http://scikit-learn.org/dev/modules/generated/sklearn.cluster.SpectralClustering.html#sklearn.cluster.SpectralClustering 写了一个测试例子 构造二维空间样本点, #!

用scikit-learn学习DBSCAN聚类

在DBSCAN密度聚类算法中,我们对DBSCAN聚类算法的原理做了总结,本文就对如何用scikit-learn来学习DBSCAN聚类做一个总结,重点讲述参数的意义和需要调参的参数. 1. scikit-learn中的DBSCAN类 在scikit-learn中,DBSCAN算法类为sklearn.cluster.DBSCAN.要熟练的掌握用DBSCAN类来聚类,除了对DBSCAN本身的原理有较深的理解以外,还要对最近邻的思想有一定的理解.集合这两者,就可以玩转DBSCAN了. 2. DBSCAN