美文网首页
K_Means算法的MATLAB实现

K_Means算法的MATLAB实现

作者: LittleBall | 来源:发表于2017-07-12 17:39 被阅读0次

    K聚类算法的应用很广泛,这里给出一种简单的示范,相比网上的例子,本例中分类点和中心点的个数都可以自定义,但是很多数组也就需要动态定义,导致程序效率较低,欢迎有更好的解法的大神提出改正!

    分类前后示意图:

    % K-Means聚类算法
    clc
    clear all
    close all
    m=200;% 产生m个样本点
    k=3;% 选择K个中心点
    eps=1e-7; % 迭代结束的阈值
    X=100*rand(1,m);% 样本点X坐标
    Y=100*rand(1,m);% 样本点Y坐标
    % 显示聚类前二维点
    figure,subplot(1,2,1),plot(X,Y,'ro'),title('聚类前二维点');xlabel('X轴');ylabel('Y轴');
    % type_num存放k类样本点
    for i=1:k
        eval(['type_',num2str(i),'=[];']);
    end
    % 颜色列表,由于颜色只有六种,k最好不大于6
    color_list={'m','g','b','y','r','k'};
    % 存放初始中心点
    cp=zeros(k,2);
    for i=1:k
        cp(i,:)=[X(i) Y(i)];
    end
    % 存放第i个点到第j个点的距离
    len=zeros(m,3);
    % 计算样本点到k个中心点的距离
    % 若某个样本i到某个中心点j的距离最小,则把样本点归到j类
    % m类分完后,计算每一类均值向量作为新的聚类中心
    % 若新的聚类中心与原来的聚类中心之差小于设定的阈值
    % 结束迭代
    times=0;% 记录迭代次数
    error=zeros(1,k);
    while(1)
        for i=1:m
            for j=1:k
                len(i,j)=sqrt((cp(j,1)-X(i))^2+(cp(j,2)-Y(i))^2);
            end
            % 离第num类中心点距离最小,就把它放到type_num中
            flag=find(len(i,:)==min(len(i,:)));
            eval(['type_',num2str(flag),'(size((type_',num2str(flag),'),1)+1,:)=[X(i) Y(i)];']);
        end
        times=times+1;% 迭代次数加1
        % 存放新的中心点
        for i=1:k
            cp(i+times*k,:)=eval(['[mean(type_',num2str(i),'(:,1)) mean(type_',num2str(i),'(:,2))]']);
            tmp=cp(i+(times-1)*k,:)-cp(i+times*k,:);
            error(i)=sum(tmp.^2);
        end
        if max(error)<eps
            break
        end
    end
    % 显示聚类后结果
    cpx=cp(1+(times-1)*k:k+(times-1)*k,1);
    cpy=cp(1+(times-1)*k:k+(times-1)*k,2);
    subplot(1,2,2)
    for i=1:k
        eval(['plot(type_',num2str(i),'(:,1),','type_',num2str(i),'(:,2),[color_list{ceil(6*rand)},''o''])']);
        text(cpx(i),cpy(i),['第',num2str(i),'类中心点'])
        hold on;
    end
    plot(cpx,cpy,'r*');
    title(['聚类后二维点(迭代',num2str(times),'次)']);xlabel('X轴');ylabel('Y轴');

    相关文章

      网友评论

          本文标题:K_Means算法的MATLAB实现

          本文链接:https://www.haomeiwen.com/subject/eynbhxtx.html