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. python的字符串内建函数

    http://www.ziqiangxuetang.com/python/python-strings.html

  2. How threads differ from processes

    How threads differ from processes Threads differ from traditional multitasking operating system proc ...

  3. 网页 css 样式 初始化

    body, div, ul, ol, dl, dt, dd, li, dl, h1, h2, h3, h4 {margin:0;padding:0;font-style:normal;font:12p ...

  4. MySql学习(五) —— 数据库优化理论篇(一)

    一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...

  5. Electron-使用Electron开发第一个应用

    使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...

  6. 解析Hibernate中的持久化—ORM(转载)

    最近一直在学习Hibernate,首先说一下Hibernate出现的原因吧,Hibernate是因为MVC的分层体系结构的出现,即数据持久层(模型层)的出现,持久层是在MVC三层架构的基础上提出来的, ...

  7. LeetCode Spiral Matrix

    class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) ...

  8. monads-are-elephants(转)

    介绍monads有点像互联网时代的家庭手工业.我想 “为什么要反对传统?”,但这篇文章将以Scala对待monads的方式来描述. 有个古老的寓言,讲述了几个瞎子第一次摸到大象.一个抱着大象的腿说:“ ...

  9. VS2003"无法启动调试 没有正确安装调试器"的解决办法

    VS2003"无法启动调试 没有正确安装调试器"的解决方法 在用VS2003做项目的时候,经常调试程序,但是有时候回出现如下问题“无法启动调试,没有正确安装调试器,请运行安装程序或 ...

  10. ObReferenceObjectByName函数调用WIN7下的解决

    <寒江独钓 Windows内核安全编程>第4章键盘的过滤ctrl2cap代码中,ObReferenceObjectByName函数调用: [1]extern POBJECT_TYPE Io ...