% =========================================================================
% 算 法 名 称: 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. 为什么要使用拉普拉斯正则化?

    拉普拉斯正则化过程有两个:

    (1)随机游走拉普拉斯正则化

    (2)对称拉普拉斯正则化
  2. 上述拉普拉斯正则化的理论基础是什么?
  3. 这种降维方式的原理是什么呢?
  4. 这种聚类算法效果为啥没有论文里说的那么好,问题出现在哪里?

谱聚类算法—Matlab代码的更多相关文章

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

    https://blog.csdn.net/liu1194397014/article/details/52990015 https://blog.csdn.net/u011089523/articl ...

  2. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  3. 谱聚类算法(Spectral Clustering)

        谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...

  4. 谱聚类算法(Spectral Clustering)优化与扩展

    谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用.本文将讲述进一步扩展其应用场景:首先是User- ...

  5. K-medodis聚类算法MATLAB

    国内博客,上介绍实现的K-medodis方法为: 与K-means算法类似.只是距离选择与聚类中心选择不同. 距离为曼哈顿距离 聚类中心选择为:依次把一个聚类中的每一个点当作当前类的聚类中心,求出代价 ...

  6. K-modes聚类算法MATLAB

    K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...

  7. K-means聚类算法MATLAB

    以K-means算法为例,实现了如下功能 自动生成符合高斯分布的数据,函数名为gaussianSample.m 实现多次随机初始化聚类中心,以找到指定聚类数目的最优聚类.函数名myKmeans.m 自 ...

  8. 谱聚类Ng算法的Matlab简单实现

    请编写一个谱聚类算法,实现"Normalized Spectral Clustering-Algorithm 3 (Ng 算法)" 结果如下 谱聚类算法核心步骤都是相同的: •利用 ...

  9. 基于谱聚类的三维网格分割算法(Spectral Clustering)

    谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...

随机推荐

  1. myeclipse自带tomcat

    安装myeclipse自带的tomcat没有在myeclipse的安装目录下,是再myeclipse指定的工作空间下 的.metadata\.plugins\com.genuitec.eclipse. ...

  2. [atARC103D]Robot Arms

    合法的必要条件是每个点两维坐标和奇偶性相同,同时这也是充分条件 令$d_{i}=\{2^{0},2^{1},...,2^{m-1}\}$,归纳其可以走到任意满足$|x|+|y|<2^{m}$的$ ...

  3. Python 3 快速入门 2 —— 流程控制与函数

    本文假设你已经有一门面向对象编程语言基础,如Java等,且希望快速了解并使用Python语言.本文对重点语法和数据结构以及用法进行详细说明,同时对一些难以理解的点进行了图解,以便大家快速入门.一些较偏 ...

  4. plyr包使用

    #-------------------------------- # plyr包使用# 建议直接保存为R文件到Rstudio中运行 #-------------------------------- ...

  5. 如何优雅地将printf的打印保存在文件中?

    我们都知道,一般使用printf的打印都会直接打印在终端,如果想要保存在文件里呢?我想你可能想到的是重定向.例如: $ program > result.txt 这样printf的输出就存储在r ...

  6. leetcode刷题之数组NO.4

    1.题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数 ...

  7. 《Scala编程》课程作业

    第一题.百元喝酒 作业要求:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒.100元最多可喝多少瓶啤酒?(不允许借啤酒) 思路:利用递归算法,一次性买完,然后递归算出瓶盖和空瓶能换的啤酒数 /** ...

  8. 大数据学习day38----数据仓库01-----区域字典的生成

    更多内容见文档 1. 区域字典的生成 mysql中有如下表格数据 现要将这类数据转换成(GEOHASH码, 省,市,区)如下所示 (1)第一步:在mysql中使用sql语句对表格数据进行整理(此处使用 ...

  9. css相关,position定位详解

    CSS 有两个最重要的基本属性,前端开发必须掌握:display 和 position. display属性指定网页的布局.两个重要的布局,弹性布局flex和网格布局grid. 本文介绍非常有用的po ...

  10. 2021广东工业大学十月月赛 F-hnjhd爱序列

    题目:GDUTOJ | hnjhd爱序列 (gdutcode.cn) 一开始是用双指针从尾至头遍历,但发现会tle!! 后来朋友@77给出了一种用桶的做法,相当于是用空间换时间了. 其中用到的一个原理 ...