原本在看這篇論文,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
occis a vector counting label occurences,cooccis a matrix counting cooccurences, andcardinalis 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。