⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmeans.m

📁 K-MEANS算法程序(MATLAB环境)
💻 M
字号:
%------------------------------------------------------------
% K- Means Clustering Algorithm
%-----------------------------------------------------------
clear all
%生成数据集,共生成三个类
%--------------------------------------------------------
mu1=[0 10];
sigma1=[1 0;0 1];
cluster1 = mvnrnd(mu1,sigma1,200);
mu2=[10 0];
sigma2=[1 .5;.5 2];
cluster2 = mvnrnd(mu2,sigma2,200);
mu3=[0 0];
sigma3=[3 1;1 2];
cluster3 = mvnrnd(mu3,sigma3,200);
data=[cluster1;cluster2;cluster3];
plot(data(:,1),data(:,2),'r.')
hold on;
%---------------------------------------------------------
%数据的初始化
%------------------------------------------------------
k=3;
dist=zeros(k,1);
[dataNumber,cols]=size(data);
indexdata=zeros(dataNumber,2);
for i=1:dataNumber
    indexdata(i,1)=i;
end

%生成质心集和质心集副本并初始化
center=zeros(k,cols);
centercopy=zeros(k,cols);
flag=50;

for i=1:k
    centercopy(i,1)=data(i,1);
    centercopy(i,2)=data(i,2);
end
plot(centercopy(:,1),centercopy(:,2),'go','MarkerSize',10);



%计算每个数据到各质心的距离,划分聚类
while(flag~=0)
    clusterNumber=ones(k,1);
    for i=1:dataNumber
                winner=1;
        dist(winner)=inf; 
            for j=1:k
                dist(j)=(centercopy(j,1)-data(i,1))*(centercopy(j,1)-data(i,1))+(centercopy(j,2)-data(i,2))*(centercopy(j,2)-data(i,2));      
            end
            
            for j=2:k
                if(dist(j)<dist(winner))
                    winner=j;
                end
            end
            
        indexdata(i,2)=winner;
        center(winner,1)=center(winner,1)+data(i,1);
        center(winner,2)=center(winner,2)+data(i,2);
        clusterNumber(winner)=clusterNumber(winner)+1;
    end

    %计算更新的簇均值
    for j=1:k
        center(j,1)=center(j,1)/clusterNumber(j);
        center(j,2)=center(j,2)/clusterNumber(j);
    end
    
    flag=flag-1;
    centercopy=center;
%     if(sum(sum(center==centercopy))==1)
%         flag=1;
%     else
%         centercopy=center;
%     end
end

%draw center and cluster
for i=1:dataNumber
    switch  indexdata(i,2)
        case 1
            plot(data(i,1),data(i,2),'r.');
            hold on;
        case 2
            plot(data(i,1),data(i,2),'g.');
            hold on;
        case 3
            plot(data(i,1),data(i,2),'b.');
            hold on;
    end
end
plot(center(:,1),center(:,2),'ko','MarkerSize',10);


        




    
    
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -