了凡春秋USTC

谱聚类

http://chunqiu.blog.ustc.edu.cn/?p=505

最近忙着写文章,好久不写博客了。最近看到一个聚类方法--谱聚类,号称现代聚类方法,看到它简洁的公式推导、实现代码,不禁要尝试一把。关于它的理论,google一搜有很多博客讲,这里就不赘述了,反正最后还是归结为一个SVD分解问题,参考网址如下

    看到下面的图,乐了
    上网搜索,看到了几个相关的工具箱,下面一一介绍:
1.这个是加利福尼亚大学一个实验室为他们的论文《Parallel Spectral Clustering in Disributed Systems》而写的测试代码,这篇文章发在IEEE Transactions on Pattern Analysis and Machine Intelligence上,机器学习方面的顶级期刊。不过看了看作者,怎么感觉都是中国人啊,下载地址见http://alumni.cs.ucsb.edu/~wychen/sc.html#FAQ
    压缩包内有Readme,有工具箱的使用介绍,不过由于是为文章效果而写的,所以感觉并不能称得上工具箱吧,我自己编了个测试例子试了试,效果、速度确实不错:
原始待聚类数据
聚类后
    代码如下:
% 谱聚类算法测试
clc
clear
close all
 
% 构造原始数据
ang = 0:pi/200:pi/2*3;
x1 = sin(ang) + randn(size(ang))*0.1;
y1 = cos(ang) + randn(size(ang))*0.1;
x2 = 2.3*sin(ang+pi) + randn(size(ang))*0.1;
y2 = 2.3*cos(ang) + randn(size(ang))*0.1;
x3 = 6*sin(ang+pi/2*3+pi/6) + randn(size(ang))*0.1;
y3 = 5*cos(ang+pi/2*3) + randn(size(ang))*0.1;
 
X = [x1, x2, x3; y1, y2, y3]';
figure
plot(X(:, 1), X(:, 2), '.')
axis equal
 
% 谱聚类
num_neighbors = 20;
block_size = 5;
gen_nn_distance(X, num_neighbors, block_size, 0); % 计算相似矩阵,保存到NN_sym_distance.mat文件中
 
filename = [num2str(num_neighbors), '_NN_sym_distance'];
load(filename)
 
num_clusters = 3;
sigma = 10;
cluster_labels = sc(A, sigma, num_clusters); % 谱聚类
 
figure
plot(X(cluster_labels == 1, 1), X(cluster_labels == 1, 2), 'r.', ...
    X(cluster_labels == 2, 1), X(cluster_labels == 2, 2), 'b.', ...
    X(cluster_labels == 3, 1), X(cluster_labels == 3, 2), 'g.')
axis equal
 
2.有个matlab exchange上的工具箱,是德国斯图加特大学一个博士整齐其博士论文的研究而写的GUI,下载链接如下(压缩包内有其博士论文)
    同样,Readme里有详细使用说明,只要运行MAIN.m文件即可弹出GUI。运行可能会出个警告
