k-means(学习Free Mind知识整理)

时间:2021-05-11 16:55:00


阅读http://blog.pluskid.org/?p=17文章中的一些知识整理:

===============================================================

介绍:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/index.html

===============================================================

聚类算法,不是分类算法。

分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类。

聚类算法是给一大堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类。

算法还要再重新温故一下:

     K-Means算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的质心,从而确定新的簇心。一直迭代,直到簇心的移动距离小于某个给定的值。

      算法大致思路:
      1、从给定样本中任选几个点作为初始中心 
      2、计算其余点分别和初始中心点的距离,跟哪个初始中心近就跟那个中心点归为一类(欧式距离公式),直到各自为“派别”
      3、在分好类的基础上按平均值的方法重新计算聚类中心点,再重复第二步...以此类推
      4、直到最后算法收敛(可以理解为中心点不再变动)则结束。

==================================================================

Free Mind给出了python的实现,因为我对python不是很熟悉,所以暂时只练习了matlab的。

K-means聚类算法采用是将N*P矩阵X划分为K个类,使得类内对象之间距离最小,而类之间距离最大。
使用方法:
Idx=Kmeans(X,K)
[Idx,C]=Kmeans(X,K)
[Idx,C,sumD]=Kmeans(X,K)
[Idx,C,sumD,D]=Kmeans(X,K)
[…]=Kmeans(…,’Param1’,Val1,’Param2’,Val2,…)
各输入输出参数介绍:
X N*P
数据矩阵
K 表示将X划分为几类,为整数
Idx N*1
向量,存储是每个点聚类标号
C K*P
矩阵,存储是K个聚类质心位置
sumD 1*K
和向量,存储是类间所有点与该类质心点距离之和
D N*K
矩阵,存储是每个点与所有质心距离

[…]=Kmeans(…,'Param1',Val1,'Param2',Val2,…)
这其中
参数Param1、Param2等,主要可以设置为如下:

1. ‘Distance’(距离测度)
‘sqEuclidean’ 欧式距离(默认时,采用此距离方式)
‘cityblock’ 绝度误差和,又称:L1
‘cosine’ 针对向量
‘correlation’   针对有时序关系

‘Hamming’ 只针对二进制数据

2. ‘Start’(初始质心位置选择方法)
‘sample’ 从X中随机选取K个质心点
‘uniform’ 根据X
分布范围均匀随机生成K个质心
‘cluster’ 初始聚类阶段随机选择10%
X子样本(此方法初始使用’sample’方法)
matrix 提供一K*P
矩阵,作为初始质心位置集合

3. ‘Replicates’(聚类重复次数)   整数

matlab-kmeans函数注释

X = [randn(100,2)+ones(100,2);...
     randn(100,2)-ones(100,2)]; 产生100个样本点,行指向每个样本,列是维变量值。
opts = statset('Display','final');

[idx,ctrs] = kmeans(X,2,'Distance','city','Replicates',5,'Options',opts);
%返回参数意义:[IDX,C,sumd,D]=kmeans()
IDX:每个样本点所在的类别
C:所聚类别的中心点坐标位置k*p,k是所聚类别
sumd:每个类内各点到中心点的距离之和
D:每个点到各类中心点的距离n*k

==================================================================
对于matlab实现的几个例子可以参考一下几个大神的:
==================================================================