K-means算法

来源:互联网 发布:oracle sql developer 编辑:程序博客网 时间:2024/06/15 13:36

(一)简介

1.K-means是最常见的聚类算法,属于无监督学习算法;

(二)算法核心

在聚类问题中,给我们的训练样本是clip_image004,每个clip_image006; K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:

1.随机选取k个聚类质心点(cluster centroids)为clip_image008[6]

2.重复下面过程直到收敛 

{

              对于每一个样例i,计算其应该属于的类

               clip_image009

               对于每一个类j,重新计算该类的质心

               clip_image010[6]

}

(三)算法分析

1.定义算法目标函数:


(1)kmeans的收敛就是要使得J达到最小,思路是依次固定c(样本类别)或者u(质点)交叉迭代优化;

(2)由于J函数是非凸函数,跟c,u的初始化有关,容易陷入局部最优;实践中可多次优化,取最小的J对应的u跟c作为结果;

2.kmeans的不足:(1)对初始值敏感,容易陷入局部最优;(2)对孤立点以及噪声数据敏感;(3)需要用户自己定义 k 的大小;

(四)算法改进

1.二分kmeans算法

(1)定义函数:表示一个cluster中每个样本到质点的平方差


(2)算法思想:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于它们的质心,聚类效果就越好;所以我们就需要对误差平方和最大的簇进行再一次的划分,因为误差平方和越大,表示该簇聚类越不好,越有可能是多个簇被当成一个簇了,所以我们首先需要对这个簇进行划分;

(3)步骤:首先将所有点作为一个簇,然后将该簇一分为二;之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇;以此进行下去,直到簇的数目等于用户给定的数目k为止;

(4)优点:不受初始化问题的影响,因为这里不存在随机点的选取,且每一步都保证了误差最小

2.K中心算法

(1)将K均值算法中的取均值换成取中心点

(2)优点:不受孤立点数据以及噪声数据的影响

(五)算法实现

1.随机初始化K-means的字典Y(K个词,每个词N维);

2.假设某一个N维样本记为Xi,,每个词记为Yj,则Xi与Yj的欧式距离可以记为:


那么距离样本Xi最近的词Yj可以表示如下:


3.假设总共有m个样本,记为X(m行N列),那么可以用矩阵S来表示这些样本的聚类情况,S矩阵是一个m行K列的稀疏矩阵,若第i个样本距离第j个词最近,那么S(i,j)=1;

4.根据上述推导可以求出每个样本点与字典的距离,那么更新字典公式如下:


5.matlab代码如下:

m = 100;N = 10;K = 5;iterations = 10;X = rand(m,N);Y = rand(K,N);x2 = sum(X.^2,2);for itr = 1:iterations    c2 = 0.5*sum(Y.^2,2);    loss =0;    [val,labels] = max(bsxfun(@minus,Y*X',c2));    loss = loss + sum(0.5*x2- val');    S = sparse(1:m,labels,1,m,K,m);     summation = S'*X;    counts = sum(S,1)';    Y = bsxfun(@rdivide, summation, counts);    badIndex = logical(counts == 0);    Y(badIndex, :) = 0;end

PS:聚类算法的类型

(1)基于划分的聚类:kmeans

(2)基于层次的聚类:自底向上(每个样本点初始化为一个簇),自上到下(所有样本点初始化为一个簇)

(3)基于图的聚类:每个连通分支为一个簇

(4)基于密度的聚类:DBSCAN

(5)基于模型的聚类:GMM+EM

0 0
原创粉丝点击