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 = ; % 点的个数
X = *rand(,N);
Y = *rand(,N); % 随机生成一组横纵坐标取值均在(,)之间的点,X Y 分别代表横纵坐标
plot(X, Y, 'r*'); % 绘出原始的数据点
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
n = ; %将所有的数据点分为两类
m = ; %迭代次数
eps = 1e-; % 迭代结束的阈值
u1 = [X(),Y()]; %初始化第一个聚类中心
u2 = [X(),Y()]; %初始化第二个聚类中心
U1 = zeros(,);
U2 = zeros(,); %U1,U2 用于存放各次迭代两个聚类中心的横纵坐标
U1(:,) = u1;
U2(:,) = u2;
D = zeros(,N); %初始化数据点与聚类中心的距离
while(abs(U1(,m) - U1(,m+)) > eps || abs(U1(,m) - U1(,m+) > eps || abs(U2(,m) - U2(,m+)) > eps || abs(U2(,m) - U2(,m+)) > eps))
m = m +;
% 计算所有点到两个聚类中心的距离
for i = : N
D(,i) = sqrt((X(i) - U1(,m))^ + (Y(i) - U1(,m))^);
end
for i = : N
D(,i) = sqrt((X(i) - U2(,m))^ + (Y(i) - U2(,m))^);
end
A = zeros(,N); % A用于存放第一类的数据点
B = zeros(,N); % B用于存放第二类的数据点
for k = : N
[MIN,index] = min(D(:,k));
if index == % 点属于第一个聚类中心
A(,k) = X(k);
A(,k) = Y(k);
else % 点属于第二个聚类中心
B(,k) = X(k);
B(,k) = Y(k);
end
end
indexA = find(A(,:) ~= ); % 找出第一类中的点
indexB = find(B(,:) ~= ); % 找出第二类中的点
U1(,m+) = mean(A(,indexA));
U1(,m+) = mean(A(,indexA));
U2(,m+) = mean(B(,indexB));
U2(,m+) = mean(B(,indexB)); % 更新两个聚类中心
end
figure;
plot(A(,indexA) , A(,indexA), '*b'); % 作出第一类点的图形
hold on
plot(B(,indexB) , B(,indexB), 'oy'); %作出第二类点的图形
hold on
centerx = [U1(,m) U2(,m)];
centery = [U1(,m) U2(,m)];
plot(centerx , centery, '+g'); % 画出两个聚类中心点
xlabel('X');
ylabel('Y');
title('聚类之后的数据点');
disp(['迭代的次数为:',num2str(m)]);

得到的分类结果如下:

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

K均值聚类算法的MATLAB实现的更多相关文章

  1. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  2. K均值聚类算法

    k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...

  3. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  4. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  5. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  6. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

  7. 机器学习理论与实战(十)K均值聚类和二分K均值聚类

    接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...

  8. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  9. 100天搞定机器学习|day44 k均值聚类数学推导与python实现

    [如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...

随机推荐

  1. 遇到 java.io.EOFException 异常的解决办法

    可以试着clean项目后再启动!原因未明

  2. DDOS分布式拒绝服务

    DDOS(分布式拒绝服务)概念 DDOS称为分布式拒绝服务,DDOS本是利用合理的请求伪造资源过载,导致服务不可用.比如一个停车场有100个停车位,当100个停车位都停满后,再有车想要进来.就必须要等 ...

  3. Mat转换为QImage

    请留意: opencv为3.0.0版本,Qt为4.8.4版本 #include"image1.h" #include<QApplication> #include< ...

  4. 实现断点续传的FTP下载类(支持多线程多任务下载)

    using System; using System.Collections.Generic; using System.Text; using System.Threading; using Sys ...

  5. MySQL全文检索

    参考一:http://www.cnblogs.com/feichexia/archive/2012/06/09/2543049.html

  6. 直接在 CSS 中引用 FONTAWESOME 图标(附码表)

    直接在 CSS 中引用 FONTAWESOME 图标(附码表) 因此我们如果不想用 Fontawesome 提供的类,只想在 css 里面引用图标的话,可以这样子,请自行脑补: .icon:befor ...

  7. httpd服务的安装、配置和关于php留言本网站的搭建

    搭建本地yum仓库的方法 http://www.cnblogs.com/lql123/p/5952788.html yum install httpd -y #安装httpd yum install ...

  8. NoSQL生态系统——hash分片和范围分片两种分片

    13.4 横向扩展带来性能提升 很多NoSQL系统都是基于键值模型的,因此其查询条件也基本上是基于键值的查询,基本不会有对整个数据进行查询的时候.由于基本上所有的查询操作都是基本键值形式的,因此分片通 ...

  9. CSS各类标签用法——选择器

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. js解决IE8、9下placeholder的兼容问题

    由于placeholder是html5的新属性,在IE8.IE9下是不能显示的,有兼容性问题. 解决思路: 1.判断目前浏览器是否支持placeholder属性 2.若不支持,则将type=" ...