奇異值分解——學(xué)習(xí)筆記

原本在看這篇論文,Information-theoretical label embeddings for large-scale image classification。

發(fā)郵件想問(wèn)問(wèn)可以不可分享代碼,這是作者回信提到的

I don't have any of that code anymore. But the code for computing PMI-SVD embeddings is basically just a few lines of numpy. The code for training an image model is just regular Keras. There is nothing complicated or magic.

If occ is a vector counting label occurences, coocc is a matrix counting cooccurences, and cardinal is the total number of occurences, then the embedding code is:

pmi = cardinal * coocc / (np.dot(occ, occ.T) + 10e-5)
pmi[coocc > 0.] = np.log(pmi[coocc > 0.])
pmi[coocc == 0.] = 0.
u, s, _ = np.linalg.svd(pmi)
sigma = np.eye(len(s)) * np.sqrt(s)  
embeddings = np.dot(u, sigma[:dim].T)

其中PMI(pointwise mutual information ) 中用到了奇異值分解。


這是論文里的相關(guān)描述

論文截圖

于是想找找關(guān)于奇異值分解的文章,在知乎找到了這個(gè)答案

答案里說(shuō)到了秩為1的矩陣,于是又去找了幾篇文章重溫一下秩是什么。
http://blog.csdn.net/u011240016/article/details/52811606
http://blog.csdn.net/u011240016/article/details/52926635
http://blog.csdn.net/u011240016/article/details/52805663
http://blog.csdn.net/u011240016/article/details/53386184
http://blog.csdn.net/u011240016/article/details/52869027

總的來(lái)說(shuō),組成矩陣的線性無(wú)關(guān)的向量個(gè)數(shù)。
比如說(shuō)下面的矩陣,


第二行和第三行都能用第一行乘某個(gè)數(shù)字得到,即線性無(wú)關(guān)(獨(dú)立)的向量個(gè)數(shù)是1,即秩是1。
而對(duì)于一個(gè)秩為1的矩陣,常常給定的是一個(gè)列向量與自己的轉(zhuǎn)置之積。
而這種秩是1的矩陣有一個(gè)特性,就是能分解成兩個(gè)矩陣之積。


好了,重溫完了關(guān)于矩陣和秩的內(nèi)容,回到知乎看完了關(guān)于奇異值分解的答案,明白了sigma其實(shí)就是奇異值,而且是按照從大到小排列的。

不過(guò)看完了還是不知道原論文中


論文截圖

分解后的三個(gè)矩陣為什么這么寫(xiě)。因?yàn)樽詈笠粋€(gè)應(yīng)該是Vt才對(duì),和Ut沒(méi)什么關(guān)系。

這篇文章有一些圖很棒,畫(huà)出了分解后的三個(gè)矩陣,方便理解。

文章截圖

下面是用numpy里的而np.linalg.svd試了一下。下面的寫(xiě)法表示維度。2*3表示2維*3維。

A=2*3
U = 2*2
sigma = 2*2
VT = 2*3

可是發(fā)現(xiàn)維度是對(duì)不上的,sigma本來(lái)應(yīng)該跟A矩陣的大小2*3一樣,但linalg.svd()只返回了一個(gè)行向量的sigma,并且只有2個(gè)奇異值(本來(lái)應(yīng)該有3個(gè)),這是因?yàn)榈谌齻€(gè)奇異值為0,舍棄掉了。之所以這樣做,是因?yàn)楫?dāng)A是非常大的矩陣時(shí),只返回奇異值可以節(jié)省很大的存儲(chǔ)空間。

接下來(lái)試著用這三個(gè)矩陣再重組得到A。
sigma是奇異值,先變成奇異值矩陣。變?yōu)榫仃嚭螅偌覽0, 0]列。這樣維度就都符合了


然后就是U*dia_sigma*VT。不過(guò)必須用np.dot()才是矩陣乘法。復(fù)原得到了A。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容