怎样用matlab实现多维K-means聚类算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用matlab实现多维K-means聚类算法相关的知识,希望对你有一定的参考价值。

参考技术A 直接用kmeans函数。。。
idx = kmeans(X,k)
idx = kmeans(X,k,Name,Value)
[idx,C] = kmeans(___)
[idx,C,sumd] = kmeans(___)
[idx,C,sumd,D] = kmeans(___)
idx = kmeans(X,k) performs k-means clustering to partition the observations of the n-by-p data matrix X into k clusters, and returns an n-by-1 vector (idx) containing cluster indices of each observation. Rows of X correspond to points and columns correspond to variables.
By default, kmeans uses the squared Euclidean distance measure and the k-means++ algorithm for cluster center initialization.
example
idx = kmeans(X,k,Name,Value) returns the cluster indices with additional options specified by one or more Name,Value pair arguments.
For example, specify the cosine distance, the number of times to repeat the clustering using new initial values, or to use parallel computing.
example
[idx,C] = kmeans(___) returns the k cluster centroid locations in the k-by-p matrix C.
example
[idx,C,sumd] = kmeans(___) returns the within-cluster sums of point-to-centroid distances in the k-by-1 vector sumd.
example
[idx,C,sumd,D] = kmeans(___) returns distances from each point to every centroid in the n-by-k matrix D.本回答被提问者采纳
参考技术B 这个貌似demo里面有

关于k-means聚类算法的matlab实现

在数据挖掘中聚类和分类的原理被广泛的应用.



聚类即无监督的学习.

分类即有监督的学习.

通俗一点的讲就是:聚类之前是未知样本的分类.而是依据样本本身的相似性进行划分为相似的类簇.

    而分类是已知样本分类,则须要将样本特征和分类特征进行匹配,进而将每一个样本归入给出的特定的类.



因为本文是对聚类算法中的k-means算法的实现,所以接下来主要进行一些聚类算法的介绍.



聚类算法包含多种,可按例如以下分配:

1.划分法:基于此种思想的聚类算法包含 k-means,PAM,CLARA,CLARANS,STIRR.


2.层次法:基于此种思想的聚类算法包含BIRCH,CURE,Rock,Chamlean


3.密度法:基于此种思想的聚类算法包含DBSCAN,OPTICS,DENCluE,FDBSCAN,InCremental DBSCAN


4.网格法:基于此种思想的聚类算法包含STING,WaveCluster,OptiGrid


5.模型法:基于此种思想的聚类算法包含AutoClass,COBWEB,CLASSIT


6.神经网络:基于思想网络的聚类算法有两种:其一 自组织特征映射

       其二  竞争学习





而k-means是基于划分思想.所以在这里介绍一下划分聚类思想:

1.对一组样本数据首先随机确定K个聚类中心


2.后来通过重复的迭代改变聚类中心,使得不断优化.而不断优化的意思是:

同一类样本距离聚类中心越来越近,而不同类样本之间距离越来越远.

而终于收敛于聚类中心的位置不再移动.





既然k-means是基于这种划分思想,那么当然k-means的算法思想精髓和划分思想是一致的.

k-means算法例如以下:

1.设样本为X{x(1),x(2)........}


      2.首先在样本中随机选取k个聚类中心.


      3.然后对除开聚类中心外的样本点计算到每一个聚类中心的距离.

将样本归类到距离样本中心近期的样本点.这便实现了最初的聚类


      4.再对每一个类又一次计算其聚类中心.然后又一次对除开聚类中心的样本点计算到三个聚类中心的距离.

 将样本归类到距离样本中心近期的样本点,这便实现了第一次优化聚类.


       5.反复步骤四,直到两次聚类中心的位置不再变化,这便完毕了终于的聚类



K-means matlab实现例如以下:(k=3)

clc;
clear;

ClomStatic=[1,2,3,25,26,27,53,54,55];
len=length(ClomStatic);%求向量ClomStatic的长度

