1.普通k-means
給定個維數據點,,普通Kmeans算法將它們分成個類別,每個類別有一個類中心。目標函數是:
其中矩陣的第i列是,分成m個類別,那麼矩陣就有m列,,且b 的模長爲1,即b只有一個分量值爲1,其餘分量值爲0。
K-means算法之所以很難,其中一個原因是存在一個assignment過程,需要將數據集中每個點根據距離分配到離它最近的唯一的類中心所在的類別。
2.Orthogonal k-means with centers
對於上述的矩陣,一共有m列,{每列是一個向量,向量的線性組合仍然是一個向量,}有m個元素的集合一共有個子集,讓每個子集對應 一個類別。優化的目標函數如下:
這時b不再是1-of-k 編碼了,而是b的分量可以有0個或多個1。assignment時時間複雜度是,當非常大時,目標函數難以優化。
一個直觀的想法是,如果上述矩陣的各列互相正交,即滿足是一個對角矩陣。在這裏。令
= 2b-1∈ Hm ≡
則有:
其中sgn(*)函數作用於向量的每個分量。
平移後的ok-means優化的目標函數爲:
的計算方法是計算所有數據的平均向量。這個式子中,通過矩陣就將m維空間中的超立方體上的頂點映射到特徵空間,並且使得其映射後與特徵x儘可能接近。由於的每列是互相正交的,因此可以表示成一個旋轉矩陣和一個對角矩陣的積。
變形後爲:
其中。
這個形式下,最小化問題是一個Orthogonal Procrustes problem,可以先固定,首先在D的後面添加行,就是階矩陣,對R也做相應變形使得R變成p階方正,然後就可以使用SVD方法求解R了。由於是退化了的矩陣,因此我們只需要R的前m列就可以,其餘列都是對零空間的旋轉變化仍然是零空間。
此等式可進一步變形爲:
其中是的正交補。其中均爲m×n階矩陣。
{ps:這個簡單理解的話就是,歐式空間上一點到原點的距離平方等於其x座標值平方加上y座標值平方,x和y座標值是這個點分別在x和y方向上的投影長度;A左乘以一個矩陣R,相當於將A向R空間投影}
的第i行元素只能取值於,爲了最小化目標函數,當的對應位置元素爲正時,的相應位置元素取值,否則取值。根據最小化平方差原理,的最佳取值爲:
而矩陣的取值爲:
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相似度標準下,度量函數爲:
- Cartesian k-means
在ok-means算法中,矩陣的每個子矩陣都是兩列,即每個子中心集合只有兩個元素。但在Cartesian kmeans(ck-means)中,每個子集合有個元素。類中心的個數是 centers,但是要存儲的類中心的個數是。在確定某個query的類中心時,從m個元素個數爲h的子中心集合中各取一箇中心,然後求和(其實是將中心向量按維數拼接起來)得到其中心。公式表示如下:
ck-means優化的目標函數爲:
變形爲:
ck-means在假設各個子空間互相獨立的情況下,優化的目標函數可以化爲在各個子空間進行優化。
- Relations and related work
5.1 ITQ vs. ok-means
ITQ:
其中PCA投影矩陣$ W ∈R^{p×m}X’$,然後採用用PCA和隨機選擇將特徵轉換到二進制空間,優化一個平方誤差。
ok-means:
ok-means將m維空間中的超立方體上的頂點映射到特徵空間,並且優化子空間的量化誤差和投影誤差。
重點在於ok-means採用了一個投影過程將特徵空間分離了,表現爲上述目標函數RHS中的第二項,同時還有個****。
5.2 ok-means vs. ck-means.
令ck-means中的參數爲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既在子空間中優化又在空間劃分上優化(通過空間旋轉)。
6.實驗
數據:http://corpus-texmex.irisa.fr/
MATLAB代碼:https://github.com/norouzi/ckmeans
一個朋友寫的C++代碼:https://github.com/AnshanTJU/ckmeans