1.普通k-means
给定n个p维数据点,D≡{Xj}nj=1,普通Kmeans算法将它们分成k个类别,每个类别有个类中心。目标函数是:
其中矩阵C的第i列是ci,分成m个类别,那么矩阵就有m列,b∈{0,1}k,且b 的模长为1,即b只有一个分量值为1,其余分量值为0。
K-means算法之所以很难,其中一个原因是存在一个assignment过程,需要将数据集中每个点根据距离分配到离它最近的唯一的类中心所在的类别。
2.Orthogonal k-means with 2m centers
对于上述的矩阵C,一共有m列,{每列是一个向量,向量的线性组合仍然是一个向量,}有m个元素的集合一共有2m个子集,让每个子集对应 一个类别。优化的目标函数如下:
这时b不再是1-of-k 编码了,而是b的分量可以有0个或多个1。assignment时时间复杂度是O(2mn),当2m非常大时,目标函数难以优化。
一个直观的想法是,如果上述矩阵C的各列互相正交,即满足CTC是一个对角矩阵。在这里。令
b′=2b?1∈Hm≡{?1,1}m,则有:
其中sgn(*)函数作用于向量的每个分量。
平移后的ok-means优化的目标函数为:
μ的计算方法是计算所有数据的平均向量。这个式子中,通过矩阵C和μ就将m维空间中的超立方体上的顶点映射到特征空间,并且使得其映射后与特征x尽可能接近。由于C的每列是互相正交的,因此可以表示成一个旋转矩阵和一个对角矩阵的积。
变形后为:
其中C≡RD,R∈Rp×m,且RTR=Im,D是m阶对角正定矩阵。
这个形式下,最小化问题是一个Orthogonal Procrustes
problem,可以先固定DB′,优化R,首先在D的后面添加p?m行,DB′就是p×n阶矩阵,对R也做相应变形使得R变成p阶方正,然后就可以使用SVD方法求解R了。由于DB′是退化了的矩阵,因此我们只需要R的前m列就可以,其余列都是对零空间的旋转变化仍然是零空间。
此等式可进一步变形为:
其中R⊥是R的正交补。其中D是m阶对角矩阵,DB′和RTX′均为m×n阶矩阵。DB′的第i行元素只能取值于{?di,+di},di=Dii,为了最小化目标函数,当RTX′的对应位置元素为正时,DB′的相应位置元素取值di,否则取值?di。根据最小化平方差原理,di的最佳取值为:
而矩阵B′的取值为:
3.1. Learning ok-means
回顾下解决Orthogonal Procrustes problem的方法:
当B固定时求解这个目标式的最小值就是一个Orthogonal Procrustes problem。于是,先对矩阵做SVD分解为,更新R使得。
3.2. Approximate nearest neighbor search
在ANN中,检索有两种方法,一种是计算对database特征和query特征都进行量化后的距离,另一种是计算仅仅对database特征进行量化后与query之间的距离。分别叫SQD和AQD。SQD要比AQD快,但是效果差些。AQD相似度标准下,度量函数为:
4. Cartesian k-means
在ok-means算法中,矩阵C的每个子矩阵都是两列,即每个子中心集合只有两个元素。但在Cartesian kmeans(ck-means)中,每个子集合有h(h>=2)个元素。类中心的个数是hm centers,但是要存储的类中心的个数是hm。在确定某个query的类中心时,从m个元素个数为h的子中心集合中各取一个中心,然后求和(其实是将中心向量按维数拼接起来)得到其中心。公式表示如下:
ck-means优化的目标函数为:
变形为:
ck-means在假设各个子空间互相独立的情况下,优化的目标函数可以化为在各个子空间进行优化。
未完,待续。。。