您的位置:首页 > 编程语言 > MATLAB

k-means聚类算法

2016-06-20 14:09 363 查看

算法简介

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

基本思想

首先确定聚类的类别数K,并任意选择待聚类的数据中k个数据作为初始聚类中心(初始化方法: Forgy),然后计算所有数据点到初始聚类中心的距离,把各个数据点分配到离它最近的聚类中心,形成簇,最后求出各个簇的数学平均作为新的聚类中心,重复上述步骤直到误差函数取最小,使得聚类中心不再变化为止。

具体步骤

从所有样本中随机选取k个样本,作为初始聚类中心;

对任意一样本,求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类;

利用均值方法更新各类中心;

迭代2,3步直到聚类中心值小于指定的阈值(保持不变)或达到最大迭代次数,算法结束。

Matlab代码实现

clear all;
close all;
clc;

str1 = {'聚类中心数:','最大迭代次数:'};
T = inputdlg(str1,'输入对话框  ');
K = str2double(T{1,1});
ite = str2double(T{2,1});

%鼠标随机取点
grid on;
axis([0 50 0 50]);
hold on
N = zeros(20000,2);%存储样本
L = 0;%存储样本个数
buttle = 1;
while buttle == 1
[x,y,buttle] = ginput(1);
plot(x,y,'mo');
L = L+1;
N(L,:) = [x,y];
end

%从样本中随机选择k个样本点,作为初始聚类中心
R = randperm(L);%将1至L随机数打乱
k = zeros(K,2);
for i = 1:K
k(i,:) = N(R(i),:);
end
disp( '初始聚类中心为:');
disp( num2str(k));

%开始迭代
for D = 1:ite
%求样本到每个聚类中心的距离
d = zeros(L,K);
for i = 1:L
for j = 1:K
d(i,j) = norm(N(i,:) - k(j,:))2;%欧氏距离
end
end

%按最短距离归类
dn = zeros(L,1);
for i = 1:L
[m ,n] = min(d(i,:));%m为最短距离,n为所在位置
dn(i,1) = n;%归类
end

%设置颜色
colour = zeros(K,3);
for i = 1:K
colour(i,:) = rand(1,3);
end

%利用均值法更新各类中心
k1 = zeros(K,2);
for i = 1:K
v = find(dn == i);%位置
u = length(v);%个数
M = zeros(u,2);%用来存储所属同一类的点
for j = 1:u
M(j,:) = N(v(j),:);
end
P = plot(M(:,1),M(:,2),'o');
set(P,'color',colour(i,:));
k1(i,:) = mean(M);
end
clear P;
if  abs(sum(sum(k1-k))) <= 0.0001 && D <= ite
disp( '聚类中心数为:');
disp( num2str(K));
disp( '最终的聚类中心为:');
disp( num2str(k1));
break
else
k = k1;
end
end

%显示距离中心
for i = 1:K
plot(k1(i,1),k1(i,2),'kp ');
end


结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息