K-means cluster
Posted qq_784583650
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K-means cluster相关的知识,希望对你有一定的参考价值。
K - means cluster1.K均值聚类(迭代算法):
- C_center:初始化K个聚类中心
- 计算样本集合到C_center的距离(本例使用欧几里德距离)
- 按照最近原则进行聚类,如果聚类中心不发生改变,结束
- 如果发生改变,得到新的聚类中心->C_center,重复直到收敛
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个中心;
将训练样本进行分类测试,红点代表一类,蓝点代表一类;
以上是关于K-means cluster的主要内容,如果未能解决你的问题,请参考以下文章
解释 K-Means cluster_centers_ 输出