加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

K均值聚类Matlab示例

(2016-08-24 23:15:38)
标签:

k-means

k均值聚类

matlab

分类: Matlab
1、聚类
聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类,使得同一个类内的数据对象的相似性尽可能大,同时使不在同一个类中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类的数据尽量分离。

2、聚类和分类的区别
聚类算法是给一堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类。
分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类。

3、K均值聚类
给定一个数据点集合和需要的聚类数目k(由用户指定),k均值算法根据某个距离函数反复把数据分入k个聚类中。
K-means聚类算法步骤:
1)初始化。输入数据点集合X,并指定聚类类数N,在X中随机选取N个对象作为初始聚类中心;
2)设定迭代终止条件。比如最大循环次数或者聚类中心收敛误差容限;
3)更新样本属于哪个类。根据相似度准则将数据对象分配到最接近的类;
4)更新类的中心位置。以每一类的平均向量作为新的聚类中心;
反复执行第3步和第4步直至满足终止条件。

K-means聚类算法优点:
1)算法简单、快速;
2)对大数据集效率较高。
K-means聚类算法缺点:
1)需事先指定聚类个数K;
2)初始聚类中心的选取对聚类结果有较大影响。

4、Matlab示例
4.1、main.m
% K_means cluster测试

clc;
clear;

%% 1 random sample
%随机生成三组数据
a = rand(30,2) * 2;
b = rand(30,2) * 5;
c = rand(30,2) * 10;
figure(1);
subplot(2,2,1); 
plot(a(:,1), a(:,2), 'r.'); hold on
plot(b(:,1), b(:,2), 'g*');
plot(c(:,1), c(:,2), 'bx'); hold off
grid on;
title('raw data');

%% 2 K-means cluster
X = [a; b; c];  %需要聚类的数据点
xstart = [2 2; 5 5; 8 8];  %初始聚类中心
subplot(2,2,2);
plot(X(:,1), X(:,2), 'kx'); hold on
plot(xstart(:,1), xstart(:,2), 'r*'); hold off
grid on;
title('raw data center');

[Idx, Center] = K_means(X, xstart);
subplot(2,2,4);
plot(X(Idx==1,1), X(Idx==1,2), 'kx'); hold on
plot(X(Idx==2,1), X(Idx==2,2), 'gx');
plot(X(Idx==3,1), X(Idx==3,2), 'bx');
plot(Center(:,1), Center(:,2), 'r*'); hold off
grid on;
title('K-means cluster result');

disp('xstart = ');
disp(xstart);
disp('Center = ');
disp(Center);

4.2、K_means.m
function [Idx, Center] = K_means(X, xstart)
% K-means聚类
% Idx是数据点属于哪个类的标记,Center是每个类的中心位置
% X是全部二维数据点,xstart是类的初始中心位置

len = length(X);        %X中的数据点个数
Idx = zeros(len, 1);    %每个数据点的Id,即属于哪个类

C1 = xstart(1,:);       %第1类的中心位置
C2 = xstart(2,:);       %第2类的中心位置
C3 = xstart(3,:);       %第3类的中心位置

for i_for = 1:100
    %为避免循环运行时间过长,通常设置一个循环次数
    %或相邻两次聚类中心位置调整幅度小于某阈值则停止
    
    %更新数据点属于哪个类
    for i = 1:len
        x_temp = X(i,:);    %提取出单个数据点
        d1 = norm(x_temp - C1);    %与第1个类的距离
        d2 = norm(x_temp - C2);    %与第2个类的距离
        d3 = norm(x_temp - C3);    %与第3个类的距离
        d = [d1;d2;d3];
        [~, id] = min(d);   %离哪个类最近则属于那个类
        Idx(i) = id;
    end
    
    %更新类的中心位置
    L1 = X(Idx == 1,:);     %属于第1类的数据点
    L2 = X(Idx == 2,:);     %属于第2类的数据点
    L3 = X(Idx == 3,:);     %属于第3类的数据点
    C1 = mean(L1);      %更新第1类的中心位置
    C2 = mean(L2);      %更新第2类的中心位置
    C3 = mean(L3);      %更新第3类的中心位置
end

Center = [C1; C2; C3];  %类的中心位置

5、程序运行结果
这里展示五组不同数据的结果。http://s15/mw690/002sfI7Jzy74jfONGeWbe&690

如有所收获,欢迎用微信扫一扫进行打赏,赏金随意。















0

阅读 收藏 喜欢 打印举报/Report
前一篇:Python基础入门
后一篇:三十六计
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有