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

K-means cluster

2016-09-28 11:26 183 查看
K - means cluster

1.K均值聚类(迭代算法):

C_center:初始化K个聚类中心
计算样本集合到C_center的距离(本例使用欧几里德距离)
按照最近原则进行聚类,如果聚类中心不发生改变,结束
如果发生改变,得到新的聚类中心->C_center,重复直到收敛

2.使用条件:先验知识知道样本集合能够K分类(才能得到较好的聚类效果),属于无监督学习;

3.优缺点:

算法简单,收敛
选出的每类代表可能并不具有代表性,算法需要进行多次迭代,把所有的数据读入内存中,大量数据可能不适用
4.样例:



训练样本很明显可以分为两类,红蓝点

X = [0,0;1,0;0,1;1,1;2,1;1,2;2,2;3,2;6,6;7,6;8,6;7,7;8,7;9,7;7,8;8,8;9,8;8,9;9,9;];

对样本X进行k_means cluster

5.代码:

--输出:

--output:训练出的K个聚类中心

--输入:

--Cluster:训练样本集合

--K:K聚类

--delta:迭代精度,用于

<span style="font-size:14px;"><span style="font-size:12px;">function [ output ] = K_means( Cluster,K,delta )
%output[nun_tezhen,K]
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
% figure(2);
%精度相同
Cluster = double(Cluster);
[num_test,num_tezhen] = size(Cluster);
%初始化K个聚类中心
C_center = zeros(num_tezhen,K);
for i = 1:K
C_center(:,i) = Cluster(i,:)';
end

%K个聚类集合
%C_class = zeros(num_test,num_tezhen,K);
C_class = [];
num_train = 1;
flag = 1;

while flag == 1
%hold all;
%disp(num_train);
num_train = num_train + 1;
%根据聚类中心进行分类,得到每一条记录的类别
%dist_all size K x num_test
dist_all = dist(C_center',Cluster');
[~,dist_min_index] = min(dist_all);

%将这些记录分别记录到对应的类别中
%dist_max_index size 1 x num_test
%C_class size num_test x num_tezhen x K
%Cluster size num_test x num_tezhen
new_class_center = zeros(K,num_tezhen);
for i = 1:K
for j = 1:num_test
if dist_min_index(1,j) == i
C_class = [C_class;Cluster(j,:)];
end
end
new_class_center(i,:) = mean(C_class);
C_class = [];
end

%重新确定聚类中心
%C_class size num_test x num_tezhen x K
%C_center size num_tezhen x K
%mean_class[1 x num_tezhen x K]
%new_class_center[K x num_tezhen]:代表新的K个聚类中心
%%mean_class = mean(C_class);
%%new_class_center = mean_class(1,:,:)';
dist_center = dist(C_center',new_class_center');
%     disp(C_center);
%     disp(new_class_center);
%     disp(dist_center);

%是否到达目标
%dist_center[K x K]
%new_class_center[K x num_tezhen]
%C_center[num_tezhen x k]
%如果有一个不满足条件,那么继续训练
for i = 1:K
if dist_center(i,i)>delta
flag = 0;
disp(num_train);
%           disp(dist_center(i,i));
break;
end
end

%如果所有的都满足条件,输出,结束
%否则继续训练
if flag == 1
output = C_center;
break;
else
C_center = new_class_center';
%plot(C_center(1,:),C_center(2,:),'bo','MarkerSize',num_train*10);
flag = 1;
if num_train > 10
output = C_center;
break;
end
end

%while
end

end

</span></span>
<span style="font-size:14px;"><span style="font-size:12px;"></pre></p><p><span style="font-size:14px;">6.测试:</span></p><p><span style="font-size:14px;"></span><pre name="code" class="plain"><span style="font-size:12px;">%用于得到2个聚类中心+测试
close all
X = [0,0;1,0;0,1;1,1;2,1;1,2;2,2;3,2;6,6;7,6;8,6;7,7;8,7;9,7;7,8;8,8;9,8;8,9;9,9;];
[num_test,num_tezhen] = size(X);
%output[nun_tezhen,K]
result = K_means(X,2,0.01);
dist_all = dist(result',X');
[~,dist_min_index] = min(dist_all);
figure(3);
title('分类结果');
for i = 1:num_test
hold all
if dist_min_index(1,i) == 1
plot(X(i,1),X(i,2),'r.');
text(X(i,1),X(i,2),['(' num2str(X(i,1)) ','  num2str(X(i,2)) ')'])
else
plot(X(i,1),X(i,2),'b+');
text(X(i,1),X(i,2),['(' num2str(X(i,1)) ','  num2str(X(i,2)) ')'])
end
end

figure(1);
plot(X(:,1),X(:,2),'r.');
hold on
plot(result(1,:),result(2,:),'b*');
hold on
for i = 1:2
hold on
text(result(1, i),result(2,i),['(' num2str(result(1,i)) ','  num2str(result(2,i)) ')'])
end
title('聚类结果');</span></span></span>


7.结果显示



蓝色的点即为训练后的k个中心;



将训练样本进行分类测试,红点代表一类,蓝点代表一类;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 MATLAB 模式识别