vlambda博客
学习文章列表

Python聚类算法之谱聚类


1)概述

     Spectral Clustering(SC,即谱聚类),是一种基于图论的聚类方法,它能够识别任意形状的样本空间且收敛于全局最有解,其基本思想是利用样本数据的相似矩阵进行特征分解后得到的特征向量进行聚类.它与样本特征无关而只与样本个数有关。

     基本思路:将样本看作顶点,样本间的相似度看作带权的边,从而将聚类问题转为图分割问题:找到一种图分割的方法使得连接不同组的边的权重尽可能低(这意味着组间相似度要尽可能低),组内的边的权重尽可能高(这意味着组内相似度要尽可能高).

2)图解过程

     

                        图5

          如上图所示,断开虚线,六个数据被聚成两类。

3)Spectral Clustering算法函数

         a)核心函数:sklearn.cluster.SpectralClustering

             因为是基于图论的算法,所以输入必须是对称矩阵。

         b)主要参数(参数较多,详细参数)

             n_clusters:聚类的个数。(官方的解释:投影子空间的维度)

             affinity:核函数,默认是'rbf',可选:"nearest_neighbors", "precomputed", "rbf"或sklearn.metrics.pairwise_kernels支持的其中一个内核之一。

             gamma :affinity指定的核函数的内核系数,默认1.0

         c)主要属性

            labels_ :每个数据的分类标签

4)算法示例与效果图

from sklearn.datasets.samples_generator import make_blobsfrom sklearn.cluster import spectral_clusteringimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import metricsfrom itertools import cycle ##python自带的迭代器模块
##产生随机数据的中心centers = [[1, 1], [-1, -1], [1, -1]]##产生的数据个数n_samples=3000##生产数据X, lables_true = make_blobs(n_samples=n_samples, centers= centers, cluster_std=0.6, random_state =0)
##变换成矩阵,输入必须是对称矩阵metrics_metrix = (-1 * metrics.pairwise.pairwise_distances(X)).astype(np.int32)metrics_metrix += -1 * metrics_metrix.min()##设置谱聚类函数n_clusters_= 4lables = spectral_clustering(metrics_metrix,n_clusters=n_clusters_)
##绘图plt.figure(1)plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')for k, col in zip(range(n_clusters_), colors): ##根据lables中的值是否等于k,重新组成一个True、False的数组 my_members = lables == k ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标 plt.plot(X[my_members, 0], X[my_members, 1], col + '.') plt.title('Estimated number of clusters: %d' % n_clusters_)plt.show()
案例结果: