一、概念介绍

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如下:

%matlab code
% K-means Cluster
%load data.dat
x_data = 50*rand(1,100);
y_data = 50*rand(1,100);;
% x_data = data(:,1);
% y_data = data(:,2);
data_size = length(x_data);
a = randsample(1:data_size,2);
c1_x = x_data(a(1));
c1_y = y_data(a(1));
c2_x = x_data(a(2));
c2_y = y_data(a(2));
iter = 2;
max_iter = 100;
J_1 = 1;
J_2 = 1;
figure
while J_1>0.1 && J_2>0.1 && iter<max_iter
c1_xx = 0;
c1_yy = 0;
c2_xx = 0;
c2_yy = 0;
c1_num = 0;
c2_num = 0;
for k=1:data_size
Distance1 = (x_data(k)-c1_x)^2 + (y_data(k)-c1_y)^2 ;
Distance2 = (x_data(k)-c2_x)^2 + (y_data(k)-c2_y)^2 ;
if Distance1 > Distance2
lable(k) = 1;
c2_xx = c2_xx+x_data(k);
c2_yy = c2_yy+y_data(k);
c2_num = c2_num+1;
else
lable(k) = 0;
c1_xx = c1_xx+x_data(k);
c1_yy = c1_yy+y_data(k);
c1_num = c1_num+1;
end
end
c1_xx = c1_xx/c1_num;
c1_yy = c1_yy/c1_num;
c2_xx = c2_xx/c2_num;
c2_yy = c2_yy/c2_num;
J_1 = (c1_x-c1_xx)^2 + (c1_y-c1_yy)^2 ;
J_2 = (c2_x-c2_xx)^2 + (c2_y-c2_yy)^2 ;
c1_x = c1_xx;
c1_y = c1_yy;
c2_x = c2_xx;
c2_y = c2_yy;
iter = iter+3
hold on
plot(c1_x,c1_y,'bp','MarkerSize',iter)
hold on
plot(c2_x,c2_y,'mp','MarkerSize',iter)
end % figure
% plot(c1_x,c1_y,'kp','MarkerSize',iter+2)
% hold on
% plot(c2_x,c2_y,'rp','MarkerSize',iter+2)
for idx = 1:data_size
if lable(idx) == 1
hold on
plot(x_data(idx),y_data(idx),'ro')
else
hold on
plot(x_data(idx),y_data(idx),'ko')
end
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. Node.js NPM 使用介绍

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  2. AbstractQueuedSynchronizer源码解读

    1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量.事件等) ...

  3. Dynamics 365 Web Api之基于single-valued navigation property的filter查询

    本篇要讲的是dynamics 新版本中web api的一个改进功能,虽然改进的很有限,但至少是改进了. 举个例子,我们现在知道联系人的名字vic,我们想找出客户记录中主要联系人名字为vic的所有客户, ...

  4. Scroll Segmented Control(Swift)

    今天用了一个github上一个比较好用的Segmented Control但是发现不是我要效果,我需要支持scrollView.当栏目数量超过一屏幕,需要能够滑动. 由于联系作者没有回复,我就自己在其 ...

  5. Web Worker Best Practices

    使用Web Worker可以把一些比较计算量相对大的阻塞浏览器响应的计算放在单独的线程里计算. 请求优化 构造Worker的时候需要给定js的链接URL,worker内部请求js运行代码.假如work ...

  6. 异步请求引发的Chrome死锁

    浏览器支持的并发异步请求数目是有限的,当需要的资源过多时候(远远大于并发数目),就需要自己管理XHR请求. 在实现自己的XHR的Manger时候,当请求数目达到2000多的时候,经常会遇到chrome ...

  7. 集群技术(二) MySQL集群简介与配置详解

    when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...

  8. Dynamics CRM build numbers

    Dynamics CRM build numbers CRM各大版本及补丁列表,整理的很全

  9. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  10. FORM开发中Profiles的使用

    用户配置文件相当于系统参数,可以在不同层级(Site层.应用模块层.责任层.用户层)设置不同的值:作用范围小的覆盖范围大的层,系统已经预设了很多user profile; 开发人员也可以定义 在EBS ...