聚类算法的matlab代码
❶ 模糊 C 均值聚类 FCM 算法MATLAB代码问题(还有一周就要答辩了,求解答啊)
我也做这个
❷ matlab如何代码实现分裂层次聚类
近需要用到层次聚类,发现在Matlab上很容易实现,下面是代码加详细注释
[plain] view plain
clear all
clc
close all
mdist=input('输入坐标文件名字\n');
disp('读取数据坐标')
%获取坐标
%文件为二维的坐标,第一列为x轴坐标,第二列为y轴坐标
xx=load(mdist);
%获取数据的个数存至number
[number, row]=size(xx);
%获取距离矩阵,第二参数指定距离计算方法
%可选参数有'euclidean':欧氏距离(默认);'seuclidean':标准化欧氏距离;
%'mahalanobis':马氏距离;'cityblock':布洛克距离;'minkowski':明可夫斯基距离;
%'cosine':余弦距离 'correlation':相关性 'hamming':汉明距离 'jaccard':Jaccard相似度
%'chebychev':Chebychev距离。
yy=pdist(xx,'euclidean');
%获取聚类,第二参数指定层次聚类方式
%'single':单连通,最短距离法(默认);'complete':全连通,最长距离法;'average':未加权平均距离法;
%'weighted': 加权平均法;'centroid': 质心距离法;'median':加权质心距离法;'ward':内平方距离法(最小方差算法)
zz=linkage(yy,'single');
%指定获取簇类个数
Ncluster=input('输入类个数\n');
%获取指定Ncluster个数的聚类结果
c = cluster( zz,'maxclust', Ncluster );
%获取绘图所需颜色
%需要用到linspecer.m文件
%下载地址
%http://www.mathworks.com/matlabcentral/fileexchange/42673-beautiful-and-distinguishable-line-colors-+-colormap
if(Ncluster>12)
Color = linspecer( Ncluster );
else
Color = linspecer( Ncluster, 'qualitative' );
end
for i=1:Ncluster
for j = 1:number
if(c(j) == i)
hold on
plot(xx(j,1),xx(j,2),'o','MarkerFaceColor',Color(i,:),'MarkerEdgeColor',Color(i,:))
end
end
end
❸ matlab图像聚类分割算法 求大神告知以下代码是用了什么方法还有怎么把图像分割和聚类算法结合在一起。
用了K均值聚类算法,即求特征点到两个聚类中心的距离,哪个小就将他归于哪一类中,即D1和D2
❹ 求MATLAB实现canopy-kmeans聚类算法的完整代码
canopy聚类算法的MATLAB程序
❺ 有谁用matlab做过聚类算法
分类算法,参数分别为G(相似度矩阵),r(邻居门限),lambda(类门限),返回值A,一个cell数组,每个元素是一个向量,包含了一个类的所有元素。
function A=BFSN_Algorithm(G,r,lambda)
%广度优先搜索邻居的聚类算法实现
%G为相似度矩阵
%r和lambda为参数
%r为邻居门限,相似度大于r即为邻居
%lambda门限
%未分类元素对于某类的所有元素,如果是邻居则令X(i)=1,否则为0.i为类元素的下标
%对X求和并除以类元素个数,若此值大于lambda门限,则该未分类元素属于这类
%打开计时器
tic
%A为聚类结果
A={};
%k为分类计数
k=1;
%n为待分类元素个数
n=size(G,1);
%构建元素向量
member=1:n;
%只要member中还有未分类的元素就继续循环
while numel(member)~=0
%从member中取出一个元素a
a=member(1);
%新建空类A并将a送入Ak类
Ak=a;
%从member中删除a
member(1)=[];
%扫描member中的所有元素
%queue为广度优先搜索使用的队列
%将a送入queue中
queue=a;
%已访问过的元素
visited=zeros(1,n);
%如果队列非空说明还有没有检验过的邻居
while numel(queue)~=0
%一个元素出队
p=queue(1);
queue(1)=[];
%扫描member中所有元素
for count=1:numel(member)
%用member(count)作为待分类的元素
%p是从queue中取出,找到p的所有未访问邻居
if G(p,member(count))>r && visited(member(count))==0
%满足if的member(count)是未访问过的邻居
%放入queue中
queue=[queue member(count)];
%member(count)已经访问过了
visited(member(count))=1;
if sum(G(member(count),Ak)>r)/numel(Ak)>=lambda
%满足if的元素属于Ak类,根据lambda门限判断
Ak=[Ak member(count)];
member(count)=-1;
end
end
end
%删除member中已分类的元素
member(member==-1)=[];
end
%将Ak保存在cell数组A的第k个位置
A{k}=Ak;
%k指向下一个分类
k=k+1;
end
%关闭计时器
toc
由于编写的时候比较仓促,应该有很大的优化的余地。
plotAllClass.m
绘制已分类数据的图形,参数:data元素数据,A分类表,一个cell数组,调用BFSN_Algorithm得到。
function plotAllClass(data,A)
%data:m行2列的矩阵,m行代表m个元素,
%第一列为每个元素的横坐标
%第二列为每个元素的纵坐标
%A为分类列表,
%有c个元素的cell数组
%每个元素是一个向量
%包含了一个分类的所有元素在data中的行
%n=类别数
n=numel(A);
%绘图图案列表
style=['r*';'g*';'b*';'c*';'m*';'y*';'k*';...
'r+';'g+';'b+';'c+';'m+';'y+';'k+';...
'rs';'gs';'bs';'cs';'ms';'ys';'ks';...
'rp';'gp';'bp';'cp';'mp';'yp';'kp';...
'rh';'gh';'bh';'ch';'mh';'yh';'kh';...
'rd';'gd';'bd';'cd';'md';'yd';'kd';...
'ro';'go';'bo';'co';'mo';'yo';'ko';...
'rx';'gx';'bx';'cx';'mx';'yx';'kx';...
'rv';'gv';'bv';'cv';'mv';'yv';'kv';...
'r<';'g<';'b<';'c<';'m<';'y<';'k<';...
'r>';'g>';'b>';'c>';'m>';'y>';'k>';...
'r^';'g^';'b^';'c^';'m^';'y^';'k^';...
'r.';'g.';'b.';'c.';'m.';'y.';'k.'];
figure;
hold on;
for count=1:n
plot(data(A{count},1),data(A{count},2),style(count,:));
end
hold off;
这个函数最多能够绘制91个类别,如果有超过91个类,函数会出错。
show.m
包含了一个完整的流程,包括数据生成,相似度矩阵生成,分类,类别绘制。
%show.m
data=rand(200,2);
figure;
plot(data(:,1),data(:,2),'+');
G=createSimiR(data);
A=BFSN_Algorithm(G,0.95,0.95);
plotAllClass(data,A);
❻ 如何编写求K-均值聚类算法的Matlab程序
在聚类分析中,K-均值聚类算法(k-means
algorithm)是无监督分类中的一种基本方法,其也称为C-均值算法,其基本思想是:通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为c个类别,算法如下:
(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类,
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
下面介绍作者编写的一个分两类的程序,可以把其作为函数调用。
%%
function
[samp1,samp2]=kmeans(samp);
作为调用函数时去掉注释符
samp=[11.1506
6.7222
2.3139
5.9018
11.0827
5.7459
13.2174
13.8243
4.8005
0.9370
12.3576];
%样本集
[l0
l]=size(samp);
%%利用均值把样本分为两类,再将每类的均值作为聚类中心
th0=mean(samp);n1=0;n2=0;c1=0.0;c1=double(c1);c2=c1;for
i=1:lif
samp(i)<th0
c1=c1+samp(i);n1=n1+1;elsec2=c2+samp(i);n2=n2+1;endendc1=c1/n1;c2=c2/n2;
%初始聚类中心t=0;cl1=c1;cl2=c2;
c11=c1;c22=c2;
%聚类中心while
t==0samp1=zeros(1,l);
samp2=samp1;n1=1;n2=1;for
i=1:lif
abs(samp(i)-c11)<abs(samp(i)-c22)
samp1(n1)=samp(i);
cl1=cl1+samp(i);n1=n1+1;
c11=cl1/n1;elsesamp2(n2)=samp(i);
cl2=cl2+samp(i);n2=n2+1;
c22=cl2/n2;endendif
c11==c1
&&
c22==c2t=1;endcl1=c11;cl2=c22;
c1=c11;c2=c22;
end
%samp1,samp2为聚类的结果。
初始中心值这里采用均值的办法,也可以根据问题的性质,用经验的方法来确定,或者将样本集随机分成c类,计算每类的均值。
k-均值算法需要事先知道分类的数量,这是其不足之处。
❼ OPTICS聚类算法的matlab实现
OPTICS聚类算法代码,从http://www.pudn.com/downloads238/sourcecode/math/detail1113278.html
该处下载。
% -------------------------------------------------------------------------
% Function:
% [RD,CD,order]=optics(x,k)
% -------------------------------------------------------------------------
% Aim:
% Ordering objects of a data set to obtain the clustering structure
% -------------------------------------------------------------------------
% Input:
% x - data set (m,n); m-objects, n-variables
% k - number of objects in a neighborhood of the selected object
% (minimal number of objects considered as a cluster)
% -------------------------------------------------------------------------
% Output:
% RD - vector with reachability distances (m,1)
% CD - vector with core distances (m,1)
% order - vector specifying the order of objects (1,m)
% -------------------------------------------------------------------------
% Example of use:
% x=[randn(30,2)*.4;randn(40,2)*.5+ones(40,1)*[4 4]];
% [RD,CD,order]=optics(x,4)
% -------------------------------------------------------------------------
%
function [RD,CD,order]=optics(x,k)
[m,n]=size(x);
CD=zeros(1,m);
RD=ones(1,m)*10^10;
% Calculate Core Distances
for i=1:m
D=sort(dist(x(i,:),x));
CD(i)=D(k+1);
end
order=[];
seeds=[1:m];
ind=1;
while ~isempty(seeds)
ob=seeds(ind);
seeds(ind)=[];
order=[order ob];
mm=max([ones(1,length(seeds))*CD(ob);dist(x(ob,:),x(seeds,:))]);
ii=(RD(seeds))>mm;
RD(seeds(ii))=mm(ii);
[i1 ind]=min(RD(seeds));
end
RD(1)=max(RD(2:m))+.1*max(RD(2:m));
function [D]=dist(i,x)
% function: [D]=dist(i,x)
%
% Aim:
% Calculates the Euclidean distances between the i-th object and all objects in x
% Input:
% i - an object (1,n)
% x - data matrix (m,n); m-objects, n-variables
%
% Output:
% D - Euclidean distance (m,1)
[m,n]=size(x);
D=(sum((((ones(m,1)*i)-x).^2)'));
if n==1
D=abs((ones(m,1)*i-x))';
end
❽ matlab中聚类算法
聚类分析的概念主要是来自多元统计分析,例如,考虑二维坐标系上有散落的许多点,这时,需要对散点进行合理的分类,就需要聚类方面的知识。模糊聚类分析方法主要针对的是这样的问题:对于样本空间P中的元素含有多个属性,要求对其中的元素进行合理的分类。最终可以以聚类图的形式加以呈现,而聚类图可以以手式和自动生成两种方式进行,这里采用自动生成方式,亦是本文的程序实现过程中的一个关键环节。 这里所实现的基本的模糊聚类的主要过程是一些成文的方法,在此简述如下: 对于待分类的一个样本集U=,设其中的每个元素有m项指标,则可以用m维向量描述样本,即:ui=(i=1,2,...,n)。则其相应的模糊聚类按下列步骤进行:1) 标准化处理,将数据压缩至(0-1)区间上,这部分内容相对简单,介绍略。(参[1])2) 建立模糊关系:这里比较重要的环节之一,首先是根据逗距离地或其它进行比较的观点及方法建立模糊相似矩阵,主要的逗距离地有:Hamming 距离: d(i,j)=sum(abs(x(i,k)-x(j,k))) | k from 1 to m (| k from 1 to m表示求和式中的系数k由1增至m,下同)Euclid 距离: d(i,j)=sum((x(i,k)-x(j,k))^2) | k from 1 to m 非距离方法中,最经典的就是一个夹角余弦法: 最终进行模糊聚类分析的是要求对一个模糊等价矩阵进行聚类分析,而由相似矩阵变换到等价矩阵,由于相似矩阵已满足对称性及自反性,并不一定满足传递性,则变换过程主要进行对相似矩阵进行满足传递性的操作。使关系满足传递性的算法中,最出名的,就是Washall算法了,又称传递闭包法(它的思想在最短路的Floyd算法中亦被使用了)。 算法相当简洁明了,复杂度稍大:O(log2(n)*n^3),其实就是把一个方阵的自乘操作,只不过这里用集合操作的交和并取代了原先矩阵操作中的*和+操作,如下:(matlab代码)%--washall enclosure algorithm--%unchanged=0;while unchanged==0 unchanged=1; %--sigma:i=1:n(combine(conj(cArr(i,k),cArr(k,j)))) for i=1:cArrSize for j=1:cArrSize mergeVal=0; for k=1:cArrSize if(cArr(i,k)<=cArr(k,j)&&cArr(i,k)>mergeVal) mergeVal=cArr(i,k); elseif(cArr(i,k)>cArr(k,j)&&cArr(k,j)>mergeVal) mergeVal=cArr(k,j); end end if(mergeVal>cArr(i,j)) CArr(i,j)=mergeVal; unchanged=0; else CArr(i,j)=cArr(i,j); end end end %-- back--% for i=1:cArrSize for j=1:cArrSize cArr(i,j)=CArr(i,j); end endend