spectral hashing--谱哈希源码解析
生活随笔
收集整理的這篇文章主要介紹了
spectral hashing--谱哈希源码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
論文里面看到了譜哈希用來找子集的用處,不管有沒有用,先轉再說
原文地址:http://blog.sina.com.cn/s/blog_67914f290101d2xp.html
最近看了有關譜哈希的一些東西,記錄一下備忘。理解十分粗淺,敬請各位大牛指導。
一、基本概念 ???語義哈希(semantic hashing)是為每個對象(圖像或文本)尋找一種二進制編碼,使兩個對象的相似度與其編碼之間的海明距離相關(即相似度高的對象對應的編碼海明距離小,相似度低的對象對應的編碼海明距離大)。而為每個對象尋找這么一個最優化的編碼是NP難解問題,通過松弛優化條件,得到一種譜問題,這個問題的結果是拉普拉斯算子的特征向量的一個子集。這種對松弛后問題的解決方法就是譜哈希。二、計算編碼 ???好的編碼要滿足以下條件:容易計算;短但能表示整個數據集;其海明距離與原對象之間的相似度相關。 ???松弛后譜問題的結果是帶權拉普拉斯-貝爾特拉米算子的特征方程,通過構造這樣的特征方程,并計算其前k個最小的特征值,最后所得到的編碼與特征值相關。 ???整個過程涉及比較高級的數學知識,超過了我的知識范圍,因此理解的十分粗淺。
三、源碼分析 ???PDF和源碼的下載地址:http://www.cs.huji.ac.il/~yweiss/SpectralHashing/ ???源碼中與譜哈希相關的主要有以下幾個文件:trainSH.m,compressSH.m,distMat.m,hammingDist.m,evaluation.m。下面一一介紹。 ???1、trainSH.m。輸入數據矩陣(每一行代表一個點),通過訓練得到譜哈希中所需的若干參數,包括對數據矩陣的PCA(主成分分析)處理及生成特征方程。 ?????主成分分析是一種對數據降維的方法,減少數據量的同時能盡量避免有用信息的流失。對一個矩陣提取主成分,即對矩陣中的每一行對應的向量提取主成分(對一個數據矩陣,每一行即每一數據點可看做所有隨機變量的一次取值,而每一列即每一維可看做一個隨機變量),只看矩陣中的其中一行,不妨設第一行,其元素值為x1,x2,…,xd,則其主成分是d個隨機變量的一個線性組合,即ai1x1+ai2x2+…+aidxd,而ai1,ai2,…,aid是隨機變量X1,X2,…,Xd的相關矩陣的第i個特征向量。因此,計算矩陣X的協方差矩陣(矩陣X有d列,代表d維,也代表d個隨機變量,協方差矩陣中元素即是d個隨機變量兩兩之間的協方差)Cov,矩陣Cov為d*d矩陣,計算矩陣Cov的特征向量和特征值,并從大到小取出前k個特征值對應的特征向量組成變換矩陣T,T為d*k矩陣,計算X*T,即提取出X的前k個主成分,因為X*T是s*k矩陣(s為矩陣X原先的長度),故X由原先的d維降到了k維,并且這k維包含了X最多的信息。 ?????原文中說選取了從小到大的k個特征值,而源碼實現中選取了從大到小的k個特征值,源碼實現中應該是正確的選擇,也許我對原文理解有誤,如果有熟悉譜哈希的,希望同志們能留言相告。
???2、compressSH.m。輸入數據矩陣和參數(來自trainSH.m的輸出),輸出U和B。U是k個特征方程的值,是個s*k的矩陣,每一行代表一個數據點,每一列代表一個特征方程的值(用來生成二進制編碼)。B是s*ceil(k/8)的矩陣,其中B(i,j)的值等于矩陣U的第i行的第(j-1)*8+1到第j*8個元素(如j=1,則是第1到第8個元素,j=2,則是第9到第16個元素,以此類推)的壓縮十進制值。即先將矩陣U的元素按其正負轉換成1和0(正對應1,負對應0),然后將8個01值轉換成十進制,即得到B中的元素值,8個01值中,維度較低的值處于低位,維度高的值處于高位。比如U的第一行的前八個數為:1,-0.7,-0.5,1,0.3,-0.4,0.2,1,轉換后為10011011,左邊為低位,右邊為高位,轉換成十進制數位217,則B(1,1)=217。
???3、hammingDist.m。輸入B1,B2(compressSH.m的輸出),設B1為s1*ceil(k/8)矩陣,B2為s2*ceil(k/8)矩陣,則輸出為s1*s2矩陣D,其中D(i,j)為B1第i行與B2第j行的海明距離(D=compressDist(B1,B2))。設B1第1行為12 14,B2第2行為23 41,則B1第1行轉換為二進制為0000110000001110,B2第2行轉換為二進制為0001011100101001,其海明距離為8,則D(1,2)=8。
???4、distMat.m。輸入為兩個矩陣或一個矩陣。若輸入兩個矩陣,計算兩個矩陣兩兩行之間的歐式距離;若是一個矩陣,計算該矩陣中兩兩行之間的歐式距離。輸入一個矩陣即為輸入兩個相同矩陣,下只考慮輸入為兩個矩陣。設這兩個矩陣為M1和M2,M1為s1*d矩陣,M2為s2*d矩陣,則輸出的距離矩陣D為s1*s2矩陣,其中D(i,j)為M1第i行和M2第j行的歐式距離(l2準則下的歐式距離)。
???5、evaluation.m。這里面包括確定kNN問題中的k值(即距離為k以內的點方視為近鄰),及對查詢集計算其查準率與查全率。首先對訓練集(數據集)進行訓練,設訓練集為矩陣M,計算distMat(M)得到矩陣D,矩陣D中第i行各元素表示M中第i行與其余各行之間的歐式距離。對D按行進行排序,并求出某選定列的平均值作為近鄰查詢的半徑。若選定第3列,因為第3列的各值表示全部數據集中每一點與其他各點的歐式距離的第三小值,因此可以將此值作為要平均查找3個近鄰時所需的半徑閾值。返回的查全率(recall)與查準率(precision)均是n*1矩陣,其中n在程序中定義,recall和precision中的第i行表示查找海明距離小于i的點作為候選點,在選出的候選點集中計算對應的查全率與查準率。evaluation.m中第24行中:score = zeros(20,1),即初始n設置為20,用戶可以根據自己數據的特點進行修改。
???6、Demo。寫Demo的步驟如下: ??????(1)利用訓練集及要查找的平均近鄰數確定可視為近鄰的最大距離(確定True Neighbor)。 ??????(2)計算查詢集中每個查詢子與所有點之間的距離,并得到一個近鄰矩陣N。N(i,j)為1表明第i個查詢子與第j個數據點是True Neighbor,為0表示不是True Neighbor。該矩陣用于計算spectral hashing查詢結果的recall和precision值。 ??????(3)利用spectral hashing算法為每個數據點分配二進制編碼,并計算查詢子與各數據點之間的海明距離。 ??????(4)定義確定候選集的閾值,N=該閾值內查找到的所有點數(候選集點數),n=候選集中是True Neighbor的點數,M=所有查詢子的True Neighbor點數。則recall=n/M,precision=n/N(查全率與查準率的宏觀值)。 ??????這個并不是絕對的,根據自己的實際情況來寫。
四、注意 ???????因為在譜哈系松弛過程中有數據點符合均勻分布的假設,因此這種方法不適用于維度通常很高并且數據矩陣特別稀疏的文本查詢。普通文本集都具有數萬至數百萬級別的維度,并且數據矩陣極為稀疏,這種數據集應用譜哈系所得結果會很差,而如果要得到較好的結果,只能對其進行預降維,這樣會損失很多信息,也不會得到特別好的結果。因此,譜哈系通常更適用于圖像檢索。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的spectral hashing--谱哈希源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行阿诺粉丝信用卡额度高吗?额度多久
- 下一篇: 人工神经网络——【BP】反向传播算法证明