谱聚类(spectral cluster)可以视为一种改进的Kmeans的聚类算法。常用来进行图像分割。缺点是需要指定簇的个数,难以构建合适的相似度矩阵。优点是简单易实现。相比Kmeans而言,处理高维数据更合适。

核心思想

构建样本点的相似度矩阵(图),将图切割成K个子图,使得各个子图内相似度最大,子图间相似度最弱

算法简介

构建相似度矩阵的拉普拉斯矩阵。对拉普拉斯矩阵进行特征值分解,选取前K(也是簇的个数)个特征向量(按特征值从小到大的顺序)构成K维特征空间,在特征空间内进行Kmeans聚类。概括地讲,就是将原始数据映射到特征空间进行Kmeans聚类。因此,谱聚类适合于簇的个数比较小的情况下。(个人的理解是当维度比较高,簇的个数比较小时,可以将其视为一种降维的方法)
拉普拉斯矩阵可以分为规范化的(LnormLnormL_{norm})和未规范化的拉普拉斯矩阵(LLL)。

L=D−WLnorm=D−1/2LD−1/2'>L=D−WLnorm=D−1/2LD−1/2L=D−WLnorm=D−1/2LD−1/2

L = D-W\\L_{norm}=D^{-1/2}LD^{-1/2}其中D为图的度矩阵(对角矩阵,节点边权重之和),W为相似度矩阵。

算法流程

  • Input: 训练数据集data,簇的个数, 阈值epsilon, 最大迭代次数maxstep, 相似度计算方法及参数
  • Output: 标签数组
  • Step1:构建相似度矩阵,再构建拉普拉斯矩阵,对拉普拉斯矩阵进行特征值分解,将样本数据点映射到特征空间。
  • Step2: 再特征空间内进行Kmeans聚类。

代码

"""
谱聚类算法
核心思想:构建样本点的图,切分图,使得子图内权重最大,子图间权重最小
"""
import numpy as np
from kmeans import KMEANSclass Spectrum:def __init__(self, n_cluster, epsilon=1e-3, maxstep=1000, method='unnormalized',criterion='gaussian', gamma=2.0, dis_epsilon=70, k=5):self.n_cluster = n_clusterself.epsilon = epsilonself.maxstep = maxstepself.method = method  # 本程序提供规范化以及非规范化的谱聚类算法self.criterion = criterion  # 相似性矩阵的构建方法self.gamma = gamma  # 高斯方法中的sigma参数self.dis_epsilon = dis_epsilon  # epsilon-近邻方法的参数self.k = k  # k近邻方法的参数self.W = None  # 图的相似性矩阵self.L = None  # 图的拉普拉斯矩阵self.L_norm = None  # 规范化后的拉普拉斯矩阵self.D = None  # 图的度矩阵self.cluster = Noneself.N = Nonedef init_param(self, data):# 初始化参数self.N = data.shape[0]dis_mat = self.cal_dis_mat(data)self.cal_weight_mat(dis_mat)self.D = np.diag(self.W.sum(axis=1))self.L = self.D - self.Wreturndef cal_dis_mat(self, data):# 计算距离平方的矩阵dis_mat = np.zeros((self.N, self.N))for i in range(self.N):for j in range(i + 1, self.N):dis_mat[i, j] = (data[i] - data[j]) @ (data[i] - data[j])dis_mat[j, i] = dis_mat[i, j]return dis_matdef cal_weight_mat(self, dis_mat):# 计算相似性矩阵if self.criterion == 'gaussian':  # 适合于较小样本集if self.gamma is None:raise ValueError('gamma is not set')self.W = np.exp(-self.gamma * dis_mat)elif self.criterion == 'k_nearest':  # 适合于较大样本集if self.k is None or self.gamma is None:raise ValueError('k or gamma is not set')self.W = np.zeros((self.N, self.N))for i in range(self.N):inds = np.argpartition(dis_mat[i], self.k + 1)[:self.k + 1]  # 由于包括自身,所以+1tmp_w = np.exp(-self.gamma * dis_mat[i][inds])self.W[i][inds] = tmp_welif self.criterion == 'eps_nearest':  # 适合于较大样本集if self.dis_epsilon is None:raise ValueError('epsilon is not set')self.W = np.zeros((self.N, self.N))for i in range(self.N):inds = np.where(dis_mat[i] < self.dis_epsilon)self.W[i][inds] = 1.0 / len(inds)else:raise ValueError('the criterion is not supported')returndef fit(self, data):# 训练主函数self.init_param(data)if self.method == 'unnormalized':w, v = np.linalg.eig(self.L)inds = np.argsort(w)[:self.n_cluster]Vectors = v[:, inds]elif self.method == 'normalized':D = np.linalg.inv(np.sqrt(self.D))L = D @ self.L @ Dw, v = np.linalg.eig(L)inds = np.argsort(w)[:self.n_cluster]Vectors = v[:, inds]normalizer = np.linalg.norm(Vectors, axis=1)normalizer = np.repeat(np.transpose([normalizer]), self.n_cluster, axis=1)Vectors = Vectors / normalizerelse:raise ValueError('the method is not supported')km = KMEANS(self.n_cluster, self.epsilon, self.maxstep)km.fit(Vectors)self.cluster = km.clusterreturnif __name__ == '__main__':from sklearn.datasets import make_blobsfrom itertools import cycleimport matplotlib.pyplot as pltdata, label = make_blobs(centers=3, n_features=10, cluster_std=1.2, n_samples=500, random_state=1)sp = Spectrum(n_cluster=3, method='unnormalized', criterion='gaussian', gamma=0.1)sp.fit(data)cluster = sp.cluster# km = KMEANS(4)# km.fit(data)# cluster_km = km.cluster# def visualize(data, cluster):#     color = 'bgrym'#     for col, inds in zip(cycle(color), cluster.values()):#         partial_data = data[inds]#         plt.scatter(partial_data[:, 0], partial_data[:, 1], color=col)#     plt.show()#     return# visualize(data, cluster)def cal_err(data, cluster):# 计算MSEmse = 0for label, inds in cluster.items():partial_data = data[inds]center = partial_data.mean(axis=0)for p in partial_data:mse += (center - p) @ (center - p)return mse / data.shape[0]print(cal_err(data, cluster))# print(cal_err(data, cluster_km))

