码迷,mamicode.com
首页 > 其他好文 > 详细

【机器学习】K-Means 聚类是特殊的矩阵分解问题

时间:2015-12-26 19:43:15      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

【机器学习】K-Means 聚类是特殊的矩阵分解(Matrix Factorization)问题


原文是:《k-Means Clustering Is Matrix Factorization》

本博客是该论文的阅读笔记,不免有很多细节不对之处。

还望各位看官能够见谅,欢迎批评指正。

更多相关博客请猛戳:http://blog.csdn.net/cyh_24

如需转载,请附上本文链接:http://blog.csdn.net/cyh_24/article/details/50408884

论文证明了传统的K-Means算法的目标函数可以被表达成数据矩阵与其低阶数据矩阵之间差异的Frobenius范数。

简要的说,K-Means 聚类其实是一种矩阵分解问题。

K-Means的推导,我想大家都已经很清楚了,这里不细说。它的目标函数,可以定义如下:

i=1kj=1nzij||xj?μi||2

如果能够把目标函数表达成如下形式,那么也就证明了K-Means聚类是特殊的矩阵分解问题。

?=||X?MZ||2
?=||X?XZT(ZZT)?1Z||2

先不用深究,下文会详细介绍,先注意几个变量的意义:
数据集 XRm?n 是向量 xiRm 的矩阵;
MRm?k,是类中心点 μiRm 的矩阵;
ZRk?n,是二值指示变量zij的矩阵;若xjCi,则zij=1,否则 zij=0

数学符号说明

  1. xi 表示矩阵 X 的第 j-th列向量(好像与平常的相反了);
  2. X的第(l,j)的元素可以写成xlj或者(X)lj
  3. ||x|| 表示欧式距离,
  4. ||X|| 则表示矩阵的 Frobenius 范数
  5. 其Frobenius 范数平方形式定义如下:
    ||X||2=l,jx2lj=j||xj||2=jxTjxj=j(XTX)jj=tr[XTX]

推导过程

假设,数据集X 可以分成 k 个类 C1,...Ck, 分别对应的类中心点是 μ1,...μk
zij 是二值指示变量:若xjCi,则zij=1,否则 zij=0
那么,显然可以得到:

izij=1

而每行总和刚好是这个类中的样本个数:

jzij=ni=|Ci|

由于zji{0,1},所以Z的每一列只有一个1,所以:

zij?zij=1(i=i)or0otherwise

因此,ZZT 是一个对角矩阵,并且:

(ZZT)ii=j(Z)ij(ZT)ji=jzijzij
=ni,ifi=i
=0,otherwise

Step 1: 将目标函数左边展开

技术分享

Step 2: 将目标函数中间项展开

接下来,我们看目标函数的中间项。作为矩阵Frobenius范数的平方,它可以按如下方式写:
技术分享

从之前的结论中,我们可以快速发现:T1=T4andT2=T5. 所以,只要T3=T6,那么我们假设的目标函数的第一个等式就成立了。所以,现在的目标就是证明 T3=T6.
来看一下T6,可以得到:

tr[ZTMTMZ]=tr[MTMZZT]

=i(MTMZZT)ii

=il(MTM)il(ZZT)li

=i(MTM)ii(ZZT)ii

=i||μi||2ni

在上面的推导中,我们用到了 ZZT 是对角阵的特性。到此,T3=T6证明完毕,因此,目标函数的第一个等式也就证明完毕了。

Step 3: 消除矩阵 M

现在的任务就是证明第二个等式。
回顾一下我们的目的,就是讲目标函数最小化, 因为已经证明了第一个等式,所以,其实也就是让||X?MZ||2 最小化:

δδM||X?MZ||2
=δδM[tr[XTX]?2tr[XTMZ]+tr[ZTMTMZ]]
=2(MZZT?XZT)

令偏导等于0,可以得到:

M=XZT(ZZT)?1

代入目标函数第二个等式,就证明完毕了。

结论

我们在上面用了一大堆令人眩晕的代数表达式,终于说明了K-Means聚类问题可以被理解成是如下的受约束的矩阵分解问题:

i=1kj=1nzij||xj?μi||2minZ||X?XZT(ZZT)Z||2

s.t.zij{0,1}

jzij=1

【机器学习】K-Means 聚类是特殊的矩阵分解问题

标签:

原文地址:http://blog.csdn.net/cyh_24/article/details/50408884

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!