Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 2315|回复: 0

[默认分类] matlab练习程序(k-means聚类)

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 13:25:04 | 显示全部楼层 |阅读模式
    聚类算法,不是分类算法。
    分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类。
    聚类算法是给一大堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类。
    这里的k-means聚类,是事先给出原始数据所含的类数,然后将含有相似特征的数据聚为一个类中。
    所有资料中还是Andrew Ng介绍的明白。
    首先给出原始数据{x1,x2,...,xn},这些数据没有被标记的。
    初始化k个随机数据u1,u2,...,uk。这些xn和uk都是向量。
    根据下面两个公式迭代就能求出最终所有的u,这些u就是最终所有类的中心位置。
    公式一:

    意思就是求出所有数据和初始化的随机数据的距离,然后找出距离每个初始数据最近的数据。
    公式二:

    意思就是求出所有和这个初始数据最近原始数据的距离的均值。
    然后不断迭代两个公式,直到所有的u都不怎么变化了,就算完成了。
    先看看一些结果:
    用三个二维高斯分布数据画出的图:

    通过对没有标记的原始数据进行kmeans聚类得到的分类,十字是最终迭代位置:

    下面是Matlab代码,这里我把测试数据改为了三维了,函数是可以处理各种维度的。
    main.m

    1. clear all;
    2. close all;
    3. clc;
    4. %第一类数据
    5. mu1=[0 0 0];  %均值
    6. S1=[0.3 0 0;0 0.35 0;0 0 0.3];  %协方差
    7. data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据
    8. %%第二类数据
    9. mu2=[1.25 1.25 1.25];
    10. S2=[0.3 0 0;0 0.35 0;0 0 0.3];
    11. data2=mvnrnd(mu2,S2,100);
    12. %第三个类数据
    13. mu3=[-1.25 1.25 -1.25];
    14. S3=[0.3 0 0;0 0.35 0;0 0 0.3];
    15. data3=mvnrnd(mu3,S3,100);
    16. %显示数据
    17. plot3(data1(:,1),data1(:,2),data1(:,3),"+");
    18. hold on;
    19. plot3(data2(:,1),data2(:,2),data2(:,3),"r+");
    20. plot3(data3(:,1),data3(:,2),data3(:,3),"g+");
    21. grid on;
    22. %三类数据合成一个不带标号的数据类
    23. data=[data1;data2;data3];   %这里的data是不带标号的
    24. %k-means聚类
    25. [u re]=KMeans(data,3);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
    26. [m n]=size(re);
    27. %最后显示聚类后的数据
    28. figure;
    29. hold on;
    30. for i=1:m
    31.     if re(i,4)==1   
    32.          plot3(re(i,1),re(i,2),re(i,3),"ro");
    33.     elseif re(i,4)==2
    34.          plot3(re(i,1),re(i,2),re(i,3),"go");
    35.     else
    36.          plot3(re(i,1),re(i,2),re(i,3),"bo");
    37.     end
    38. end
    39. grid on;
    复制代码

    KMeans.m

    1. %N是数据一共分多少类
    2. %data是输入的不带分类标号的数据
    3. %u是每一类的中心
    4. %re是返回的带分类标号的数据
    5. function [u re]=KMeans(data,N)   
    6.     [m n]=size(data);   %m是数据个数,n是数据维数
    7.     ma=zeros(n);        %每一维最大的数
    8.     mi=zeros(n);        %每一维最小的数
    9.     u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置
    10.     for i=1:n
    11.        ma(i)=max(data(:,i));    %每一维最大的数
    12.        mi(i)=min(data(:,i));    %每一维最小的数
    13.        for j=1:N
    14.             u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
    15.        end      
    16.     end
    17.    
    18.     while 1
    19.         pre_u=u;            %上一次求得的中心位置
    20.         for i=1:N
    21.             tmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备
    22.             for j=1:m
    23.                 tmp{i}=[tmp{i};data(j,:)-u(i,:)];
    24.             end
    25.         end
    26.         
    27.         quan=zeros(m,N);
    28.         for i=1:m        %公式一的实现
    29.             c=[];
    30.             for j=1:N
    31.                 c=[c norm(tmp{j}(i,:))];
    32.             end
    33.             [junk index]=min(c);
    34.             quan(i,index)=norm(tmp{index}(i,:));           
    35.         end
    36.         
    37.         for i=1:N            %公式二的实现
    38.            for j=1:n
    39.                 u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
    40.            end           
    41.         end
    42.         
    43.         if norm(pre_u-u)<0.1  %不断迭代直到位置不再变化
    44.             break;
    45.         end
    46.     end
    47.    
    48.     re=[];
    49.     for i=1:m
    50.         tmp=[];
    51.         for j=1:N
    52.             tmp=[tmp norm(data(i,:)-u(j,:))];
    53.         end
    54.         [junk index]=min(tmp);
    55.         re=[re;data(i,:) index];
    56.     end
    57.    
    58. end
    复制代码

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 19:41 , Processed in 0.369314 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表