K均值聚类算法的MATLAB实现

1.K-均值聚类法的概述

之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理。最近因为在学模式识别,又重新接触了这种聚类算法,所以便仔细地研究了一下它的原理。弄懂了之后就自己手工用matlab编程实现了,最后的结果还不错,嘿嘿~~~
简单来说,K-均值聚类就是在给定了一组样本(x1, x2, ...xn) (xi, i = 1, 2, ... n均是向量) 之后,假设要将其聚为 m(<n) 类,可以按照如下的步骤实现:
Step 1: 从 (x1, x2, ...xn) 中随机选择 m 个向量(y1,y2,...ym) 作为初始的聚类中心(可以随意指定,不在n个向量中选择也可以);
Step 2: 计算 (x1, x2, ...xn) 到这 m 个聚类中心的距离(严格来说为 2阶范数);
Step 3: 对于每一个 xi(i = 1,2,...n)比较其到 (y1,y2,...ym) 距离,找出其中的最小值,若到 yj 的距离最小,则将 xi 归为第j类;
Step 4: m 类分好之后, 计算每一类的均值向量作为每一类新的聚类中心;
Step 5: 比较新的聚类中心与老的聚类中心之间的距离,若大于设定的阈值,则跳到 Step2; 否则输出分类结果和聚类中心,算法结束。
OK,废话不多说,直接上Matlab代码。
% 利用K-均值聚类的原理,实现对一组数据的分类。这里以一组二维的点为例。
N = 40; % 点的个数
X = 10*rand(1,N);
Y = 10*rand(1,N); % 随机生成一组横纵坐标取值均在(0,10)之间的点,X Y 分别代表横纵坐标
plot(X, Y, 'r*'); % 绘出原始的数据点
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
n = 2; %将所有的数据点分为两类
m = 1; %迭代次数
eps = 1e-7; % 迭代结束的阈值
u1 = [X(1),Y(1)]; %初始化第一个聚类中心
u2 = [X(2),Y(2)]; %初始化第二个聚类中心
U1 = zeros(2,100);
U2 = zeros(2,100); %U1,U2 用于存放各次迭代两个聚类中心的横纵坐标
U1(:,2) = u1;
U2(:,2) = u2;
D = zeros(2,N); %初始化数据点与聚类中心的距离
while(abs(U1(1,m) - U1(1,m+1)) > eps || abs(U1(2,m) - U1(2,m+1) > eps || abs(U2(1,m) - U2(1,m+1)) > eps || abs(U2(2,m) - U2(2,m+1)) > eps))m = m +1;% 计算所有点到两个聚类中心的距离
for i = 1 : ND(1,i) = sqrt((X(i) - U1(1,m))^2 + (Y(i) - U1(2,m))^2);
end
for i = 1 : ND(2,i) = sqrt((X(i) - U2(1,m))^2 + (Y(i) - U2(2,m))^2);
end
A = zeros(2,N); % A用于存放第一类的数据点
B = zeros(2,N); % B用于存放第二类的数据点
for k = 1: N[MIN,index] = min(D(:,k)); if index == 1  % 点属于第一个聚类中心A(1,k) = X(k);A(2,k) = Y(k);else           % 点属于第二个聚类中心B(1,k) = X(k);B(2,k) = Y(k);end
end
indexA = find(A(1,:) ~= 0); % 找出第一类中的点
indexB = find(B(1,:) ~= 0); % 找出第二类中的点
U1(1,m+1) = mean(A(1,indexA));
U1(2,m+1) = mean(A(2,indexA));
U2(1,m+1) = mean(B(1,indexB));
U2(2,m+1) = mean(B(2,indexB)); % 更新两个聚类中心
end
figure;
plot(A(1,indexA) , A(2,indexA), '*b'); % 作出第一类点的图形
hold on
plot(B(1,indexB) , B(2,indexB), 'oy'); %作出第二类点的图形
hold on
centerx = [U1(1,m) U2(1,m)];
centery = [U1(2,m) U2(2,m)];
plot(centerx , centery, '+g'); % 画出两个聚类中心点
xlabel('X');
ylabel('Y');
title('聚类之后的数据点');
disp(['迭代的次数为:',num2str(m)]);

得到的分类结果如下:

50个随机生成的点分为两类迭代只需要4步,从上图来看,分类的效果还是不错的。但是每次运行可能分类的结果会不一样,这是因为这些点是随机生成的,而且也没有明确的分类标准的缘故。

posted on 2017-05-14 18:23 叶祖辉 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/yezuhui/p/6853269.html

K均值聚类算法的MATLAB实现相关推荐

  1. matlab实现k-l算法,K均值聚类算法的MATLAB实现

    K-means算法是最简单的一种聚类算法.算法的目的是使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准) K-means聚类算法的一般步骤: 初始化.输入 ...

  2. 基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)

  3. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

  4. k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

    本文很长很长,有很多很多图,包含以下部分: 1.算法简介 2.如何分类平面点 3.如何分类空间点 4.如何分类多维数据 5.后记 提醒:以下内容包括:智障操作,无中生友,重复造轮子 等 1.算法简介 ...

  5. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  6. K均值聚类算法(HCM,K-Means)

    K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...

  7. K均值聚类算法(Kmeans)讲解及源码实现

    K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...

  8. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  9. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

最新文章

  1. zk Acl权限:只有一个账号有crdwa权限,匿名用户只有r权限
  2. android 继承现有控件,Android继承现有控件拓展实现自定义控件textView
  3. linux下搭建博客day3-git安装
  4. 怎么用psftp下载linux上的文件夹,使用PSFTP上传和下载Linux服务器文件.doc
  5. 黑莓手机用desktop manager安装了一些软件后重启出现erro523无法进入桌面
  6. Android 开源项目和文章集合(更新:2022.03.21)
  7. 网吧服务器管理维护,网吧服务器常用设置维护工具
  8. VMware ESXi 安装教程
  9. Word中插入图片只显示一部分
  10. wamp5环境配置基础教程
  11. 使用Xmanger/Xbrowser 远程桌面Ubuntu 12.04 LTS
  12. 豆瓣9分+纪录片,每一部都美到窒息......
  13. 内存测试软件 ddr4,RAMCHECK LX DDR4 PRO/DDR3 内存测试仪
  14. leetcode第21天格雷编码
  15. 最简单的输出四位数的每个位上的数字
  16. oracle.jdbc.OracleDriver Oracle数据库驱动
  17. 基于微信小程序云开发的投票小程序源码,图文投票微信小程序源码
  18. FPGA作为从机与STM32进行SPI协议通信
  19. Spark 安装与配置 (Spark HA 集群部署)
  20. ARMv8-AArch64简述

热门文章

  1. 淘宝获取外网IP php
  2. ❤啊!这就被黑了?❤ Redis 报 EXECABORT Transaction discarded because of previous errors 错误及解决方案❤️
  3. 基于 Spring Cloud 环境污染物数据分析与预测平台
  4. vue中进行窗口变化的监听
  5. C++ vector 相关函数简介
  6. 金三银四真的是跳槽良机吗?资深人才从不根据月份跳槽
  7. mysql的decode函数_Mysql实现oracle decode()函数
  8. redis-底层实现原理
  9. SIGPIPE 原因和解决办法
  10. GNU 项目(开源社区的由来,背后的哲学)