1 基本思想
KMeans算法的基本思想就是将未知的数据集通过一定的相似性度量将未知类别的数据集自然地划分为K个数据集合,使得衡量标准达到比较好的值或者数据集合中心(采用均值)不变。也就是把n的对象根据他们的属性分为k个分割,k < n。它与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。它假设对象属性来自于空间向量,并且目标是使各个群组内部的均方误差总和最小。
2 举例
KMeans是典型的物以类聚思想
3 理论支持
4算法步骤
1) 将数据分为k个非空子集
2) 计算每个类中心点(k-means中用所有点的平均值,K-medoid用离该平均值最近的一个点)center
3)将每个object聚类到最近的center
4) 返回2,当聚类结果不再变化的时候stop
5 实验
实验使用了iris数据,思路是将训练数据单独训练聚类,然后用已有的标签对照,计算准确率。
function [X,center,iter,accuracy] = trainkmeans( traindata,trainlabel,k )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
[traindata_m,traindata_n]=size(traindata);
[trainlabel_m,trainlabel_n]=size(trainlabel);
%将训练数据保存结构体形式
for i=1:1:traindata_m
X(i).data=traindata(i,:);
X(i).label=0;
end
%初始化K个均值中心
center(1)=X(10);center(1).label=1;
center(2)=X(60);center(2).label=2;
center(3)=X(120);center(3).label=3;
newcenter(1)=X(10);newcenter(1).label=1;
newcenter(2)=X(60);newcenter(2).label=2;
newcenter(3)=X(120);newcenter(3).label=3;
%迭代求取最终的K个数据集合
change=1;iter=0;
while change~=0
for i=1:1:traindata_m%计算每个点到每个中心的距离,归为最小的
for j=1:1:k
D(j)=norm(X(i).data-center(j).data);
end
[temp,index]=min(D);
X(i).label=index;
end
for i=1:1:k %重新计算中心值
for j=1:1:traindata_n
sum=0;count=0;
for t=1:1:traindata_m
if X(t).label==center(i).label
sum=sum+X(t).data(j);
count=count+1;
end
end
newcenter(i).data(j)=sum/count;
end
if newcenter(i).data~=center(i).data
change=change+1;iter=iter+1;
else
change=0;
end
end
for i=1:1:k
center(i)=newcenter(i);
end
end
accuracy=0;
for i=1:1:trainlabel_m
if X(i).label==trainlabel(i,1)
accuracy=accuracy+1;
end
end
accuracy=accuracy/trainlabel_m;
end
实验结果
对K值的选取确实很麻烦的,并且初始的中心选取也很麻烦。开始指定同一个类里面的三个数据作为最初的三个中心结果效果很差iter=33,准确率却只有0.4467,。然后在三个不同的类里面指定数据,迭代次数19,准确率却上升为0.8867.
6优势和劣势
优势:自然地聚类,方法简单
劣势:K值的选取困难、对初始中心敏感。
在实际应用中往往会已知一些数据,可以以这些数据为初始的中心点,然后按聚类算法聚类计算。
7主要应用
搜索引擎的爬虫后对网页的处理,聚类分析
8改进
1)K值的选取通过观察误差准则的变化趋势判断,随着K值的增大误差准则慢慢变小,开始时候变化程度比较大,到达一定值后变化速度放慢,当K等于N时,误差准则等于0,转折点可作为K值的选取。
2)ISODATA