matlab聚类算法
‘壹’ 求自适应k均值聚类算法 matlab
function group=Kmeans(k,mid)
%K均值聚类算法
person=load('sample.txt','height','weight');%从文本文件读入数据放入person结构体中
% person=person(1:10,:);
num=size(person,1);%获得person结构体大小
for i=1:k%赋初始值,划分为k类,每类只有选定的k个对象中的一个对象,每类的中心为选定的k个对象的值
class{i}(1)=mid(i);
middle(i,1)=person(mid(i),1);
middle(i,2)=person(mid(i),2);
end
distance=ComputDistance(person,middle,num,k);%计算每个样本跟各类中心的距离
temp=cell(size(class));
flag=isSL(temp,class,k);
while flag==0%当分类不收敛的时候
temp=class;
class=cell(size(temp));
for i=1:num
[value,index]=min(distance(i,:)); %找到每个样本距离哪个类最近
dtemp=[i];
class{index}=[class{index},dtemp]; %将该样本划分到距离最近的类中
end
middle=ComputMid(person,class,k);%重新计算各类中心点
distance=ComputDistance(person,middle,num,k);%重新计算各样本与各类的距离
flag=isSL(temp,class,k);%判断当前类有没有变化
end
celldisp(class)
for i=1:k
group{i}=person(class{i}(:),:);
end
for i=1:k
covMat=cov(group{i});
fprintf('第%d类的均值向量为:\n',i);
disp(middle(i,:))
fprintf('第%d类的协方差矩阵为:\n',i);
disp(covMat)
end
function m=ComputMid(person,class,k)
%计算各类中心点
%结果返回到m矩阵中
for i=1:k
length=size(class{i},1);
csum1=0;
csum2=0;
for j=1:length
csum1=csum1+person(class{i}(j),1);
csum2=csum2+person(class{i}(j),2);
end
m(i,1)=csum1/length;
m(i,2)=csum2/length;
% m(i,1)=sum(person(class{i}(:),1))/size(class{i},1);
% m(i,2)=sum(person(class{i}(:),2))/size(class{i},1);
end
function d=ComputDistance(person,middle,num,k)
%计算每个样本跟各类中心的距离
%结果返回到d矩阵中
for i=1:num
for j=1:k
d(i,j)=sqrt((person(i,1)-middle(j,1)).^2+(person(i,2)-middle(j,2)).^2);
end
end
function flag=isSL(temp,class,k)
%判断当前类有没有变化即是否收敛
%有变化则返回0,否则返回1
for i=1:k
if size(temp{i},1)==size(class{i},1)
for j=1:size(class{i},1)
if temp{i}(j)~=class{i}(j)
flag=0;
return;
end
end
flag=1;
else
flag=0;
return;
end
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
‘叁’ 聚类算法的准确性在matlab中用什么函数
聚类分析的概念主要是来自多元统计分析,例如,考虑二维坐标系上有散落的许多点,这时,需要对散点进行合理的分类,就需要聚类方面的知识。
‘肆’ 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实现多维k-means聚类算法
function [ labels ] = kmeans_clustering( data, k )
[num,~]=size(data);
ind = randperm(num);
ind = ind(1:k);
centers = data(ind,:);
d=inf;
labels = nan(num,1);
while d>0
labels0 = labels;
dist = pdist2(data, centers);
[~,labels] = min(dist,[],2);
d= sum(labels0 ~= labels);
for i=1:k
centers(i,:)=mean(data(labels == i,:),1);
end
end
end
‘陆’ 谁有matlab模糊聚类算法进行图像分割的源程序啊
%%%%%%%%%%%%%%%模糊聚类%%%%%%%%%%%%%%%%%%%%%%%
clear;
loadF:\从0开始\数据\data.txt;
INPUTDATA=data;
%--------原始数据标准化-------%
disp('请选择原始数据标准化方式:');
disp('<1-总和标准化|2-标准差标准化|3-极大值标准化|4-极差标准化>');
wayforstand=input('请输入:');
switchwayforstand
case1,
DATAFORCLUS=standard_use_sum(INPUTDATA);
case2,
DATAFORCLUS=standard_use_std(INPUTDATA);
case3,
DATAFORCLUS=standard_use_max(INPUTDATA);
case4,
DATAFORCLUS=standard_use_jc(INPUTDATA);
otherwise
error('您的输入不符合要求->执行结束!!!');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基于模糊等价关系的模糊聚类%%%%%%%%%%%%%%%%%%%%%%
%----------构造相似关系-----------%
numrows=size(DATAFORCLUS,1);
numcols=size(DATAFORCLUS,2);
disp('请选择对象之间相似性统计量的方式:');
disp('<1-相关系数法|2-夹角余弦法|3-指数相似系数法|4-绝对值指数法|5-算术平均最小法|6-最大最小值法|7-绝对值差数法|8-数量积法>');
wayforr_ij=input('请输入:');
switchwayforr_ij
case1,%-----------------------------------相关系数法
fori=1:numrows,
forj=1:numrows,
meani=mean(DATAFORCLUS(i,:));meanj=mean(DATAFORCLUS(j,:));
simiR(i,j)=sum((DATAFORCLUS(i,:)-meani).*(DATAFORCLUS(j,:)-meanj))/...
(sqrt(sum((DATAFORCLUS(i,:)-meani).^2))*sqrt(sum((DATAFORCLUS(j,:)-meanj).^2)));
end
end
case2,%-----------------------------------夹角余弦法
fori=1:numrows,
forj=1:numrows,
simiR(i,j)=sum(DATAFORCLUS(i,:).*DATAFORCLUS(j,:))/...
(sqrt(sum(DATAFORCLUS(i,:).*DATAFORCLUS(i,:)))*sqrt(sum(DATAFORCLUS(j,:).*DATAFORCLUS(j,:))));
end
end
case3,%-----------------------------------指数相似系数法
case4,%-----------------------------------绝对值指数法
case5,%-----------------------------------算术平均最小法
case6,%-----------------------------------最大最小值法
case7,%-----------------------------------绝对值差数法
case8,%-----------------------------------数量积法
otherwise
error('您的输入不符合要求->执行结束!!!');
end
%-------改造成等价关系----------%
sign=0;
numselfmul=1;
simiRk=eye(numrows);
equi_tem=simiR;
whilesign==0,
fori=1:numrows,
forj=1:numrows,
forc=1:numrows,
rij_temp(c)=min([equi_tem(i,c)equi_tem(c,j)]);
end
simiRk(i,j)=max(rij_temp);
end
end
%--------------%
ifsum(sum(simiRk-equi_tem,1))~=0,
numselfmul=numselfmul+1;
equi_tem=simiRk;
else
sign=1;
break
end
%--------------%
end
ifsign==1,
disp('从相似矩阵到等价矩阵改造成功!!!');
else
disp('从相似矩阵到等价矩阵改造失败!!!');
end
equiR=simiRk;
numclass=input('请输入聚类数:');
%---------在不同的截集水平进行聚类--------------%
clasc=0;
comp_vec(1,1:numrows)=0;
index=0;
clasc=0;
tip=0;
alpha=0;
temnumeachclass=0;
while(tip==0),
%alpha=input('请输入进行分类的截集水平λ:');
%alpha=0.5;%调试
if(alpha<0||alpha>1),
error('您输入的截集水平λ不符合分类要求->执行结束!!!');
end
comp_arr=ones(numrows)*alpha;
result_arr=(equiR>=comp_arr);%--------------------result_arr判断矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%捡菜算法
fori=1:numrows,
ifsum(comp_vec(1,:)==result_arr(i,:))<numrows,%-----------说明没有归类
temnumeachclass=0;
%numeachclass(clasc)=index-temnumeachclass;
temsave=result_arr(i,:);
forj=1:numrows,
ifsum(result_arr(j,:)==temsave)==numrows,
index=index+1;
class(index)=j;
result_arr(j,:)=0;%--------------------说明已经被归类
temnumeachclass=temnumeachclass+1;
end
end
clasc=clasc+1;
nec(clasc)=temnumeachclass;
else
continue;
end
end
ifclasc>=numclass,
tip=1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%当模糊分类的数目小于等于所给出的类数时退出循环体
disp('成功!!!');
else
clearclass;
clearnumeachclass;
clearnec;
clasc=0;
index=0;
temnumeachclass=0;
alpha=alpha+0.01;
end
end
%----取聚类结果----%
num=0;
n=0;
fori=1:clasc,
forj=1:nec(i),
num=num+1;
n=n+1;
CLUS(n,:)=INPUTDATA(class(num),:);
end
n=n+1;
CLUS(n,:)=inf;
end
%formatsingle(CLUS)
lenexport=size(CLUS,1);
fori=1:lenexport,
RESULT(i,:)=sprintf('%15.2f',CLUS(i,:));
end
RESULT
‘柒’ matlab 聚类算法silhouette
~的意思的无视这个项,仅生成h。
snapnaw,拍摄图像快照以包括在发布文档中。代码中没有涉及发布文档,所以没有显示。
参考网页网页链接
‘捌’ 怎么用Matlab计算聚类算法的正确率问题
我把K-mediods的matlab代码贴出来,你好好学习一下
function label = kmedoids( data,k,start_data )
% kmedoids k中心点算法函数
% data 待聚类的数据集,每一行是一个样本数据点
% k 聚类个数
% start_data 聚类初始中心值,每一行为一个中心点,有cluster_n行
% class_idx 聚类结果,每个样本点标记的类别
% 初始化变量
n = length(data);
dist_temp1 = zeros(n,k);
dist_temp2 = zeros(n,k);
last = zeros(n,1);
a = 0;
b = 0;
if nargin==3
centroid = start_data;
else
centroid = data(randsample(n,k),:);
end
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
while any(label~=last)
for a = 1:k
temp2 = ones(numel(data(label==a)),1);
temp3 = data(label==a);
for b = 1:n
temp4 = temp2*data(b,:);
temp5 = sum((temp3-temp4).^2,2);
dist_temp2(b,a) = sum(temp5,1);
end
end
[~,centry_indx] = min(dist_temp2,[],1);
last = label;
centroid = data(centry_indx,:);
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
end
end
‘玖’ 求MATLAB实现canopy-kmeans聚类算法的完整代码
canopy聚类算法的MATLAB程序
‘拾’ 如何对点进行k均值聚类算法 matlab
在聚类分析中,K-均值聚类算法(k-means algorithm)是无监督分类中的一种基本方法,其也称为C-均值算法,其基本思想是:通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果.\x0d假设要把样本集分为c个类别,算法如下:\x0d(1)适当选择c个类的初始中心;\x0d(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类,\x0d(3)利用均值等方法更新该类的中心值;\x0d(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代.\x0d下面介绍作者编写的一个分两类的程序,可以把其作为函数调用.\x0d%% function [samp1,samp2]=kmeans(samp); 作为调用函数时去掉注释符\x0dsamp=[11.1506 6.7222 2.3139 5.9018 11.0827 5.7459 13.2174 13.8243 4.8005 0.9370 12.3576]; %样本集\x0d[l0 l]=size(samp);\x0d%%利用均值把样本分为两类,再将每类的均值作为聚类中心\x0dth0=mean(samp);n1=0;n2=0;c1=0.0;c1=double(c1);c2=c1;for i=1:lif samp(i)<th0\x0dc1=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;\x0dc11=c1;c22=c2; %聚类中心while t==0samp1=zeros(1,l);\x0dsamp2=samp1;n1=1;n2=1;for i=1:lif abs(samp(i)-c11)<abs(samp(i)-c22)\x0dsamp1(n1)=samp(i);\x0dcl1=cl1+samp(i);n1=n1+1;\x0dc11=cl1/n1;elsesamp2(n2)=samp(i);\x0dcl2=cl2+samp(i);n2=n2+1;\x0dc22=cl2/n2;endendif c11==c1 && c22==c2t=1;endcl1=c11;cl2=c22;\x0dc1=c11;c2=c22;\x0dend %samp1,samp2为聚类的结果.\x0d初始中心值这里采用均值的办法,也可以根据问题的性质,用经验的方法来确定,或者将样本集随机分成c类,计算每类的均值.\x0dk-均值算法需要事先知道分类的数量,这是其不足之处.