1 聚类
聚类是无监督学习(unsupervised learning)的一种,主要是通过对未标记的样本的学习,揭示数据的内部内在性质和规律。
聚类的形式化定义(来自周志华的《机器学习》)
2 k均值算法
k均值算法的描述:
西瓜书中有个例子,样本集:
书上给出了对k均值算法的详细描述:
3 matlab代码实现
(参考http://www.cnblogs.com/tiandsp/archive/2013/04/24/3040883.html)
clear all;
close all;
clc;
data1 = xlsread('melon.xls','B:B') %desity of watermelon
data2 = xlsread('melon.xls','C:C') %sugar content of watermelon
data = [data1,data2]
%k-means聚类
KMeans(data,3); %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
调用的函数
function [u re] = KMeans(data,N) %N是数据分为类数,data是输入数据,u是每类均值
[m n]=size(data); %m是数据个数30,n是数据维数2
u(1,:) = data(6,:);
u(2,:) = data(12,:);
u(3,:) = data(27,:);
num = 1;
while 1
%%
pre_u=u; %上一次求得的中心位置
for i=1:N
tmp{i}=[];
for j=1:m %m=30
tmp{i}=[tmp{i};data(j,:)-u(i,:)];%所有样本与3个均值向量的差,分别存在三个元胞中
end
end
quan=zeros(m,N);%30*3
re=[];
for i=1:m %m=30
c=[];
for j=1:N
c=[c norm(tmp{j}(i,:))];
end
[junk,index]=min(c); %junk是c中最小的值,index是c中最小值的索引,与3个均值向量最小的2范数
quan(i,index)=1; %将quan的第i行第index列设置了c中最小的值
re=[re;data(i,:) index];
end
%%
[m k]=size(re);
%最后显示聚类后的数据
figure;
hold on;
for i=1:m
if re(i,3)==1
plot(re(i,1),re(i,2),'ro');
elseif re(i,3)==2
plot(re(i,1),re(i,2),'go');
elseif re(i,3)==3
plot(re(i,1),re(i,2),'bo');
end
end
grid on;
%%
for i=1:N %求出新的均值向量
for j=1:n %n是数据维数2
u(i,j)=sum(quan(:,i).*data(:,j))/(length(find(quan(:,i))==1));
end
end
fprintf('%d ',num);
num = num + 1; %不能用像c的num++形式
if (pre_u == u) %不断迭代直到位置不再变化
break;
end
end
4 运行结果
(周志华的《机器学习》书中写了迭代了4次,但是我实验时只迭代了一次,网上也有人只迭代出了一次:https://segmentfault.com/q/1010000007634688,具体原因不知道)