影响不大,Readme里是这么说的:
recommended: export_fig configured to save to pdf files (Mathworks File Exchange ID #23629)
如果你不用保存图片,不用理会。
    GUI如下
    对其给的twomoons的例子做测试,结果如下
额,是不是有点自己打脸的赶脚!自己给的例子,效果也不够完美。。。估计调整一些参数能得到理想的效果吧!
 
Matlab exchange上还有个谱聚类的文件,提供了谱聚类各种算法的简单实现,对于学习谱聚类具体实现挺有帮助!
 
3.很多介绍谱聚类的博客都有提到算法的matlab实现,因为实现代码太简单了,如下
% 谱聚类简单实现
function idx = spectral_clustering(W, k)
D = diag(sum(W));
L = D-W;
opt = struct('issym', true, 'isreal', true);
[V, ~] = eigs(L, D, k, 'SM', opt);
idx = kmeans(V, k);
end
 
    谱聚类复杂的理论最终归结为代码就这几句,当然这是考虑最简化的情况,如果考虑细节,就得靠上面提到的工具箱了。对于这个代码,我做了测试,效果还行(使用第一个代码里的计算相似矩阵的函数),不过多次测试的效果说明,不同数据对效果是有影响的,有时就得不到好的分离效果。
% 谱聚类算法测试
clc
clear
close all
 
% 构造原始数据
ang = 0:pi/200:pi/2*3;
x1 = sin(ang) + randn(size(ang))*0.1;
y1 = cos(ang) + randn(size(ang))*0.1;
x2 = 2.3*sin(ang+pi) + randn(size(ang))*0.1;
y2 = 2.3*cos(ang) + randn(size(ang))*0.1;
x3 = 6*sin(ang+pi/2*3+pi/6) + randn(size(ang))*0.1;
y3 = 5*cos(ang+pi/2*3) + randn(size(ang))*0.1;
 
X = [x1, x2, x3; y1, y2, y3]';
figure
plot(X(:, 1), X(:, 2), '.')
axis equal
 
% 谱聚类
num_neighbors = 20;
block_size = 5;
gen_nn_distance(X, num_neighbors, block_size, 0); % 计算相似矩阵,保存到NN_sym_distance.mat文件中
 
filename = [num2str(num_neighbors), '_NN_sym_distance'];
load(filename)
 
idx = spectral_clustering(A, 3);
 
figure
plot(X(idx == 1, 1), X(idx == 1, 2), 'r.', ...
    X(idx == 2, 1), X(idx == 2, 2), 'b.', ...
    X(idx == 3, 1), X(idx == 3, 2), 'g.')
axis equal
 
 
    如果对那个博士论文的例子做测试,效果如下
貌似这个图确实很难分,这个效果不如那个德国博士的效果。
% 谱聚类算法测试
clc
clear
close all
 
% 构造原始数据
M = csvread('twomoon-2d-50s.test.csv');
X = M(:, 2:3);
 
figure
plot(X(:, 1), X(:, 2), '.')
axis equal
 
% 谱聚类
num_neighbors = 20;
block_size = 5;
gen_nn_distance(X, num_neighbors, block_size, 0); % 计算相似矩阵,保存到NN_sym_distance.mat文件中
 
filename = [num2str(num_neighbors), '_NN_sym_distance'];
load(filename)
 
idx = spectral_clustering(A, 2);
 
figure
plot(X(idx == 1, 1), X(idx == 1, 2), 'r.', ...
    X(idx == 2, 1), X(idx == 2, 2), 'b.')
axis equal
 
    如果用第一个工具箱的方法再测试这个例子
效果也就那样!
% 谱聚类算法测试
clc
clear
close all
 
% 构造原始数据
M = csvread('twomoon-2d-50s.test.csv');
X = M(:, 2:3);
 
figure
plot(X(:, 1), X(:, 2), '.')
axis equal
 
% 谱聚类
num_neighbors = 20;
block_size = 5;
gen_nn_distance(X, num_neighbors, block_size, 0); % 计算相似矩阵,保存到NN_sym_distance.mat文件中
filename = [num2str(num_neighbors), '_NN_sym_distance'];
load(filename)
 
num_clusters = 2;
sigma = 10;
cluster_labels = sc(A, sigma, num_clusters); % 谱聚类
 
figure
plot(X(cluster_labels == 1, 1), X(cluster_labels == 1, 2), 'r.', ...
    X(cluster_labels == 2, 1), X(cluster_labels == 2, 2), 'b.')
axis equal
 

[zz]谱聚类的更多相关文章

  1. 谱聚类python实践

    聚类后: # -*- coding: utf-8 -*-"""Created on 09 05 2017 @author: similarface"" ...

  2. 用scikit-learn学习谱聚类

    在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结.这里我们就对scikit-learn中谱聚类的使用做一个总结. 1. scikit-learn谱聚类概述 在s ...

  3. 谱聚类(spectral clustering)原理总结

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

  4. 大数据下多流形聚类分析之谱聚类SC

    大数据,人人都说大数据:类似于人人都知道黄晓明跟AB结婚一样,那么什么是大数据?对不起,作为一个本科还没毕业的小白实在是无法回答这个问题.我只知道目前研究的是高维,分布在n远远大于2的欧式空间的数据如 ...

  5. Laplacian matrix 从拉普拉斯矩阵到谱聚类

    谱聚类步骤 第一步:数据准备,生成图的邻接矩阵: 第二步:归一化普拉斯矩阵: 第三步:生成最小的k个特征值和对应的特征向量: 第四步:将特征向量kmeans聚类(少量的特征向量):

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

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

  7. 【聚类算法】谱聚类(Spectral Clustering)

    目录: 1.问题描述 2.问题转化 3.划分准则 4.总结 1.问题描述 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图 ...

  8. 谱聚类--SpectralClustering

    谱聚类通常会先对两两样本间求相似度. 然后依据相似度矩阵求出拉普拉斯矩阵,然后将每一个样本映射到拉普拉斯矩阵特诊向量中,最后使用k-means聚类. scikit-learn开源包中已经有现成的接口能 ...

  9. 谱聚类(Spectral Clustering)详解

    谱聚类(Spectral Clustering)详解 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似 ...

随机推荐

  1. PYTHON实现DES加密及base64源码

    要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松. 另外,附加base64编码源码 要求:输入秘钥为64位二进制数(有效位为56 ...

  2. win10 64位 mysql安装

    一.安装mysql 1.下载mysql-5.7.15-winx64.zip http://dev.mysql.com/downloads/mysql/ 2.解压缩到D:\ProgramFiles 3. ...

  3. adb获取不了设备List of devices attached

    方法/步骤: 首先找到手机的安装完之后的“设备的硬件id”,第一步右击我的电脑,然后找到设备管理器打开. 在设备管理器中,找到ADB driver然后点开. 然后在详细信息中,点开硬件ID,查看到我的 ...

  4. GPU渲染和GDI

    要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高.相传Vista年代,是这样干的: 硬件渲染的东西在GPU上做完 读回CPU端 把GDI这些用软件渲染 两者混合 拷贝到显存显示 ...

  5. 第三个Sprint总结

    工作进展:项目基本已经完成 工作状况:                                      

  6. 3-Spark高级数据分析-第三章 音乐推荐和Audioscrobbler数据集

    偏好是无法度量的. 相比其他的机器学习算法,推荐引擎的输出更直观,更容易理解. 接下来三章主要讲述Spark中主要的机器学习算法.其中一章围绕推荐引擎展开,主要介绍音乐推荐.在随后的章节中我们先介绍S ...

  7. fcitx error

    (ERROR-2016 /build/fcitx-J2yftF/fcitx-4.2.9.1/src/lib/fcitx/ui.c:165) no usable user interface.(ERRO ...

  8. ipython安装

    sudo pip install jupyter 然后用jupyter notebook来运行

  9. js中排序问题总结

    js的排序中通常使用到sort函数,可以用冒泡排序,插入排序,快速排序,希尔排序,系统方法等方法,本文结束后分享一个用着排序算法的链接,感兴趣可以了解了解. 1.常见的对一般数组进行排序,代码如下: ...

  10. Oracle 数据库SQL性能查看

    作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...