我的GitHub
注:代码尚未进行严格测试,如有不当之处,请指正。

聚类——谱聚类算法以及Python实现相关推荐

  1. 说话人聚类--谱聚类和层次聚类

    谱聚类和层次聚类 在讯飞实习了一个月了,做了点说话人聚类的工作,现在总结一下主要用到的谱聚类和层次聚类. 层次聚类 在层次聚类这块,我主要学习了 凝聚型层次聚类和 BIRCH方法,主要参考的博客有 [ ...

  2. 聚类——标签传播算法以及Python实现

    标签传播算法(label propagation)是典型的半监督聚类算法.半监督是指训练数据集中小部分样本点已知标签,大部分样本点未知标签. 核心思想 相似性较大的样本点间应该具有相同的标签,将已知标 ...

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

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

  4. Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...

  5. 小白入门谱聚类算法原理与实现

    小白入门谱聚类算法原理与实现 小白入门谱聚类算法原理与实现 1. 谱聚类是什么? 2.谱聚类步骤 2.1 谱聚类构图 2.2 谱聚类切图 2.2.1RatioCut 2.2.2Ncut 3谱聚类实现 ...

  6. 机器学习算法之 K-means、层次聚类,谱聚类

    k-means 和层次聚类都属于划分聚类,实际中最常用的是k-means,k-means效果不好的情况下才会采用其他聚类 K-means算法 K-means算法,也称为K-平均或者K-均值,是一种使用 ...

  7. 谱聚类(Spectral Clustering)算法介绍

    一. 前言 本来想写关于聚类系列算法的介绍,但是聚类系列的其它几个算法原理比较简单,网上有大量的教程可以查阅.这里主要是介绍一下谱聚类算法,做一个学习笔记,同时也希望对想要了解该算法的朋友有一个帮助. ...

  8. 机器学习强基计划7-5:图文详解密度聚类DBSCAN算法(附Python实现)

    目录 0 写在前面 1 密度聚类 2 DBSCAN算法 3 Python实现 3.1 算法复现 3.2 可视化实验 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用.&qu ...

  9. 【图像分割】基于谱聚类算法实现图像分割matlab源码

    一. 前言 本来想写关于聚类系列算法的介绍,但是聚类系列的其它几个算法原理比较简单,网上有大量的教程可以查阅.这里主要是介绍一下谱聚类算法,做一个学习笔记,同时也希望对想要了解该算法的朋友有一个帮助. ...

  10. 谱聚类算法及其代码(Spectral Clustering)

    简介 文章将介绍谱聚类(spectral clustering)的基本算法,以及在matlab下的代码实现.介绍内容将包括: 从图分割角度直观理解谱聚类 谱聚类算法步骤 数据以及实现代码 本文将不会涉 ...

最新文章

  1. Matlab程序咨询,书上程序4-5问题咨询
  2. 【博士论文】集群系统中的网络流调度
  3. 基于脑电图的情绪识别BCI应用于DOC患者
  4. 连接svn认证失败有那些原因_windows局域网搭建svn服务器
  5. 【hadoop】1.简介
  6. 基于内容的自适应视频传输算法及其应用
  7. C++11新特性,利用std::chrono精简传统获取系统时间的方法
  8. 计算机在平面设计中的作用,比例设计在平面设计中的作用与意义
  9. python中变量和函数的区别_python中带下划线的变量和函数的意义
  10. Rx:4-[编外篇] .NET4里的Concurrent Collections
  11. 视频跟踪——CMT算法
  12. layui开关按钮,checkbox复选框开关按钮效果美化
  13. 省级面板数据(1990-2019):能源生产等(原油、石油、焦炭、原煤、天然气等)stata或excel版本
  14. python绘制网格地图_「GIS教程」Python-GeoPandas地图、专题地图绘制
  15. 词向量与垃圾邮件识别
  16. 5.1 定积分的概念与性质
  17. 鸿濛和鸿蒙的区别,鸿蒙_若雪如痕_新浪博客
  18. 一纸读懂另类数据 | 未央研究
  19. 努力和家境哪个更重要
  20. 无法启动此程序,因为计算机中丢失MSVCP120.dll文件、应用程序无法正常启动0xc000007b

热门文章

  1. 大学选修计算机课程内容,《大学计算机基础》学大纲(公共课).doc
  2. Gin简单明了的教程---上
  3. autoit mysql update_RobotFramework+selenium+requests+autoit+mysql+appium 环境搭建
  4. 视频教程-Java高级技术-Java
  5. MySQL Error 1114
  6. 怎么利用计算机自带功能删除垃圾,win7系统怎么清除电脑里的垃圾
  7. 二阶魔方还原 C++ BFS
  8. 03.项目管理实践工具-团队绩效评价
  9. 推荐!程序员常用的15个学习交流网站
  10. 一年级金字塔框填数字_一年