K-Means Algorithm

K-Means算法是一种聚类(Clustering)算法,属于非监督学习算法(Unserpvised Learning)的一种,它可以根据数据的分布特典自动对数据进行分类。应用的场景包括市场划分(Market Segmentation), 分割服务器集群,社交网络集群分割,等等。

算法步骤

K-Means的算法步骤可以如下图所列:
K-Means Algorithm_第1张图片
其中第一个for循环叫Cluster Assignment Step, 第二步叫Move Centroid Step。

优化目标

此算法的优化目标函数或者叫失真损失函数(Distrorion Cost Function)如下图所示:
K-Means Algorithm_第2张图片
在数学上可以证明,K-Means算法每次迭代,损失函数都会逐步减小。

证明如下:

通过第一个for循环可以计算出 ci c i ,J可以重写为:

J=1N1i=1N1||xiμc1||2 + 1N2i=1N2||xiμc2||2 + ... + 1Nki=1Nk||xiμck||2N1+N2+...Nk=m J = 1 N 1 ∑ i = 1 N 1 | | x i − μ c 1 | | 2   +   1 N 2 ∑ i = 1 N 2 | | x i − μ c 2 | | 2   +   . . .   +   1 N k ∑ i = 1 N k | | x i − μ c k | | 2 , 其 中 N 1 + N 2 + . . . N k = m

可以看出相对于 μci μ c i 每部分都是独立的,所以求J的最小值,就是求每部分的最小值,以 J1=1N1N1i=1||xiμc1||2 J 1 = 1 N 1 ∑ i = 1 N 1 | | x i − μ c 1 | | 2 为例:
J1μc1=2N1i=1N1(xiμc1)T=2(1N1i=1N1xiμc1)T ∂ J 1 ∂ μ c 1 = − 2 N 1 ∑ i = 1 N 1 ( x i − μ c 1 ) T = − 2 ( 1 N 1 ∑ i = 1 N 1 x i − μ c 1 ) T

令一阶导数等于0,可得 μc1=1N1N1i=1xi μ c 1 = 1 N 1 ∑ i = 1 N 1 x i ,又因为 2J1μ2c1=2>0 ∂ 2 J 1 ∂ μ c 1 2 = 2 > 0 ,所以为最小值。这正是算法第二步更新的值。

一点题外话:上一步的计算用到了矩阵微积分,其实 J1 J 1 是标量,对向量 μc1 μ c 1 求导,其实就是对向量中的每个维度求导,结果还是一个向量,使用矩阵或者向量的形式来写,可以简化书面表达和计算。归根结底,矩阵微积分是属于多元微积分的范畴。

K值初始化

不难想象,不同K值初始化,算法的最终结果会有不同。
K-Means Algorithm_第3张图片
如上图所示,K值得选取可能会使算法收敛到局部极值。
有一种解决办法是,做多次随机初始化并运行算法,然后从中选出最优解。
K-Means Algorithm_第4张图片
在实际应用中,如果K的个数比较小,例如在2到10个之间,那么这个方法大概率会奏效。但是如果K的个数过于庞大,例如几百个,这个方法的结果大概率不尽人意。

K值个数的选取

有一种方法叫Elbow Method:
K-Means Algorithm_第5张图片
按K值从小到大,依次运行算法,比较损失函数的大小,然后进行如图中的选择。但是这个方法的缺点是,在实际应用中,K-J曲线一般比较平滑,这样对K的个数的选择就比较困难。

另外一种更为推荐的方法如下图所示:
K-Means Algorithm_第6张图片
通常运行K-Means算法是为了后面更进一步应用这个结果,所以K值个数应当由后续具体应用来决定。图中给了一个例子:例如想根据数据来决定生产T-shirt的大小,可以先考虑到底想生产出几种大小,这个时候可根据具体情况来决定(3种?5种?)。然后再根据算法来算出最佳各种大小的尺码。

以上截图均来自Coursera的ML.

你可能感兴趣的:(Machine,Learning)