Kmeans算法大家都基本耳熟能详了,而谱聚类算法的过程如下

  • 构建样本相似度矩阵S
  • 根据S构建度矩阵H
  • 计算拉普拉斯矩阵L=H-S
  • 构建标准化拉普拉斯矩阵 H(-1/2)LH(-1/2)
  • 计算 L  的最小的KK个特征值对应的特征向量
  • 将向量按照行进行标准化(每个元素除以本行所有元素的平方和在开根号)得到N*KK的矩阵F,N为样本点数
  • F中每一行作为一个样本,共N个样本,对其进行聚类(聚为K类)(KK与sigma是需要调整的参数)
  • 得到cluster{C1,C2,…Ck}
  • 起始本质就是得到特征矩阵之后在对特征矩阵执行 聚类

    代码如下(jupyter运行)

    import numpy as np
    import matplotlib.pyplot as plt
    import random
    import heapq
    from sklearn.cluster import KMeans
    import sklearn
    import pyamg
    import math

    #参数初始化

    N=20 #用户数
    distance=2000 #距离
    sigma_d=10000
    K=4 #无人机数量
    KK=6#矩阵降维维数

    users=np.random.randint(0,distance+1,(N,2)) 
    # print(users)
    scatter_x=[]
    scatter_y=[]
    for i in range(N):
        scatter_x.append(users[i][0])
        scatter_y.append(users[i][1])

    #矩阵S

    matric_S=np.zeros((N,N))
    for i in range(N):
        for j in range(N):
            matric_S[i][j]=math.exp(-((scatter_x[i]-scatter_x[j])**2+(scatter_y[i]-scatter_y[j])**2)/(2*(sigma_d**2)))
    print(type(matric_S))

    #矩阵H(度矩阵)

    matric_H=np.zeros((N,N))
    for i in range(N):
        for j in range(N):
            matric_H[i][i]=matric_H[i][i]+matric_S[i][j]

    #矩阵H(度矩阵负二分之一次幂)

    matric_H_ = np.sqrt(np.linalg.inv(matric_H))

    #将数组转化为矩阵
    matric_S=np.mat(matric_S)
    matric_H=np.mat(matric_H)
    matric_H_=np.mat(matric_H_)

    #拉普拉斯矩阵

    matric_L=np.dot(np.dot(matric_H_,(matric_H-matric_S)),matric_H_)

    求解特征值 w 和特征向量 v

    w, v = np.linalg.eigh(matric_L)
    print(w)
    w=list(w)
    min_KK = map(w.index, heapq.nsmallest(KK, w))
    min_KK=list(min_KK)
    # min_KK.sort()
    print(min_KK)

    #特征值矩阵U

    matric_U=np.zeros((N,KK))
    for i in range(N):
        for j in range(KK):
            matric_U[i,j]=v[i,min_KK[j]]

    #特征值归一化矩阵T

    matric_fm=np.zeros((N,1))
    for i in range(N):
        for j in range(KK):
            matric_fm[i,0]=matric_U[i,j]**2+matric_fm[i,0]

    matric_T=np.zeros((N,KK))
    for i in range(N):
        for j in range(KK):
            matric_T[i,j]=matric_U[i,j]/np.sqrt(matric_fm[i,0])

    #对特征值进行Kmeans聚类

    kmeans = KMeans(n_clusters=4, init='k-means++',random_state=1,n_init=1000).fit(matric_T)
    colors = []
    for i in range(kmeans.labels_.shape[0]):
        if kmeans.labels_[i] == 1:
            colors.append('red')
        elif  kmeans.labels_[i] == 2:
            colors.append('blue')
        elif  kmeans.labels_[i] == 3:
            colors.append('green')
        else:
            colors.append('purple')

    #对原始数据进行Kmeans聚类

    kmeans_=KMeans(n_clusters=4, init='random', random_state=1,n_init=100).fit(users)
    colors_ = []
    for i in range(kmeans_.labels_.shape[0]):
        if kmeans_.labels_[i] == 1:
            colors_.append('red')
        elif  kmeans_.labels_[i] == 2:
            colors_.append('blue')
        elif  kmeans_.labels_[i] == 3:
            colors_.append('green')
        else:
            colors_.append('purple')

    #可视化

    plt.figure(dpi=720,figsize=(24,8))

    plt.subplot(131)
    plt.title('random users')
    plt.grid()
    plt.scatter(scatter_x,scatter_y)
    # plt.scatter(scatter_x,scatter_y,color='',edgecolors='blue')

    plt.subplot(132)
    plt.title('kmeans ')
    plt.grid()
    # plt.scatter(scatter_x, scatter_y, color='',edgecolors=colors_, marker='o')
    plt.scatter(scatter_x, scatter_y, c=colors_, marker='o')

    # 无人机位置
    a_x=[]
    b_y=[]
    ab_color=['purple','red','blue','green']
    for label_num in range(K):
        a=[]
        b=[]
        for i in range(kmeans.labels_.shape[0]):
            if kmeans.labels_[i] == label_num:
                a.append(scatter_x[i])
                b.append(scatter_y[i])
        a_x.append(math.fsum(a)/5)
        b_y.append(math.fsum(b)/5)
    print(a_x)
    print(b_y)

    plt.subplot(133)
    plt.title('spectral cluster ')
    plt.grid()
    # plt.scatter(scatter_x, scatter_y, c=colors, marker='o')
    plt.scatter(a_x,b_y,marker='*',c=ab_color)
    plt.scatter(scatter_x, scatter_y, color='',edgecolors=colors, marker='o')
    plt.show()

