matlab下K-means Cluster 算法实现
一、概念介绍
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 算法实现的更多相关文章
- matlab下kmeans及pam算法对球型数据分类练习
clear all; clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %数据初始化 D ...
- matlab下二重积分的蒙特卡洛算法
%%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特 ...
- [ZZ] 基于Matlab的标记分水岭分割算法
基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- K Nearest Neighbor 算法
文章出处:http://coolshell.cn/articles/8052.html K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KN ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- K NEAREST NEIGHBOR 算法(knn)
K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- 机器学习实战---K均值聚类算法
一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...
随机推荐
- Git-gitblit-Tortoisegit 搭建Windows Git本地服务器
1.Gitblit安装 1.1.Gitblit简介 Git在版本控制领域可谓是深受程序员喜爱.对于开源的项目,可以免费托管到GitHub上面,相当的方便.但是私有项目托管到GitHub会收取相当昂贵的 ...
- comtypes加word 2013批量将pdf转换为doc
office 2013很强大. import os import sys import re import comtypes.client wdFormatPDF = 17 def covx_to_p ...
- SQL Server AlwaysON从入门到进阶(2)——存储
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本节讲解关于SQL Server 存储方面的内容,相对于其他小节而言这节比较短.本节会提供一些关于使用群集或者非群集系统过程 ...
- Vue 踩坑记
参考: https://forum.vuejs.org/t/unknown-issues-in-change-event-of-radio-in-vue-2-x-webpack-2-x/11034 v ...
- 豌豆夹Redis解决方案Codis安装使用
豌豆夹Redis解决方案Codis安装使用 1.安装 1.1 Golang环境 Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载. [root@vm roo ...
- python获取指定时间差的时间
在分析数据的时间经常需要截取一定范围时间的数据,比如三天之内,两小时前等等时间要求的数据,因此将该部分经常需要用到的功能模块化,方便以后以后用到的时候复用.在此,也分享给大家. <span st ...
- 物料REVISION控制
--新增 INV_ITEM_REVISION_PUB.Create_Item_Revision ( p_api_version IN NUMBER , p_init_msg_list IN VARCH ...
- 详解EBS接口开发之采购订单导入
采购订单常用标准表简介 1.1 常用标准表 如下表中列出了与采购订单导入相关的表和说明: 表名 说明 其他信息 po.po_headers_all 采购订单头 采购订单号,采购类型,供应商,地点, ...
- spring @Qualifier注解使用
@Autowired是根据类型进行自动装配的.如果当Spring上下文中存在多个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在U ...
- Linux下如何阅读开源项目
标签(空格分隔): code SLAM是一个大型的项目,而且通常都是基于linux平台的.对于大部分没有linux经验的人来说,如何在linux下拥有vs代码阅读体验就非常重要了.这篇博客就简答的介绍 ...