简介
k-means算法是著名的划分聚类分割方法。基本原理是,将数据分成K族,每
一族都有一个中心,称作聚类中心,族中的元素,与其他聚类中心的距离都大
于自己本族的聚类中心。聚类中心大多数情况都不是族中的元素,聚类中心的
X坐标,是族中所有元素的X坐标的平均值,Y坐标类推。
解决此类问题的关键点,在于寻找聚类中心的坐标。
算法具体步骤
(1)随机从数据中选择K个点,作为初始的聚类中心(因为初始聚类中心的选取与结果没有关系,所以可以随机取);
(2)计算各点到各个聚类中心的距离,距离哪一个最近就属于哪个族类;
(3)根据所有聚类的元素,计算平均X坐标,Y坐标,获得新聚类中心坐标;
(4)将新的聚类坐标与旧的聚类中心坐标作对比,是否发生变化,如果发生变化,则以新的聚类中心重复上述(2)、(3)步骤,如果没有发生变化,即可停止,获得的聚类中心即为所需的聚类中心。
总结
过程即是不断寻找聚类中心的过程,不断刷新知道聚类中心不再改变时,即
得到最佳聚类中心
动画演示代码(更形象表现出过程)
%% K-means 算法MATLAB实现
%--------------------------------------------------------------------------
%% 数据准备和初始化
clc
clear
x=[0 0;1 0; 0 1; 1 1;2 1;1 2; 2 2;3 2; 6 6; 7 6; 8 6; 6 7; 7 7; 8 7; 9 7 ; 7 8; 8 8; 9 8; 8 9 ; 9 9;10 1;11.2 2.6;11 5;4 6;5 7;3 6;4 1;1 3;1 0;1.5 3; 4 5;6 2;3 2;5 1;5 3;6 5;4 5;2 3;6 1];
z=zeros(2,2);
n=size(x); %计算x的行数,即求点的个数
z1=zeros(2,2) %记录初始中心的位置
z=x(1:2, 1:2) %初始聚类中心
h = scatter(z1(:,1),z1(:,2),'ob'); % scatter是绘制二维散点图的函数(这里返回h是为了得到图形的句柄,未来我们对其位置进行更新)
%% 寻找聚类中心
while 1
count=zeros(2,1);
allsum=zeros(2,2);
for i