一、概念介绍

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. 解决Error: ENOENT: no such file or directory, scandir 'D:\IdeaWork\code-front-jet\node_modules\.npminstall\node-sass\3.7.0\node-sass\vendor'

    在使用npm安装node-sass的时候,可能会出现如下的报错: Error: ENOENT: no such file or directory, scandir 'D:\IdeaWork\code ...

  2. dict的操作和三级菜单

    dict的基本操作 # Author:nadech info = { "stu001":"sjp", "stu002":"cxx& ...

  3. U盘PE无人值守安装centOS6

    一.制作 1.需要用到的工具:老毛桃PX工具.系统ISO.一个8GU盘 老毛桃PE工具 http://laomaotao.net/ CentOS启动映像 http://mirrors.163.com/ ...

  4. PHP 实例 AJAX 与 MySQL

    AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例   Person info will be listed here... 实例解释 - MySQL 数据库 在上 ...

  5. 百度地图JS 搜索悬浮窗功能

    这个需求的效果类似下面的截图,主要还是利用百度地图中自定义控件的功能,挺简单的.文档地址在这 http://lbsyun.baidu.com/index.php?title=jspopular 效果图 ...

  6. Android超精准计步器开发-Dylan计步

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52868803 本文出自[DylanAndroid的博客] Android超精准 ...

  7. mysql和postgresql转义字符探究

    总结 mysql依靠反斜杠\转义, postgresql 依靠单引号转义 mysql 客户端 mysql> create table usr (name varchar(), age integ ...

  8. Swift基础之音乐播放随机变换着色板

    今天的内容比较简单,我也就不做详细的文字介绍了,直接上代码,希望对大家有所帮助 var audioPlayer = AVAudioPlayer()    //梯度配色    let gradientL ...

  9. Linux 环境下的一些常用命令(三)

    转载自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 21. 命令: Find ...

  10. PLSQL程序编写杂烦数据表信息编写批量排版

    --PLSQL程序编写杂烦数据表信息编写批量排版 SELECT 'cra.' || lower(t.column_name) ||',' FROM dba_tab_columns t WHERE t. ...