谱聚类算法—Matlab代码
% =========================================================================
% 算 法 名 称: Spectral Clustering Algorithm
% 编 码 作 者: Lee Wen-Tsao
% 编 码 邮 箱: liwenchao36@163.com
% 输 入 参 数:
% W ---> 邻接矩阵
% k ---> 簇数目
% t ---> 拉普拉斯矩阵归一化处理类型
% =========================================================================
%% step1: 清理运行环境
clc;
clear;
close all;
%% step2: 读入数据
Iris = uiimport('iris.data');
Iris = cellfun(@(x) regexp(x,',','split'), Iris.iris,'UniformOutput',false);
data = cellfun(@(x) x(:,1:4),Iris,'UniformOutput',false);
data = str2double(reshape([data{:}],4,150)');
%% step3: 构造相似矩阵
H = pdist2(data, data, 'euclidean');
W = 1-exp(-(H.^2)./2);
triu_W = triu(W, 0)./(sum(triu(W, 0),2) + eps);
W = triu_W' + triu_W;
%% step4: 计算度矩阵
d = sum(W, 2); % 对W进行列求和
D = sparse(1:size(W,1), 1:size(W,2), d); % 然后将d中的元素放到对角线上
%% step5: 计算拉普拉斯矩阵
% 1.未标准化的拉普拉斯矩阵
L = D - W;
% 2.正则拉普拉斯矩阵
t = 'Symmetric';
switch t
case 'RandomWalk'
% 避免除以0
d(d==0) = eps;
% 计算D的逆
D = spdiags(1./d, 0, size(D, 1), size(D, 2));
% 随机游走正则化拉普拉斯矩阵
L = D*L;
case 'Symmetric'
% 避免除以0
d(d==0) = eps;
% 计算D^(1/2)
D = spdiags(1./(d.^0.5), 0, size(D, 1), size(D, 2));
% 对称正则化拉普拉斯矩阵
L = D*L*D;
end
%% step5: 特征值和特征向量
% 1.V表示特征向量;lamda表示特征值
k = 3;
[U, lamda] = eigs(L, k, 'smallestabs'); % 不能这么求特征向量,特征向量有重数
if strcmp('Symmetric', t)
% 对称拉普拉斯矩阵单位化
U = bsxfun(@rdivide, U, sqrt(sum(U.^2, 2)));
end
%% step6: 使用kmeans对函数分类
% 0. 问题定义
labels = zeros(size(U,1),1);
errors = zeros(k, 1);
expose = 1;
% 1. 初始化簇心
loc = randperm(size(U,1));
centroids = U(loc(1:k),:);
% 2. 迭代
N_iter = 1000;
for it=1:N_iter
for i=1:size(U,1)
dists = sqrt(sum((U(i,:) - centroids).^2, 2)); % 计算每个数据到k个簇心的距离
[distMin, idx] = min(dists); % 寻找距离每个簇心的最小距离
labels(i,:) = idx; % 给每个数据标注
end
% 3. 计算误差率
for j=1:k
errors(j, :) = sum(sqrt(sum((U(j==labels, :)- centroids(j, :)).^2, 2)));
end
% 4. 可视化
if expose
disp(sum(errors));
end
% 5. 更新簇心
for j=1:k
centroids(j,:) = mean(U((j==labels),:),1);
end
end
思考:
- 为什么要使用拉普拉斯正则化?
拉普拉斯正则化过程有两个:
(1)随机游走拉普拉斯正则化
(2)对称拉普拉斯正则化 - 上述拉普拉斯正则化的理论基础是什么?
- 这种降维方式的原理是什么呢?
- 这种聚类算法效果为啥没有论文里说的那么好,问题出现在哪里?
谱聚类算法—Matlab代码的更多相关文章
- 谱聚类算法及其代码(Spectral Clustering)
https://blog.csdn.net/liu1194397014/article/details/52990015 https://blog.csdn.net/u011089523/articl ...
- 密度峰值聚类算法MATLAB程序
密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...
- 谱聚类算法(Spectral Clustering)
谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...
- 谱聚类算法(Spectral Clustering)优化与扩展
谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用.本文将讲述进一步扩展其应用场景:首先是User- ...
- K-medodis聚类算法MATLAB
国内博客,上介绍实现的K-medodis方法为: 与K-means算法类似.只是距离选择与聚类中心选择不同. 距离为曼哈顿距离 聚类中心选择为:依次把一个聚类中的每一个点当作当前类的聚类中心,求出代价 ...
- K-modes聚类算法MATLAB
K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...
- K-means聚类算法MATLAB
以K-means算法为例,实现了如下功能 自动生成符合高斯分布的数据,函数名为gaussianSample.m 实现多次随机初始化聚类中心,以找到指定聚类数目的最优聚类.函数名myKmeans.m 自 ...
- 谱聚类Ng算法的Matlab简单实现
请编写一个谱聚类算法,实现"Normalized Spectral Clustering-Algorithm 3 (Ng 算法)" 结果如下 谱聚类算法核心步骤都是相同的: •利用 ...
- 基于谱聚类的三维网格分割算法(Spectral Clustering)
谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...
随机推荐
- [luogu5163]WD与地图
将删边改为插边,如果是无向图直接线段树合并即可,考虑如何将有向边转换为无向边 令$t_{i}$表示当插入到第$t_{i}$条边时恰好满足$x_{i}$与$y_{i}$在同一个强连通分量中,然后分类讨论 ...
- lilypond和弦及其转位的表示
在lilypond,如果要打和弦的话,有所谓的chordmode,命令就是\chordmode {} 要使用chordmode需要一些基本的和弦命名的知识,最好先补一下乐理 实际上lilypond的官 ...
- Hbuilder/Uniapp 格式化的时候,很多属性会排列在一行,如何结局?
因为自己遇到这个问题,然后百度了很久都得不到解决办法,所以解决问题以后在博客园写下此文,希望能帮助到更多人! //在jsbeautifyrc.js里面的html中加入这个,就OK了 "wra ...
- Codeforces 997D - Cycles in product(换根 dp)
Codeforces 题面传送门 & 洛谷题面传送门 一种换根 dp 的做法. 首先碰到这类题目,我们很明显不能真的把图 \(G\) 建出来,因此我们需要观察一下图 \(G\) 有哪些性质.很 ...
- Hermite WENO 重构格式
Hermite WENO 单元重构 本文主要介绍采用 Hermite WENO 重构方法作为斜率限制器应用于二维或高维单元中. 1.简介[1] ENO格式最早由 Harten 等[2]提出,ENO格式 ...
- you crash I crash
今天一大早起来,zabbix报错了 我去查看了mysql的状态 MySQL is not running, but lock file (/var/lock/subsys/mysql) exists ...
- Python基础之数字类型内置方法
目录 1. 整型内置方法(int) 2. 浮点型内置方法 3. 常用操作 1. 整型内置方法(int) 用途:年龄,号码,等级等 定义: age = 18 常用操作 # 算数运算.比较运算 age = ...
- ubuntu 常用指令
1.进入到root权限的指令 sudo su,效果同su,只是不需要root的密码,而需要当前用户的密码.(亲测有效) 2.从root权限里面退出到 普通用户模式 exit---指令亲测有效 3.下载 ...
- 63.不同路径II
目录 63.不同路径Ⅱ 题目 题解 63.不同路径Ⅱ 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动 ...
- linux vi和vim编辑器
所有的Linux系统都会内建vi文本编辑器,vim具有程序编辑的能力,可以看作是vi的增强版本 三种常见模式 正常模式 以vim打开一个文档直接进入的模式,快捷键可以使用. 1.这个模式可以使用上下左 ...