您的位置:首页 > 其它

k-means 聚类算法

2016-06-17 04:59 302 查看

K-means

这是一个聚类算法:

将{x1,x2,...,xm}进行分类,数据没有标签,属于无监督分类。K-means算法如下:

1、初始化聚类中心点μ1,μ2,...,μk ,随机生成。

2、重复直至收敛

{

对于每个i,

ci:=argmin||xi−μj||2

对于每个j,

μj=∑mi=1{ci=j}xi∑mi=1{ci=j}

}

ci是生成的聚类,在每一次迭代中计算该聚类的平均值,然后吸纳新的离它近的点,不断完善和扩充。最后形成一个个小团体。

第一个公式是计算点到聚类平均值的距离,并更新聚类。第二个公式是计算聚类平均值。

% k-means例子


clear all;

close all;

clc;

%第一类数据

mu1 = [0 0 0]; %均值

S1 = [0.3 0 0;0 0.35 0;0 0 0.3]; %协方差

data1 = mvnrnd(mu1,S1,100); %产生高斯分布数据

%%第二类数据

mu2 = [1.25 1.25 1.25];

S2 = [0.3 0 0;0 0.35 0;0 0 0.3];

data2 = mvnrnd(mu2,S2,100);

%第三个类数据

mu3 = [-1.25 1.25 -1.25];

S3 = [0.3 0 0;0 0.35 0;0 0 0.3];

data3 = mvnrnd(mu3,S3,100);

%显示数据

plot3(data1(:,1),data1(:,2),data1(:,3),’+’);

hold on;

plot3(data2(:,1),data2(:,2),data2(:,3),’r+’);

plot3(data3(:,1),data3(:,2),data3(:,3),’g+’);

grid on;

%三类数据合成一个不带标号的数据类

data = [data1;data2;data3]; %这里的data是不带标号的

%k-means聚类

[u, re] = k_means(data,3); %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度

[m, n] = size(re);

%最后显示聚类后的数据

figure;

hold on;

for i=1:m

if re(i,4)==1

plot3(re(i,1),re(i,2),re(i,3),’ro’);

elseif re(i,4)==2

plot3(re(i,1),re(i,2),re(i,3),’go’);

else

plot3(re(i,1),re(i,2),re(i,3),’bo’);

end

end

plot3(u(:,1),u(:,2),u(:,3),’kx’,’MarkerSize’,14,’LineWidth’,4);

grid on;

function [cc, ds] = k_means(data,N)


% * input [b]**[/b]

% N是数据一共分多少类

% data是输入的不带分类标号的数据

% [b]***************[/b]

%* Output [b]**[/b]

% cc每一类的中心 cluster center

% ds是返回的带分类标号的数据 data structured

% [b]*****************[/b]

[m,n] = size(data); % m是数据个数,n是数据维数

dmax = max(data); dmin = min(data);

cc = zeros(N,n);

for i = 1:N

cc(i,:) = dmin + (dmax-dmin) .* rand(1);% cluster center

end

ds = zeros(size(data,1), N+1);% N+1 contains: the distance to N cluster center and the label

while 1

lastcc = cc;

% compute distance between every point to cluster center

for i = 1:m

for j = 1:N

ds(i,j) = norm(data(i,:) - cc(j,:));

end

[minDistance, label] = min(ds(i,1:N));

ds(i, end) = label;

end

%update the mean value of every cluster
for i = 1:N
idx = find(ds(:,end) == i);% point index of cluster
cc(i,:) = mean(data(idx,:));
end

if( norm(lastcc - cc) < 0.1)
break;
end


end

ds = [data, ds(:,end)];

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