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