精华内容
下载资源
问答
  • k-means matlab代码

    2010-09-05 11:43:05
    一种非常现代的聚类算法,比以前的算法功能更加强大,也是建立在以前聚类算法的基础上,利用现代的遗传算法和神经网络算法
  • K-means Matlab代码

    千次阅读 2016-08-17 16:58:32
    K-means的Matlab实现并没有任何难度,之所以要把今天的代码贴出来,主要因为编码的过程中感觉自己写出的程序效率好弱鸡,想通过张量编码的方式优化优化。

    K-means的Matlab实现并没有任何难度,之所以要把今天的代码贴出来,主要因为编码的过程中感觉自己写出的程序效率好弱鸡,想通过张量编码的方式优化优化,但发现好多原函数都忘了【摊手】,只好将弱鸡的代码暂且贴在这里,等撞见好的方法再改进之吧。此外,也提醒提醒自己,遇到美好的代码不应只是欣赏一下就作罢,还应该懂得吸收!

    function kmeans(k)
    D = rand(2, 30);
    C = cell(k);
    order = randperm(30);
    mu = D(:, order(1:k));
    
    for i=1:20
        for l = 1:k
            C{l} = [];
        end
        for j = 1:size(D, 2)
            %d = mu - repmat(D(:,j),1,k);
            for l = 1:k
                d(l) = norm(D(:,j)-mu(:,l));
            end
    
            [~,n] = min(d);
            C{n}(end+1) = j;
        end
        for l=1:k
            mu(:,l)=sum(D(:,C{l}),2)./size(C{l},2);
        end
    end
    for l=1:k
        C{l}
        D1 = D(:,C{l});
        scatter(D1(1,:),D1(2,:));
        hold on
    end
    
    展开全文
  • 用matlab 实现的 k-means 聚类程序代码,很经典的聚类算法。
  • K-MEANS的研究及matlab代码

    千次阅读 2016-08-10 07:58:04
    k-means的目的:将给出的n组数据分成k类(当然一般n>=k的),显然如果n==k那么结果最好应当就是k类里面每一个类是每一个点. 注意几点:1,kmeans的k是必须已知的,也就是我必须预先知道分成几类  2,虽然你给定的是K类...

    k-means的目的:将给出的n组数据分成k类(当然一般n>=k的),显然如果n==k那么最好的结果应当就是k类里面每一个类是一组数据.



    注意几点:1,kmeans的k是必须已知的,也就是我必须预先知道分成几类

                       2,虽然你给定的是K类,但是我最终是有可能跑出来的类数小于初始设定的k,虽然每一个聚类中心都经过初始化,但是最终有的聚类中心可能会不包含一个点,那么这个聚类中心相当于可以省去,即分成k-1类(讲道理这是一件好事,说明原来我认为需要分5类,现在程序跑出来发现4类是最好的,这就达到了处理数据的目的,但是这并不是说我k随便给,最终结果就是最优解,很可能3类是最优,但是4类也能分,但是5类就很难分了,具体比如下面的一个例子) 。

                     (后来的注释: 但是空聚类也有处理方法,就是聚类中心替换为当前距离任意聚类中心最远的点)

                      3,数据可以是任意维度,修改的仅仅是求距离的方式。




    程序流程:

    Step 1:根据给定的k值,初始化k个聚类中心的值(这就看聚类中心是几维的了,如果只有两组数据,就是一个点,如果3组数据,给他初始化3个值就是),初始化为了方便可以选取原来n组数据里面的k个作为聚类中心.

    Step 2:当没有超过迭代次数并且聚类中心仍然在变化进入循环Step3~Step5

    Step3:对于每一个点,计算每一个聚类中心到它的距离,找到最少的距离所对应的聚类中心,则这个点属于这个聚类中心(注意这里面距离如果是2维当然就可以直接是欧氏距离,但是也可以自己定义)

    Step4:修改聚类中心的位置,对于每一个聚类中心把属于它的点所有第i维的数据加起来/该聚类中心拥有的点数=新聚类中心第i维的数据

    (比如是两维,那么就是所有属于它的点的横坐标之和/点数作为新的横坐标,所有属于它的点的纵坐标之和/点数作为新的纵坐标)

    (注意为了清晰Step是这样写,但是很明显累加的步骤在写程序时可以摆在Step3中完成)

    Step5:如果超过迭代次数或者所有的聚类中心都不发生变化跳出循环

    最终就能得到聚类中心和每一个聚类中心拥有的点。

    一下为了方便理解先贴一个二维的2个聚类中心的程序


    clc;
    clear;
    x=[0,0;0,1;1,0;1,1;9,9;2,1;7,8;9,8;10,10;9,10];
    z=x(1:2,1:2);
    z1=zeros(2,2);
    while 1
        count=zeros(2,1);
        allsum=zeros(2,2);
        num1=[];
        num2=[];
        for i=1:size(x,1)
            temp1=sqrt((z(1,1)-x(i,1)).^2+(z(1,2)-x(i,2)).^2);
            temp2=sqrt((z(2,1)-x(i,1)).^2+(z(2,2)-x(i,2)).^2);
            if (temp1<temp2)
                num1=[num1,i];
                count(1)=count(1)+1;
                allsum(1,1)=allsum(1,1)+x(i,1);
                allsum(1,2)=allsum(1,2)+x(i,2);
            else
                num2=[num2,i];
                count(2)=count(2)+1;
                allsum(2,1)=allsum(2,1)+x(i,1);
                allsum(2,2)=allsum(2,2)+x(i,2);
            end
        end
        z1(1,1)=allsum(1,1)/count(1);
        z1(1,2)=allsum(1,2)/count(1);
        z1(2,1)=allsum(2,1)/count(2);
        z1(2,2)=allsum(2,2)/count(2);
        if (z==z1)
            break;
        else
           z=z1;
        end
    end
    disp(z1);
    plot(x(:,1),x(:,2),'r*');
    hold on;
    plot(z1(:,1),z1(:,2),'bo');
    disp(['A类点为:',num2str(num1)]);
    disp(['B类点为:',num2str(num2)]);
    

    效果如下:


    再贴一个二维的任意数量聚类中心的程序

    (这里还是有一些需要注意的地方的,比如最后删除0的方式)

    clc;
    clear;
    time=0;
    k=input('请输入分为几类:');
    x=[0,0;0,1;1,0;1,1;9,9;2,1;7,8;9,8;10,10;9,10;11,10];
    z=x(1:k,1:2);
    z1=zeros(k,2);
    while time<=1000
        count=zeros(k,1);%%%每一个聚类中心有多少个属于它的点
        allsum=zeros(k,2);%%%每一个属于该聚类中心的点到该一个聚类中心的横纵距离之和
        num=[];%%%%记录下属于该聚类中心点的编号
        temp=[];%%%%记录下每一个点到聚类中心的距离,找到最小的那个
        for i=1:size(x,1)
            for j=1:k
            temp(j,1)=sqrt((z(j,1)-x(i,1)).^2+(z(j,2)-x(i,2)).^2);%第i个点到第j个聚类中心的距离
            temp(j,2)=j;
            end
            temp=sortrows(temp,1);%对于temp按照第一列降序排序
            c=temp(1,2);%%%找到最小距离的聚类中心的编号
            count(c)=count(c)+1;%%%属于这个中心的点的数量加1
            num(c,count(c))=i;
            allsum(c,1)=allsum(c,1)+x(i,1);%%%求属于这个聚类中心所有点的横坐标之和
            allsum(c,2)=allsum(c,2)+x(i,2);%%%求属于这个聚类中心所有点的纵坐标之和
        end
        z1(:,1)=allsum(:,1)./count(:);%%%每一个聚类中心所有点横坐标之和/属于该聚类中心的点数为新的横坐标
        z1(:,2)=allsum(:,2)./count(:);
        if (z==z1)%%%如果点不再变化
            break;
        else
           z=z1;
        end
        time=time+1;
    end
    plot(x(:,1),x(:,2),'r*');
    hold on;
    plot(z1(:,1),z1(:,2),'bo');
    num(num==0)=NaN;
    
    for i=1:k
        if (count(i)==0)%%%这是为了防止有些聚类中心没有符合的点
            continue;
        else
        disp(['第',num2str(i),'类为:',num2str(num(i,:))]);
        end
    end

    将程序改成c语言之类的也并不复杂,主要是将矩阵的列改成结构体即可,当然中间步骤可能要稍微修改一下。

    上面的程序对于空聚类的情况采用的是最后拿掉,比如输入3则只会有两个点,更合理的方式是聚类中心替换为当前距离任意聚类中心最远的点

    clc;
    clear;
    time=0;
    k=input('请输入分为几类:');
    x=[0,0;0,1;1,0;1,1;9,9;2,1;7,8;9,8;10,10;9,10;11,10];
    z=x(1:k,1:2);
    z1=zeros(k,2);
    while time<=1000
        count=zeros(k,1);%%%每一个聚类中心有多少个属于它的点
        allsum=zeros(k,2);%%%每一个属于该聚类中心的点到该一个聚类中心的横纵距离之和
        num=[];%%%%记录下属于该聚类中心点的编号
        temp=[];%%%%记录下每一个点到聚类中心的距离,找到最小的那个
        sum(1,1)=0;
        for i=1:size(x,1)
            for j=1:k
            temp(j,1)=sqrt((z(j,1)-x(i,1)).^2+(z(j,2)-x(i,2)).^2);%第i个点到第j个聚类中心的距离
            temp(j,2)=j;
            end
            temp=sortrows(temp,1);%对于temp按照第一列降序排序
            c=temp(1,2);%%%找到最小距离的聚类中心的编号
            if temp(k,1)>sum(1,1)%%%到最远的聚类中心比现在的大
                sum(1,1)=temp(k,1);
                sum(1,2)=temp(k,2);%%%记录下是第几个点
            end
            count(c)=count(c)+1;%%%属于这个中心的点的数量加1
            num(c,count(c))=i;
            allsum(c,1)=allsum(c,1)+x(i,1);%%%求属于这个聚类中心所有点的横坐标之和
            allsum(c,2)=allsum(c,2)+x(i,2);%%%求属于这个聚类中心所有点的纵坐标之和
        end
        for i=1:k
            if count(i)~=0
        z1(i,1)=allsum(i,1)./count(i);%%%每一个聚类中心所有点横坐标之和/属于该聚类中心的点数为新的横坐标
        z1(i,2)=allsum(i,2)./count(i);
            else%%%如果存在空聚类,则为较远的那个点
                z1(i,1)=x(sum(1,2),1);
                z1(i,2)=x(sum(1,2),2);
            end
        end
    % z1(:,1)=allsum(:,1)./count(:);
    % z1(:,2)=allsum(:,2)./count(:);
        if (z==z1)%%%如果点不再变化
            break;
        else
           z=z1;
        end
        time=time+1;
    end
    plot(x(:,1),x(:,2),'r*');
    hold on;
    plot(z1(:,1),z1(:,2),'bo');
    num(num==0)=NaN;
    for i=1:k
        disp(['第',num2str(i),'类为:',num2str(num(i,:))]);
    end



    展开全文
  • K-means, Matlab, 聚类算法,机器学习 有丰富的注释解释代码含义,并提供了修改思路
  • 我的 kmeans matlab 代码

    千次阅读 2015-01-24 14:14:01
    最近,接触了一下聚类算法。其中最简单最经典的莫过于 kmeans 算法。我了解了算法之后,着手编写了 matlab 代码。我的代码只有20几行,比起网上的很多代码都要简洁。 function [cls,ctr]=kmeans(data,K,tol) ...

    最近,接触了一下聚类算法。其中最简单最经典的莫过于 kmeans 算法。我了解了算法之后,着手编写了 matlab 代码。我的代码只有20几行,比起网上的很多代码都要简洁。

    function [cls,ctr]=kmeans(data,K,tol)
    % Kmeans
    % input: data K tol
    % output: cls: clusters, ctr: centroids
    % example:
    % data=rand(100,2);
    % K=4;tol=0.01;
    % [cls,ctr]=kmeans(data,K,tol);
    % clr=['r','k','g','b'];
    % for k=1:K
    %    plot(cls{k}(:,1),cls{k}(:,2),[clr(k),'o']);hold on;    
    %    plot(ctr(k,1),ctr(k,2),[clr(k),'+']);hold on;
    % end
    
    
    if nargin<=2,tol=0;
    end
    
    
    ctr=data(1:K,:);
    N=size(data,1);
    while 1
        % Assignment step
        cls=cell(1,K);                % K clusters
        for l=1:N
            dl=data(l,:);
            d=norm(dl-ctr(1,:));ind=1;
            for k=2:K
                if norm(dl-ctr(k,:))<d,
                    ind=k;d=norm(dl-ctr(k,:));
                end
            end
            cls{ind}=[cls{ind};dl];   % data l is in ind-th cluster
        end
        
        % Update step
        S=0;
        for k=1:K                     % calculate new centroids
            newctr(k,:)=mean(cls{k});
            S=S+norm(newctr(k,:)-ctr(k,:));
        end
        
        ctr=newctr;                   % update the centroids
        if S<=tol,
            break;
        end
    end


    展开全文
  • MATLAB的Kmeans函数实现聚类

    千次阅读 2018-11-18 23:04:48
    转自https://blog.csdn.net/a493823882/article/details/79282425 使用方法:  Idx=kmeans(X,K)  [Idx,C]=kmeans(X,K)   [Idx,C,sumD]=kmeans(X,K)   [Idx,C,sumD,D]=kmeans(X,K)   […]=Kmeans(…...

    转自https://blog.csdn.net/a493823882/article/details/79282425

    使用方法:
          Idx=kmeans(X,K)
          [Idx,C]=kmeans(X,K) 
          [Idx,C,sumD]=kmeans(X,K) 
          [Idx,C,sumD,D]=kmeans(X,K) 
          […]=Kmeans(…,’Param1’,Val1,’Param2’,Val2,…)
    各输入输出参数介绍:
           X :N*P的数据矩阵
           K: 表示将X划分为几类,为整数
           Idx :N*1的向量,存储的是每个点的聚类标号
           C: K*P的矩阵,存储的是K个聚类质心位置
          sumD :1*K的和向量,存储的是类间所有点与该类质心点距离之和
          D :N*K的矩阵,存储的是每个点与所有质心的距离
          […]=Kmeans(…,'Param1',Val1,'Param2',Val2,…)
          这其中的参数Param1、Param2等,主要可以设置为如下:
          1. ‘Distance’(距离测度)
            ‘sqEuclidean’ 欧式距离(默认时,采用此距离方式)
            ‘cityblock’ 绝度误差和,又称:L1
            ‘cosine’ 针对向量
            ‘correlation’  针对有时序关系的值
            ‘Hamming’ 只针对二进制数据
          2. ‘Start’(初始质心位置选择方法)
            ‘sample’ 从X中随机选取K个质心点
            ‘uniform’ 根据X的分布范围均匀的随机生成K个质心
            ‘cluster’ 初始聚类阶段随机选择10%的X的子样本(此方法初始使用’sample’方法)
             matrix 提供一K*P的矩阵,作为初始质心位置集合
          3. ‘Replicates’(聚类重复次数)  整数

    展开全文
  • K_means算法的具体过程 1、从数据集{X} 中任意选取k个赋给初始的聚类中心c1, c2, …, ck; 2、对数据集中的每个样本点xi,计算其与各个聚类中心cj的欧氏距离并获取其类别标号: 3、按下式重新计算k个聚类中心;...
  • Kmeans的matlab的实现

    2017-01-15 15:02:38
    计算二类精度的Kmeans 的matlab代码clear all;clc;D= load('Pima-training-set-non.txt');predict_label=kmeans(D,2,'dist','sqEuclidean','rep',4);%predict_label[S1,S2,S3,S4,S5,S6,S7,S8,classity]=textread('...
  • k-means matlab 代码

    2013-10-20 23:28:52
    数据挖掘 K-均值 k-means matlab 代码
  • 改进kmeans算法matlab代码 通过K均值聚类对矢量进行量化: 整个代码库,图像和说明可在此存储库中找到。 加载图像: 1.1在本项目中,我们使用了NCSU工程大楼校园的图像,如下所示: 该图像已加载以下MATLAB代码(未...
  • Kmeans聚类算法及其matlab源码

    万次阅读 多人点赞 2016-10-24 14:57:34
    本文介绍了K-means聚类算法,并注释了部分matlab实现的源码。
  • kmeans MATLAB代码

    2017-02-21 10:48:06
    kmeans代码,k点个数选择,中心点处理等
  • Kmeans聚类方法的Matlab代码实现

    千次阅读 2018-04-06 15:18:47
    概念K-Means算法是一种无监督的学习,根据事先给定的分类数K,将所有对象划分为K个簇,且簇内的中心采用簇内所有对象的均值计算而成。引用Peter Harrington著,李锐等人翻译的《机器学习实战》一书中伪代码流程如下...
  • MATLAB2009A实现Kmeans实例

    千次阅读 2012-03-31 15:45:44
    本人刚学习数据挖掘没有多久,数据挖掘中要用不少聚类算法。Kmeans作为其中常用的一种算法,聚类效果还行。  下面是我做了几个简单的MATLAB实现Kmeans的小实例 100*2列矩阵聚类成3类  Matlab代码如下: ...
  • matlab kmeans函数

    千次阅读 2019-08-13 23:39:02
    https://blog.csdn.net/luckxu/article/details/8642277
  • 自己写的一个很有用的Kmeans演示Demo,使用MATLAB写的,有各种酷炫功能,值得大家下载来玩一玩。
  • matlab kmeans聚类,里面包括代码和例子以及聚类后的图片
  • kmeans算法的matlab实践

    2013-10-14 22:57:00
    把图像中所有的像素点进行RGB聚类分析,然后输出看结果 1 img = imread('qq.png'); 2 3 %取出R矩阵,并将这个R矩阵拉成一列 4 imgR = img(:,:,1); 5 imgR = imgR(:); 6 7 %取出G矩阵,并将这个......
  • 一、聚类介绍 聚类分析是指事先不了解每一个样本的类别或其他的先验知识,而唯一的分类根据是样本的特征,利用某种相似度度量的方法,把特征相同或相似的归为一类,实现聚类划分,聚类是一种无监督分类方法。...
  • Kmeans聚类matlab源代码

    2015-06-10 20:13:55
    Kmeans聚类算法matlab源代码,可用于图像分割等数字图像处理领域。
  • 用matlab实现kmeans算法,非常完整例子一维和二维
  • matlab中kmeans使用 matlab中kmeans使用 英文实在太难看懂了,翻译一下 k-means简介 后续有空就加上吧 matlab使用 [IDX, C] = KMEANS(X, K);返回聚类下标IDX,聚类中心坐标C [IDX, C, SUMD] = KMEANS(X, K);...
  • k-均值(k-means)及Matlab动态实现

    万次阅读 多人点赞 2018-06-07 20:48:08
    k-均值(k-means) 注:仅适合于数值属性的数据。 1. 算法思想 k-means算法,也称k-均值算法,它把N个对象划分成k个簇,用簇中对象的均值表示每个簇的中心点(质心),通过迭代使每个簇内的对象不再发生变化为止...
  • Kmeans算法在MATLAB中的实现及实例

    千次阅读 2020-04-05 09:25:30
    基本思想 K-means 是一种基本的、经典的聚类方法,也被称为K-平均或K-均值算法,是一种广泛使用的聚类算法。K-Means算法是聚焦于相似的无监督的算法,以距离作为数据对象间相似性度量的标准,即数据对象间的距离越小...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

kmeansmatlab

matlab 订阅