sklearn有集成的SpectralClustering谱聚类也可以自行使用,调制相关参数即可得到。

Kmeans和谱聚类算法(python实现sklearn)相关推荐

  1. K-means和PAM聚类算法Python实现及对比

    K-means(K均值划分)聚类:简单的说,一般流程如下:先随机选取k个点,将每个点分配给它们,得到最初的k个分类:在每个分类中计算均值,将点重新分配,划归到最近的中心点:重复上述步骤直到点的划归不再 ...

  2. 机器学习算法(7)——K近邻(KNN)、K-means、模糊c-均值聚类、DBSCAN与层次与谱聚类算法

    1.K-近邻算法(KNN)概述 (有监督算法,分类算法) 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类.但是怎么可能 ...

  3. 谱聚类python代码_Python 谱聚类算法从零开始

    谱聚类算法是一种常用的无监督机器学习算法,其性能优于其他聚类方法. 此外,谱聚类实现起来非常简单,并且可以通过标准线性代数方法有效地求解. 在谱聚类算法中,根据数据点之间的相似性而不是k-均值中的绝对 ...

  4. 谱聚类算法原理(二)python实现

    谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚类算法如k-均值算法,本文对谱聚类算法进行了详细总结,内容主要参考论文<A Tutorial on Spectral Clust ...

  5. python谱聚类算法_谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  6. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  7. 干货 | 非常全面的谱聚类算法原理总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚 ...

  8. 社区发现算法——(Spectral Clustering)谱聚类算法

    归一化的拉普拉斯(The unnormalized graph Laplacian): L=D−WL = D - W L=D−W 其中D为对角度矩阵,W为权重邻接矩阵. 1.矩阵L满足以下性质: 对于 ...

  9. 到底什么是谱聚类算法?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 谱聚类算法是目前最流行的聚类算法之一,其性能及 ...

最新文章

  1. makefile:2: *** missing separator. Stop. make 之后出现的错误,解决方法
  2. 微软ASP.NET MVC Beta版本发布
  3. Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透
  4. Direct2D教程(一)Direct2D已经来了,谁是GDI的终结者?
  5. win10访问win7的共享文件夹
  6. 文本框灰色文字提示,鼠标点击文字消失
  7. ie6 z-index bug
  8. js获取当前时间(昨天、今天、明天)
  9. 工作五年再回首java---开篇
  10. linux中自动化日志分析,Shell项目案例7-应用日志分析
  11. 今天我们聊聊,小程序开发的入手门槛还是比较低的
  12. Win10桌面极简美化
  13. php判断百度蜘蛛ip,判断百度蜘蛛偷偷进行301转移权重 给新站提权
  14. FISCO BCOS v3.x 多群组区块链Pro版本搭建说明(ubuntu)
  15. 计算机科学感言,计算机专业学生毕业感言
  16. mediasoup 管道通信类UnixStreamSocket分析
  17. 盲子强巴(连载)二、
  18. 自主性: 一个概念的哲学考察
  19. 粉丝时代,明星不需要公关?
  20. 国内linux内核代码贡献率,[图]AMD为Linux内核贡献27.5万行代码 确认Van Gogh APU支持DDR5和VCN3...

热门文章

  1. 设计模式 – 模板设计模式
  2. 产品不够完美,品牌运营该如何策划
  3. 卡农D大调——凄美的爱情故事
  4. Flink流式计算从入门到实战 四
  5. 一行代码搞定信用评分模型(python)
  6. λ演算简介及coq实现λ演算
  7. Stata:描述统计结果导出
  8. lua能在stm32arm上运行吗_ARM版Mac将至,那么手机能运行PC操作系统吗
  9. vnc-server的安装配置
  10. Windows平台RTMP/RTSP直播推送模块设计和使用说明