给定 n n n个 p p p维数据点, D ≡ { X j } j = 1 n D≡\{X_j\}_{j=1}^n D≡{Xj}j=1n,普通Kmeans算法将它们分成 k k k个类别,每个类别有一个类中心。目标函数是:
其中矩阵 C C C的第i列是 c i c_i ci,分成m个类别,那么矩阵就有m列, b ∈ { 0 , 1 } k b ∈ \{0, 1\}^k b∈{0,1}k,且b 的模长为1,即b只有一个分量值为1,其余分量值为0。
K-means算法之所以很难,其中一个原因是存在一个assignment过程,需要将数据集中每个点根据距离分配到离它最近的唯一的类中心所在的类别。
对于上述的矩阵 C C C,一共有m列,{每列是一个向量,向量的线性组合仍然是一个向量,}有m个元素的集合一共有 2 m 2^m 2m个子集,让每个子集对应 一个类别。优化的目标函数如下:
这时b不再是1-of-k 编码了,而是b的分量可以有0个或多个1。assignment时时间复杂度是 O ( 2 m n ) O(2^mn) O(2mn),当 2 m 2^m 2m非常大时,目标函数难以优化。
一个直观的想法是,如果上述矩阵 C C C的各列互相正交,即满足 C T C C^TC CTC是一个对角矩阵。在这里。令
b ′ b' b′= 2b-1∈ Hm ≡ { − 1 , 1 } m \{−1, 1\}^m {−1,1}m
则有:
其中sgn(*)函数作用于向量的每个分量。
平移后的ok-means优化的目标函数为:
μ \mu μ的计算方法是计算所有数据的平均向量。这个式子中,通过矩阵 C 和 μ C和\mu C和μ就将m维空间中的超立方体上的顶点映射到特征空间,并且使得其映射后与特征x尽可能接近。由于 C C C的每列是互相正交的,因此可以表示成一个旋转矩阵和一个对角矩阵的积。
变形后为:
其中 C ≡ R D C ≡ RD C≡RD , R ∈ R p × m , 且 R T R = I m , D 是 m 阶 对 角 正 定 矩 阵 ,R ∈ R^{p×m},且R^TR = I_m ,D是m阶对角正定矩阵 ,R∈Rp×m,且RTR=Im,D是m阶对角正定矩阵。
这个形式下,最小化问题是一个Orthogonal Procrustes problem,可以先固定 D B ′ , 优 化 R DB^{'},优化R DB′,优化R,首先在D的后面添加 p − m p-m p−m行, D B ′ DB^{'} DB′就是 p × n p × n p×n阶矩阵,对R也做相应变形使得R变成p阶方正,然后就可以使用SVD方法求解R了。由于 D B ′ DB^{'} DB′是退化了的矩阵,因此我们只需要R的前m列就可以,其余列都是对零空间的旋转变化仍然是零空间。
此等式可进一步变形为:
其中 R ⊥ R^⊥ R⊥是 R R R的正交补。其中 D 是 m 阶 对 角 矩 阵 , D B ′ 和 R T X ′ D是m阶对角矩阵,DB^{'}和R^TX^{'} D是m阶对角矩阵,DB′和RTX′均为m×n阶矩阵。
{ps:这个简单理解的话就是,欧式空间上一点到原点的距离平方等于其x坐标值平方加上y坐标值平方,x和y坐标值是这个点分别在x和y方向上的投影长度;A左乘以一个矩阵R,相当于将A向R空间投影}
D B ′ DB^{'} DB′的第i行元素只能取值于 { − d i , + d i } , d i = D i i \{−d_i,+d_i\},d_i=D_{ii} {−di,+di},di=Dii,为了最小化目标函数,当 R T X ′ R^TX^{'} RTX′的对应位置元素为正时, D B ′ DB^{'} DB′的相应位置元素取值 d i d_i di,否则取值 − d i -d_i −di。根据最小化平方差原理, d i d_i di的最佳取值为:
而矩阵 B ′ B^{'} B′的取值为:
回顾下解决Orthogonal Procrustes problem的方法:
当B固定时求解这个目标式的最小值就是一个Orthogonal Procrustes problem。于是,先对矩阵做SVD分解为,更新R使得。
在ANN中,检索有两种方法,一种是计算对database特征和query特征都进行量化后的距离,另一种是计算仅仅对database特征进行量化后与query之间的距离。分别叫SQD和AQD。SQD要比AQD快,但是效果差些。AQD相似度标准下,度量函数为:
在ok-means算法中,矩阵 C C C的每个子矩阵都是两列,即每个子中心集合只有两个元素。但在Cartesian kmeans(ck-means)中,每个子集合有 h ( h > = 2 ) h(h>=2) h(h>=2)个元素。类中心的个数是 h m h^m hm centers,但是要存储的类中心的个数是 h m hm hm。在确定某个query的类中心时,从m个元素个数为h的子中心集合中各取一个中心,然后求和(其实是将中心向量按维数拼接起来)得到其中心。公式表示如下:
ck-means优化的目标函数为:
变形为:
ck-means在假设各个子空间互相独立的情况下,优化的目标函数可以化为在各个子空间进行优化。
5.1 ITQ vs. ok-means
ITQ:
其中PCA投影矩阵$ W ∈R^{p×m} , R 为 选 择 矩 阵 。 I T Q 先 将 数 据 X 中 心 化 为 ,R为选择矩阵。 ITQ先将数据X中心化为 ,R为选择矩阵。ITQ先将数据X中心化为X’$,然后采用用PCA和随机选择将特征转换到二进制空间,优化一个平方误差。
ok-means:
ok-means将m维空间中的超立方体上的顶点映射到特征空间,并且优化子空间的量化误差和投影误差。
重点在于ok-means采用了一个投影过程将特征空间分离了,表现为上述目标函数RHS中的第二项,同时还有个****。
5.2 ok-means vs. ck-means.
令ck-means中的参数 h h h为2,就是ok-means。
5.3 PQ vs. ck-means
PQ与ck-means一样将特征空间分成许多个子空间,同时假设各个子空间之间互相正交。但是PQ中没有一个需要优化的选择矩阵R,因此子空间划分对于PQ非常重要。本人也做过PQ的实验,可以访问http://blog.csdn.net/chieryu/article/details/50404920
ck-means既在子空间中优化又在空间划分上优化(通过空间旋转)。
数据:http://corpus-texmex.irisa.fr/
MATLAB代码:https://github.com/norouzi/ckmeans
一个朋友写的C++代码:https://github.com/AnshanTJU/ckmeans
本文链接:http://blog.csdn.net/chieryu/article/details/51170843