姓名:劉保闊
學(xué)號:19021210887
轉(zhuǎn)自:https://www.cnblogs.com/tianqizhi/p/9745913.html
【嵌牛導(dǎo)讀】
? ? ? 奇異值分解(Singular Value Decomposition)是矩陣論中一種重要的矩陣分解,奇異值分解則是特征分解在任意矩陣上的推廣骑篙。在信號處理玷坠、統(tǒng)計學(xué)等領(lǐng)域有重要應(yīng)用老虫。
【嵌牛正文】
一、奇異值與特征值基礎(chǔ)知識:
? 特征值分解和奇異值分解在機器學(xué)習(xí)領(lǐng)域都是屬于滿地可見的方法撞蜂。兩者有著很緊密的關(guān)系,我在接下來會談到,特征值分解和奇異值分解的目的都是一樣表鳍,就是提取出一個矩陣最重要的特征。先談?wù)勌卣髦捣纸獍桑?/p>
?? 1)特征值:
??? 如果說一個向量v是方陣A的特征向量祥诽,將一定可以表示成下面的形式:
??? 這時候λ就被稱為特征向量v對應(yīng)的特征值譬圣,一個矩陣的一組特征向量是一組正交向量。特征值分解是將一個矩陣分解成下面的形式:
??? 其中Q是這個矩陣A的特征向量組成的矩陣雄坪,Σ是一個對角陣厘熟,每一個對角線上的元素就是一個特征值。我這里引用了一些參考文獻中的內(nèi)容來說明一下维哈。首先绳姨,要明確的是,一個矩陣其實就是一個線性變換阔挠,因為一個矩陣乘以一個向量后得到的向量飘庄,其實就相當于將這個向量進行了線性變換。比如說下面的一個矩陣:
它其實對應(yīng)的線性變換是下面的形式:
因為這個矩陣M乘以一個向量(x,y)的結(jié)果是:
上面的矩陣是對稱的购撼,所以這個變換是一個對x跪削,y軸的方向一個拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值>1時份招,是拉長切揭,當值<1時時縮短),當矩陣不是對稱的時候锁摔,假如說矩陣是下面的樣子:
它所描述的變換是下面的樣子:
這其實是在平面上對一個軸進行的拉伸變換(如藍色的箭頭所示)廓旬,在圖中,藍色的箭頭是一個最主要的變化方向(變化方向可能有不止一個)谐腰,如果我們想要描述好一個變換孕豹,那我們就描述好這個變換主要的變化方向就好了。反過頭來看看之前特征值分解的式子十气,分解得到的Σ矩陣是一個對角陣励背,里面的特征值是由大到小排列的,這些特征值所對應(yīng)的特征向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)砸西。
當矩陣是高維的情況下叶眉,那么這個矩陣就是高維空間下的一個線性變換址儒,這個線性變化可能沒法通過圖片來表示,但是可以想象衅疙,這個變換也同樣有很多的變換方向莲趣,我們通過特征值分解得到的前N個特征向量,那么就對應(yīng)了這個矩陣最主要的N個變化方向饱溢。我們利用這前N個變化方向喧伞,就可以近似這個矩陣(變換)。也就是之前說的:提取這個矩陣最重要的特征绩郎∨琐辏總結(jié)一下,特征值分解可以得到特征值與特征向量肋杖,特征值表示的是這個特征到底有多重要溉仑,而特征向量表示這個特征是什么,可以將每一個特征向量理解為一個線性的子空間兽愤,我們可以利用這些線性的子空間干很多的事情彼念。不過,特征值分解也有很多的局限浅萧,比如說變換的矩陣必須是方陣逐沙。
? 2)奇異值:
??? 下面談?wù)勂娈愔捣纸狻L卣髦捣纸馐且粋€提取矩陣特征很不錯的方法洼畅,但是它只是對方陣而言的吩案,在現(xiàn)實的世界中,我們看到的大部分矩陣都不是方陣帝簇,比如說有N個學(xué)生徘郭,每個學(xué)生有M科成績,這樣形成的一個N * M的矩陣就不可能是方陣丧肴,我們怎樣才能描述這樣普通的矩陣呢的重要特征呢残揉?奇異值分解可以用來干這個事情,奇異值分解是一個能適用于任意的矩陣的一種分解的方法:
假設(shè)A是一個N * M的矩陣芋浮,那么得到的U是一個N * N的方陣(里面的向量是正交的抱环,U里面的向量稱為左奇異向量),Σ是一個N * M的矩陣(除了對角線的元素都是0纸巷,對角線上的元素稱為奇異值)镇草,V’(V的轉(zhuǎn)置)是一個N * N的矩陣,里面的向量也是正交的瘤旨,V里面的向量稱為右奇異向量)梯啤,從圖片來反映幾個相乘的矩陣的大小可得下面的圖片
那么奇異值和特征值是怎么對應(yīng)起來的呢?首先存哲,我們將一個矩陣A的轉(zhuǎn)置 * A因宇,將會得到一個方陣七婴,我們用這個方陣求特征值可以得到:這里得到的v,就是我們上面的右奇異向量察滑。此外我們還可以得到:
這里的σ就是上面說的奇異值本姥,u就是上面說的左奇異向量。奇異值σ跟特征值類似杭棵,在矩陣Σ中也是從大到小排列,而且σ的減少特別的快氛赐,在很多情況下魂爪,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上了。也就是說艰管,我們也可以用前r大的奇異值來近似描述矩陣滓侍,這里定義一下部分奇異值分解:
??? r是一個遠小于m、n的數(shù)牲芋,這樣矩陣的乘法看起來像是下面的樣子:
??? 右邊的三個矩陣相乘的結(jié)果將會是一個接近于A的矩陣撩笆,在這兒,r越接近于n缸浦,則相乘的結(jié)果越接近于A夕冲。而這三個矩陣的面積之和(在存儲觀點來說,矩陣面積越小裂逐,存儲量就越写跤恪)要遠遠小于原始的矩陣A,我們?nèi)绻胍獕嚎s空間來表示原矩陣A卜高,我們存下這里的三個矩陣:U弥姻、Σ、V就好了掺涛。
二庭敦、奇異值的計算:
??? 奇異值的計算是一個難題,是一個O(N^3)的算法薪缆。在單機的情況下當然是沒問題的秧廉,matlab在一秒鐘內(nèi)就可以算出1000 * 1000的矩陣的所有奇異值,但是當矩陣的規(guī)模增長的時候矮燎,計算的復(fù)雜度呈3次方增長定血,就需要并行計算參與了。Google的吳軍老師在數(shù)學(xué)之美系列談到SVD的時候诞外,說起Google實現(xiàn)了SVD的并行化算法澜沟,說這是對人類的一個貢獻,但是也沒有給出具體的計算規(guī)模峡谊,也沒有給出太多有價值的信息茫虽。
??? 其實SVD還是可以用并行的方式去實現(xiàn)的刊苍,在解大規(guī)模的矩陣的時候,一般使用迭代的方法濒析,當矩陣的規(guī)模很大(比如說上億)的時候正什,迭代的次數(shù)也可能會上億次,如果使用Map-Reduce框架去解号杏,則每次Map-Reduce完成的時候婴氮,都會涉及到寫文件、讀文件的操作盾致。個人猜測Google云計算體系中除了Map-Reduce以外應(yīng)該還有類似于MPI的計算模型主经,也就是節(jié)點之間是保持通信,數(shù)據(jù)是常駐在內(nèi)存中的庭惜,這種計算模型比Map-Reduce在解決迭代次數(shù)非常多的時候罩驻,要快了很多倍。
Lanczos迭代就是一種解對稱方陣部分特征值的方法(之前談到了护赊,解A’* A得到的對稱方陣的特征值就是解A的右奇異向量)惠遏,是將一個對稱的方程化為一個三對角矩陣再進行求解。按網(wǎng)上的一些文獻來看骏啰,Google應(yīng)該是用這種方法去做的奇異值分解的节吮。請見Wikipedia上面的一些引用的論文,如果理解了那些論文判耕,也“幾乎”可以做出一個SVD了课锌。
??? 由于奇異值的計算是一個很枯燥,純數(shù)學(xué)的過程祈秕,而且前人的研究成果(論文中)幾乎已經(jīng)把整個程序的流程圖給出來了渺贤。更多的關(guān)于奇異值計算的部分,將在后面的參考文獻中給出请毛,這里不再深入志鞍,我還是focus在奇異值的應(yīng)用中去。
三方仿、奇異值與主成分分析(PCA):
主成分分析在上一節(jié)里面也講了一些固棚,這里主要談?wù)勅绾斡肧VD去解PCA的問題。PCA的問題其實是一個基的變換仙蚜,使得變換后的數(shù)據(jù)有著最大的方差此洲。方差的大小描述的是一個變量的信息量,我們在講一個東西的穩(wěn)定性的時候委粉,往往說要減小方差呜师,如果一個模型的方差很大,那就說明模型不穩(wěn)定了贾节。但是對于我們用于機器學(xué)習(xí)的數(shù)據(jù)(主要是訓(xùn)練數(shù)據(jù))汁汗,方差大才有意義衷畦,不然輸入的數(shù)據(jù)都是同一個點,那方差就為0了知牌,這樣輸入的多個數(shù)據(jù)就等同于一個數(shù)據(jù)了祈争。以下面這張圖為例子:
這個假設(shè)是一個攝像機采集一個物體運動得到的圖片,上面的點表示物體運動的位置角寸,假如我們想要用一條直線去擬合這些點菩混,那我們會選擇什么方向的線呢?當然是圖上標有signal的那條線扁藕。如果我們把這些點單純的投影到x軸或者y軸上墨吓,最后在x軸與y軸上得到的方差是相似的(因為這些點的趨勢是在45度左右的方向,所以投影到x軸或者y軸上都是類似的)纹磺,如果我們使用原來的xy坐標系去看這些點,容易看不出來這些點真正的方向是什么亮曹。但是如果我們進行坐標系的變化橄杨,橫軸變成了signal的方向,縱軸變成了noise的方向照卦,則就很容易發(fā)現(xiàn)什么方向的方差大式矫,什么方向的方差小了。
??? 一般來說役耕,方差大的方向是信號的方向采转,方差小的方向是噪聲的方向,我們在數(shù)據(jù)挖掘中或者數(shù)字信號處理中瞬痘,往往要提高信號與噪聲的比例故慈,也就是信噪比。對上圖來說框全,如果我們只保留signal方向的數(shù)據(jù)察绷,也可以對原數(shù)據(jù)進行不錯的近似了。
??? PCA的全部工作簡單點說津辩,就是對原始的空間中順序地找一組相互正交的坐標軸拆撼,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的喘沿,第三個軸是在與第1闸度、2個軸正交的平面中方差最大的,這樣假設(shè)在N維空間中蚜印,我們可以找到N個這樣的坐標軸莺禁,我們?nèi)∏皉個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了窄赋,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數(shù)據(jù)的損失最小睁宰。
?? 還是假設(shè)我們矩陣每一行表示一個樣本肪获,每一列表示一個feature,用矩陣的語言來表示柒傻,將一個m * n的矩陣A的進行坐標軸的變化孝赫,P就是一個變換的矩陣從一個N維的空間變換到另一個N維的空間,在空間中就會進行一些類似于旋轉(zhuǎn)红符、拉伸的變化青柄。
??? 而將一個m * n的矩陣A變換成一個m * r的矩陣,這樣就會使得本來有n個feature的预侯,變成了有r個feature了(r < n)致开,這r個其實就是對n個feature的一種提煉,我們就把這個稱為feature的壓縮萎馅。用數(shù)學(xué)語言表示就是:
但是這個怎么和SVD扯上關(guān)系呢双戳?之前談到,SVD得出的奇異向量也是從奇異值由大到小排列的糜芳,按PCA的觀點來看飒货,就是方差最大的坐標軸就是第一個奇異向量,方差次大的坐標軸就是第二個奇異向量…我們回憶一下之前得到的SVD式子:
在矩陣的兩邊同時乘上一個矩陣V峭竣,由于V是一個正交的矩陣塘辅,所以V轉(zhuǎn)置乘以V得到單位陣I,所以可以化成后面的式子
將后面的式子與A * P那個m * n的矩陣變換為m * r的矩陣的式子對照看看皆撩,在這里扣墩,其實V就是P,也就是一個變化的向量扛吞。這里是將一個m * n 的矩陣壓縮到一個m * r的矩陣呻惕,也就是對列進行壓縮,如果我們想對行進行壓縮(在PCA的觀點下滥比,對行進行壓縮可以理解為蟆融,將一些相似的sample合并在一起,或者將一些沒有太大價值的sample去掉)怎么辦呢守呜?同樣我們寫出一個通用的行壓縮例子:
這樣就從一個m行的矩陣壓縮到一個r行的矩陣了型酥,對SVD來說也是一樣的,我們對SVD分解的式子兩邊乘以U的轉(zhuǎn)置U'
這樣我們就得到了對行進行壓縮的式子查乒∶趾恚可以看出,其實PCA幾乎可以說是對SVD的一個包裝玛迄,如果我們實現(xiàn)了SVD由境,那也就實現(xiàn)了PCA了,而且更好的地方是,有了SVD虏杰,我們就可以得到兩個方向的PCA讥蟆,如果我們對A’A進行特征值的分解,只能得到一個方向的PCA纺阔。
四瘸彤、奇異值與潛在語義索引LSI:
潛在語義索引(Latent Semantic Indexing)與PCA不太一樣,至少不是實現(xiàn)了SVD就可以直接用的笛钝,不過LSI也是一個嚴重依賴于SVD的算法质况,之前吳軍老師在矩陣計算與文本處理中的分類問題中談到:
??? “三個矩陣有非常清楚的物理含義。第一個矩陣X中的每一行表示意思相關(guān)的一類詞玻靡,其中的每個非零元素表示這類詞中每個詞的重要性(或者說相關(guān)性)结榄,數(shù)值越大越相關(guān)。最后一個矩陣Y中的每一列表示同一主題一類文章囤捻,其中每個元素表示這類文章中每篇文章的相關(guān)性臼朗。中間的矩陣則表示類詞和文章雷之間的相關(guān)性。因此蝎土,我們只要對關(guān)聯(lián)矩陣A進行一次奇異值分解视哑,w 我們就可以同時完成了近義詞分類和文章的分類。(同時得到每類文章和每類詞的相關(guān)性)瘟则。”
???? 上面這段話可能不太容易理解枝秤,不過這就是LSI的精髓內(nèi)容醋拧,我下面舉一個例子來說明一下,下面的例子來自LSA tutorial淀弹,具體的網(wǎng)址我將在最后的引用中給出:
這就是一個矩陣丹壕,不過不太一樣的是,這里的一行表示一個詞在哪些title中出現(xiàn)了(一行就是之前說的一維feature)薇溃,一列表示一個title中有哪些詞菌赖,(這個矩陣其實是我們之前說的那種一行是一個sample的形式的一種轉(zhuǎn)置,這個會使得我們的左右奇異向量的意義產(chǎn)生變化沐序,但是不會影響我們計算的過程)琉用。比如說T1這個title中就有g(shù)uide、investing策幼、market邑时、stock四個詞,各出現(xiàn)了一次特姐,我們將這個矩陣進行SVD晶丘,得到下面的矩陣:
左奇異向量表示詞的一些特性,右奇異向量表示文檔的一些特性,中間的奇異值矩陣表示左奇異向量的一行與右奇異向量的一列的重要程序浅浮,數(shù)字越大越重要沫浆。
????? 繼續(xù)看這個矩陣還可以發(fā)現(xiàn)一些有意思的東西,首先滚秩,左奇異向量的第一列表示每一個詞的出現(xiàn)頻繁程度专执,雖然不是線性的,但是可以認為是一個大概的描述叔遂,比如book是0.15對應(yīng)文檔中出現(xiàn)的2次他炊,investing是0.74對應(yīng)了文檔中出現(xiàn)了9次,rich是0.36對應(yīng)文檔中出現(xiàn)了3次已艰;
????? 其次痊末,右奇異向量中一的第一行表示每一篇文檔中的出現(xiàn)詞的個數(shù)的近似,比如說哩掺,T6是0.49凿叠,出現(xiàn)了5個詞,T2是0.22嚼吞,出現(xiàn)了2個詞盒件。
????? 然后我們反過頭來看,我們可以將左奇異向量和右奇異向量都取后2維(之前是3維的矩陣)舱禽,投影到一個平面上炒刁,可以得到:
在圖上,每一個紅色的點誊稚,都表示一個詞翔始,每一個藍色的點,都表示一篇文檔里伯,這樣我們可以對這些詞和文檔進行聚類城瞎,比如說stock 和 market可以放在一類,因為他們老是出現(xiàn)在一起疾瓮,real和estate可以放在一類脖镀,dads,guide這種詞就看起來有點孤立了狼电,我們就不對他們進行合并了蜒灰。按這樣聚類出現(xiàn)的效果,可以提取文檔集合中的近義詞肩碟,這樣當用戶檢索文檔的時候卷员,是用語義級別(近義詞集合)去檢索了,而不是之前的詞的級別腾务。這樣一減少我們的檢索毕骡、存儲量,因為這樣壓縮的文檔集合和PCA是異曲同工的,二可以提高我們的用戶體驗未巫,用戶輸入一個詞窿撬,我們可以在這個詞的近義詞的集合中去找,這是傳統(tǒng)的索引無法做到的叙凡。