前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谱聚类

谱聚类

作者头像
裴来凡
发布2022-05-29 10:41:34
3040
发布2022-05-29 10:41:34
举报
代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np
from numpy import linalg as LA
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.preprocessing import normalize 
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['font.sans-serif']=['SimHei']
def similarity_function(points):
    """
    相似性函数,利用径向基核函数计算相似性矩阵,对角线元素置为0   
    """
    res=rbf_kernel(points)
    for i in range(len(res)):
        res[i,i]=0
    return res 
def spectral_clustering(points,k):
    W=similarity_function(points)
    D=np.diag(np.sum(W,axis=1))
    Dn=np.sqrt(LA.inv(D))
    #Dn=np.diag(np.power(np.sum(W,axis=1),-0.5))
    #拉普拉斯矩阵:L=Dn*(D-W)*Dn=I-Dn*W*Dn
    L=np.eye(len(points))-np.dot(np.dot(Dn,W),Dn)
    eigvals,eigvecs=LA.eig(L)
    #前k小的特征值对应的索引,argsort函数
    indices=np.argsort(eigvals)[:k]
    #取出前k小的特征值对应的特征向量并进行正则化
    k_smallest_eigenvectors=normalize(eigvecs[:, indices])
    #利用KMeans进行聚类
    return KMeans(n_clusters=k).fit_predict(k_smallest_eigenvectors) 
X,y=make_blobs()
labels=spectral_clustering(X,5) 
plt.style.use('ggplot')
#原数据
fig,(ax0,ax1)=plt.subplots(ncols=2)
ax0.scatter(X[:,0], X[:,1],c=y)
ax0.set_title('原数据')
#谱聚类
ax1.scatter(X[:,0], X[:,1],c=labels)
ax1.set_title('谱聚类')
plt.show()

算法:谱聚类是首先根据给定的样本数据集定义描述成对数据点相似度的亲合矩阵,然后计算矩阵的特征值和特征向量,最后选择合适的特征向量聚类不同的数据点。

文献:Luxburg, U. V. . (2004). A tutorial on spectral clustering. Statistics and Computing, 17(4), 395-416.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档