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:迭代精度,用于
7.结果显示
蓝色的点即为训练后的k个中心;
将训练样本进行分类测试,红点代表一类,蓝点代表一类;
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个中心;
将训练样本进行分类测试,红点代表一类,蓝点代表一类;
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法