<机器学习练习>K-means聚类算法

来源:互联网 发布:windows outlook 编辑:程序博客网 时间:2024/06/08 02:40

1:思想

  K-means,属于无监督学习。即输入数据没有标签y,经过一些算法后,找到标签y。  聚类的目的就是找到每个样本潜在的标签y,并将同类别的样本放到一起。  而k-means聚类:就是把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,  使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。

2:缺点

  1)聚类数量k,需要输入。选择不恰当,聚类结果很糟糕。  2)收敛到局部最优解,和直观想象不一样,这种可以多此选择初始点,进行多次实验,取平均来克服。

3:算法

这里写图片描述

4:练习程序

clear all;clc ;%第一类数据mu1=[0,0,0];                  %%多维高斯向量均值s1=[0.3 0 0;0 0.35 0;0 0 0.3];%%协方差分布data1=mvnrnd(mu1,s1,100);     %%产生高斯分布数据%第二类数据mu2=[1.25,1.25,1.25];   %%多维高斯向量均值s2=[0.3 0 0;0 0.35 0;0 0 0.3];%%协方差分布data2=mvnrnd(mu2,s2,100);  %%产生高斯分布数据%第三类数据mu3=[-1.25,-1.25,-1.25];    %%多维高斯向量均值s3=[0.3 0 0;0 0.35 0;0 0 0.3];%%协方差分布data3=mvnrnd(mu3,s3,100);  %%产生高斯分布数据data=[data1;data2;data3];  %%原始数据%%K-means聚类 [u]=KMeans(data,10);       %%%   %%显示聚类后的数据 figure; hold on; plot3(data1(:,1),data1(:,2),data1(:,3),'co'); hold on plot3(data2(:,1),data2(:,2),data2(:,3),'go'); hold on plot3(data3(:,1),data3(:,2),data3(:,3),'bo'); hold on plot3(u(:,1),u(:,2),u(:,3),'r+');
%%%data 数据  N质心数量  u聚类质心位置function [u]=KMeans(data,N)  [m,n]=size(data);                             %% m是数据个数maxtemp=zeros(n);                   mintemp=zeros(n);u=zeros(N,n);                                 %%每一行表示一个质心点%%%初始化质心点for i=1:n    maxtemp(i)=max(data(:,i));                %%第一列最大    mintemp(i)=min(data(:,i));    for  j=1:N        u(j,i)=maxtemp(i)+(mintemp(i)-maxtemp(i))*rand();    endendeps=1;IndexData=ones(m,1);                          %%存放质心:每个数据所对应的质心索引while(eps>0.0001)                             %%%迭代更新质心位置    pre_u=u;    for i=1:N        for j=1:m            temp(j,i)=norm(data(j,:)-u(i,:));   %%每一个数据与N个质心比较  放到m*N矩阵里                                                %%temp每一列表示数据离不同质心的距离        end    end    for row=1:m        [value,Index]=min(temp(row,:));        %%找到每一行的最小值的索引        IndexData(row)=Index;                  %%把它对应的索引放到IndexData    end    %%%计算新的质心位置    for i=1:N        ZhiXin=zeros(1,3);        Count=0;        for j=1:m            if IndexData(j)==i                 %%计算索引是i的数据点                ZhiXin=ZhiXin+data(j,:);       %%质心的计算按照:所有坐标点的平均值                Count=Count+1;            end          end        u(i,:)=ZhiXin/Count;     end    eps=norm(pre_u-u);end

5:结果

当聚类数量选则3,10的时候结果如下:其中,有的时候质心会不确定,程序没有做优化处理。
这里写图片描述
这里写图片描述

0 0
原创粉丝点击