一、概念介绍

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. python脚本文件传参并通过token登录后爬取数据实例

    from bs4 import BeautifulSoup import requests import sys class Zabbix(object): def __init__(self, he ...

  2. springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)

    在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...

  3. Hibernate设置时间戳的默认值和更新时间的自动更新

    Generated and default property values 生成的和默认的属性值 The database sometimes generates a property value, ...

  4. 全面剖析Redis Cluster原理和应用

    全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最 ...

  5. shell编程--基本格式,基本语法,运算符,expr,(()),$[]

    02/shell编程 Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell Shell也是一门编程语言."."号执行脚本时,会让脚本在调用者 ...

  6. Servlet - Upload、Download、Async、动态注册

    Servlet 标签 : Java与Web Upload-上传 随着3.0版本的发布,文件上传终于成为Servlet规范的一项内置特性,不再依赖于像Commons FileUpload之类组件,因此在 ...

  7. RxJava操作符(07-辅助操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51658445 本文出自:[openXu的博客] 目录: Delay Do Materiali ...

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

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

  9. UNIX环境高级编程——标准IO-实现查看所有用户

    #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h&g ...

  10. Linux2.6--Linus电梯

          内核为了处理来自IO层的请求,需要进行相应的优化,因为当请求很多时,且请求的块又都几种在一块,那么如果按照顺序处理这些请求无疑是很大的时间开销,所以,我们需要寻求方法来处理这种情况(当然, ...