一、概念介绍

K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最有分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

  k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,评价指标J的值没有发生变化,说明算法已经收敛。

二、K-means算法

它是一种迭代的算法:

(1) 、首选随机选择k个点作为k个Cluster的重心;

(2)、计算每个点到各个Cluster重心的距离,将它加入到最近的那个Cluster;

(3)、重新计算每个Cluster的重心;

(4)、重复过程2~3,直到各个Cluster重心在某个精度范围内不变化或者达到最大迭代次数。

别看算法简单,很多复杂算法的实际效果或许都不如它,而且它的局部性较好,容易并行化,对大规模数据集很有意义;算法时间复杂度是:O(nkt),其中:n是聚类点个数k是Cluster个数,t是迭代次数。

以上资料来源于网络摘抄;

三 、matlab下实现K-means Cluster算法,Code如下:

  1. %matlab code
  2. % K-means Cluster
  3. %load data.dat
  4. x_data = 50*rand(1,100);
  5. y_data = 50*rand(1,100);;
  6. % x_data = data(:,1);
  7. % y_data = data(:,2);
  8. data_size = length(x_data);
  9. a = randsample(1:data_size,2);
  10. c1_x = x_data(a(1));
  11. c1_y = y_data(a(1));
  12. c2_x = x_data(a(2));
  13. c2_y = y_data(a(2));
  14. iter = 2;
  15. max_iter = 100;
  16. J_1 = 1;
  17. J_2 = 1;
  18. figure
  19. while J_1>0.1 && J_2>0.1 && iter<max_iter
  20. c1_xx = 0;
  21. c1_yy = 0;
  22. c2_xx = 0;
  23. c2_yy = 0;
  24. c1_num = 0;
  25. c2_num = 0;
  26. for k=1:data_size
  27. Distance1 = (x_data(k)-c1_x)^2 + (y_data(k)-c1_y)^2 ;
  28. Distance2 = (x_data(k)-c2_x)^2 + (y_data(k)-c2_y)^2 ;
  29. if Distance1 > Distance2
  30. lable(k) = 1;
  31. c2_xx = c2_xx+x_data(k);
  32. c2_yy = c2_yy+y_data(k);
  33. c2_num = c2_num+1;
  34. else
  35. lable(k) = 0;
  36. c1_xx = c1_xx+x_data(k);
  37. c1_yy = c1_yy+y_data(k);
  38. c1_num = c1_num+1;
  39. end
  40. end
  41. c1_xx = c1_xx/c1_num;
  42. c1_yy = c1_yy/c1_num;
  43. c2_xx = c2_xx/c2_num;
  44. c2_yy = c2_yy/c2_num;
  45. J_1 = (c1_x-c1_xx)^2 + (c1_y-c1_yy)^2 ;
  46. J_2 = (c2_x-c2_xx)^2 + (c2_y-c2_yy)^2 ;
  47. c1_x = c1_xx;
  48. c1_y = c1_yy;
  49. c2_x = c2_xx;
  50. c2_y = c2_yy;
  51. iter = iter+3
  52. hold on
  53. plot(c1_x,c1_y,'bp','MarkerSize',iter)
  54. hold on
  55. plot(c2_x,c2_y,'mp','MarkerSize',iter)
  56. end
  57.  
  58. % figure
  59. % plot(c1_x,c1_y,'kp','MarkerSize',iter+2)
  60. % hold on
  61. % plot(c2_x,c2_y,'rp','MarkerSize',iter+2)
  62. for idx = 1:data_size
  63. if lable(idx) == 1
  64. hold on
  65. plot(x_data(idx),y_data(idx),'ro')
  66. else
  67. hold on
  68. plot(x_data(idx),y_data(idx),'ko')
  69. end
  70. end

最后仿真效果展示如下:

五角星代表聚类中心的变化情况,可见收敛的速度还是很快的。

matlab下K-means Cluster 算法实现的更多相关文章

  1. matlab下kmeans及pam算法对球型数据分类练习

    clear all; clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %数据初始化 D ...

  2. matlab下二重积分的蒙特卡洛算法

    %%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特 ...

  3. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

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

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

  5. K Nearest Neighbor 算法

    文章出处:http://coolshell.cn/articles/8052.html K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KN ...

  6. k最邻近算法——使用kNN进行手写识别

    上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...

  7. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  8. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

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

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

随机推荐

  1. 关于Allele(等位基因)的理解

    高中学生物的时候关于遗传学的部分,记得当时的教材上为了简化处理一般将基因型定义为AA, Aa, aa.其实这种抽象的理解对应付高考是很有用的,但是实际应用中如果还这样理解那么便会产生一些疑问.之所以会 ...

  2. 第一次作业:基于Linux操作系统深入源码进程模型分析

    1.Linux操作系统的简易介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使 ...

  3. Throughtput收集器

    介绍 JVM里面的Throughtput收集器是一款关注吞吐量的垃圾收集器.该收集器是唯一一个实现了UseAdaptiveSizePolicy策略的收集器,允许用户通过指定最大暂停时间和垃圾收集时间占 ...

  4. 深度解读GoogleNet之Inception V1

    GoogleNet设计的目的 GoogleNet设计的初衷是为了提高在网络里面的计算资源的利用率. Motivation 网络越大,意味着网络的参数较多,尤其当数据集很小的时候,网络更容易发生过拟合. ...

  5. BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...

  6. OBJ文件格式分析工具: objdump, nm,ar

    首先简要阐述关于gcc.glibc和 binutils模块之间的关系 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collect compiler)是一组编译工具的 ...

  7. Dynamics CRM 构建IN查询

    CRM中有3种查询数据的方式,分别是QueryExpression.fetchxml.linq,本篇讲述的条件IN的查询只支持前两种,linq并不支持. QueryExpression的写法如下,示例 ...

  8. Android 的 Sqlite基本操作

    在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...

  9. android解析网络json数据(1)

    1.首先获得url,传入URL类,利用URL的openconnection方法,获得URLConnection,去的输入流,进行操作,具体代码如下: public class NetConnectio ...

  10. Dynamics CRM2016 业务流程之Task Flow(二)

    接上篇,Page页设置完后,按照业务流程管理也可以继续设置Insert page after branch 或者 Add branch,我这里选择后者,并设置了条件,如果Pipeline Phase ...