k=3; %给定的类别数目

%产生三个随机整数。随机聚类中心
p=randperm(len);
Temp=p(1:k);
Center=zeros(1,k);
for i=1:k
    Center(i)=ClomStatic(Temp(i));
end



%计算除聚类中心外的样本数据到聚类中心的距离,然后进行聚类
TempDistance=zeros(len,3);
 while 1
    
    Circulm=1;
    
    p1=1;
    p2=1;
    p3=1;
    
    JudgeEqual=zeros(1,k);
    if(Circulm~=1)
        clear Group1 Group2 Group3;   
    end
    for i=1:len
        for j=1:3
            TempDistance(i,j)=abs(ClomStatic(i)-Center(j));
        end
        [RowMin RowIndex]=min(TempDistance(i,:));
        if(RowIndex==1)
            Group1(p1)=ClomStatic(i);
            p1=p1+1;
        elseif(RowIndex==2)
            Group2(p2)=ClomStatic(i);
            p2=p2+1;
        elseif(RowIndex==3)
            Group3(p3)=ClomStatic(i);
            p3=p3+1;
        end
    end
     
        len1=length(Group1);
        len2=length(Group2);
        len3=length(Group3);
        
        
        %计算Group1,Group2,Group3的均值
        MeanGroup1=mean(Group1);
        MeanGroup2=mean(Group2);
        MeanGroup3=mean(Group3);

        
        %分别计算每一个类中距离均值近期的一个点作为新的聚类中心
        AbsGroup1=zeros(1,len1);
        for t=1:len1
            AbsGroup1(t)=floor(abs(Group1(t)-MeanGroup1));
        end
        [MaxAbsGroup1 MaxAbsGroup1Index]=min(AbsGroup1);
        NewCenter(1)=Group1(MaxAbsGroup1Index);
        clear AbsGroup1;

        AbsGroup2=zeros(1,len2);
        for t=1:len2
            AbsGroup2(t)=floor(abs(Group2(t)-MeanGroup2));
        end
        [MaxAbsGroup2 MaxAbsGroup2Index]=min(AbsGroup2);
        NewCenter(2)=Group2(MaxAbsGroup2Index);
        clear AbsGroup2;
          
        AbsGroup3=zeros(1,len3);
        for t=1:len3
            AbsGroup3(t)=floor(abs(Group3(t)-MeanGroup3));
        end
        [MaxAbsGroup3 MaxAbsGroup3Index]=min(AbsGroup3);
        NewCenter(3)=Group3(MaxAbsGroup2Index);
        clear AbsGroup3;
        
        %推断新的类和旧类的聚类中心是否不同,不同则继续聚类,否则聚类结束
        JudgeEqual=zeros(1,k);
        for i=1:k
            JudgeEqual=(NewCenter==Center);
        end
        
        S=0;
        for i=1:k
            if(JudgeEqual(i)==1)
                S=S+1;
            end
        end
        
        if(S==3)
            break;
        end
        
        Circulm=Circulm+1;
  end



聚类结果例如以下:

技术分享


不直到是算法的收敛性问题还是代码本身的问题,执行过后会一直执行,此时按ctrl+c中断代码,则聚类结果就出来了.

假设有大神发现原因还望赐教小弟,多多感谢.



转载请注明作者:小刘

































以上是关于怎样用matlab实现多维K-means聚类算法的主要内容,如果未能解决你的问题,请参考以下文章

#大神教你做项目#之K-means聚类算法的MATLAB实现

matlab实现图像检索,在用小波变换提取特征后,怎样用B+树实现kmeans聚类,而不用输入k值

图像聚类基于matlab GUI K-means算法图像聚类含Matlab源码 1787期

常用聚类(K-means,DBSCAN)以及聚类的度量指标:

Matlab实现K-Means聚类算法

关于k-means聚类算法的matlab实现