K-Means算法学习笔记

来源:互联网 发布:花生壳 免费 域名 流量 编辑:程序博客网 时间:2024/05/16 12:33

最近在学K-Means算法,感觉挺有意思。要说K-Means,得先说说什么是聚类。

聚类

聚类是无监督(标签)学习,不依赖于预定义的类别和标签的训练实例。在进行聚类前甚至可能不知道要样本要分几类,类别是什么。所以说,与预先样本定义好类别(如:学生 -1,老师 +1)的分类来说,是一种无监督学习。

K-Means

K-Means是一种聚类算法,据说是最简单的聚类算法(没有之一)。
算法的目标:给定一个元素集合D,包含许多样本点,将其分类。如下图:
K-Means算法
算法原理:
1、给定一个元素集合D,包含许多样本点。
2、随机在集合D中,选取K个样本点(假设K=4,也就是最后要分4类),作为中心点
3、计算集合D中所有的点,到这4个点的距离。例如,这四个选定的点计为X1,X2,X3,X4。到X1的距离比到其他三个点(X2,X3,X4)点距离近的,归为X1点所代表的类(可以说是X1代表第一类,X2代表第二类….)。
4、将所有点分好类后,现在有第一类、第二类,第三类,第四类,这四个点集。然后,计算第一类中所有点的平均值,将这个值作为新的中心点X1。然后按同样方法计算第二类、第三类、第四类的新的中心点
5、重复(3),(4),直到四个中心点(X1,X2,X3,X4)不再变化

算法原理,理解起来,很简单。但是K-Means算法,要分几类,即K的值要自己确定,这个值将影响算法的好坏。设置K值的多少,结果也会不一样。所以,产生了K-Means++算法,这个算法可以我们分析样本合集,自动的选择初始点。(K-Means++的原理以后再讲。)

MATLAB中使用K-Means算法。

这里使用了下面网址调用MATLAB的kmeans的命令,小小修改了一下。
http://blog.sina.com.cn/s/blog_62186b46010145ne.html

%随机获取150个点X = [randn(50,2)+ones(50,2);randn(50,2)-ones(50,2);randn(50,2)+[ones(50,1),-ones(50,1)]];opts = statset('Display','final');%调用Kmeans函数%X          N*P的矩阵%Idx       N*1的向量,存储的是每个点的聚类标号(标号,标记点是第一类、第二类还是第三类)%Ctrs     K*P的矩阵,存储的是K个聚类质心位置。K个中点点%SumD     1*K的和向量。存储的是类间所有点与该类钟心点距离之和%D        N*K的矩阵,存储的是每个点与所有中心的距离;[Idx,Ctrs,SumD,D] = kmeans(X,3,'Replicates',3,'Options',opts);%画出聚类为1的点。X(Idx==1,1),为第一类的样本的第一个坐标;X(Idx==1,2)为第二类的样本的第二个坐标plot(X(Idx==1,1),X(Idx==1,2),'r.','MarkerSize',14)hold onplot(X(Idx==2,1),X(Idx==2,2),'b.','MarkerSize',14)hold onplot(X(Idx==3,1),X(Idx==3,2),'g.','MarkerSize',14)%绘出聚类中心点,kx表示是圆形plot(Ctrs(:,1),Ctrs(:,2),'kx','MarkerSize',14,'LineWidth',4)legend('Cluster 1','Cluster 2','Cluster 3','Centroids','Location','NW') CtrsSumD
0 0
原创粉丝点击