原文在此,僅僅將原文的Matlab代碼改為Python3版本。
特征值與特征向量的幾何意義
矩陣的乘法是什么,別只告訴我只是“前一個(gè)矩陣的行乘以后一個(gè)矩陣的列”,還會(huì)一點(diǎn)的可能還會(huì)說(shuō)“前一個(gè)矩陣的列數(shù)等于后一個(gè)矩陣的行數(shù)才能相乘”,然而,這里卻會(huì)和你說(shuō)——那都是表象。
矩陣乘法真正的含義是變換,我們學(xué)《線性代數(shù)》一開始就學(xué)行變換列變換,那才是線代的核心——?jiǎng)e會(huì)了點(diǎn)貓膩就忘了本——對(duì),矩陣乘法:

就是線性變換,若以其中一個(gè)向量A為中心,則B的作用主要是使A發(fā)生如下變化:
1. 伸縮
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
#設(shè)置中文字體
myfont = FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
以上幾行為下面三段代碼相同的鋪墊部分,后面不再重復(fù)
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空間
B = np.array([[3,0],[0,2]]) #線性變換矩陣
Y = np.dot(B,A)
plt.clf()
plt.plot(A[0],A[1],'-*',lw=2)
plt.text(0.6,1.03,u'變換前',fontsize =14,fontproperties=myfont)
plt.plot(Y[0],Y[1],'-r*',lw=2)
#font size: xx-small;x-small;small;medium;large;x-large;xx-large
plt.text(0.6,2.03,u'變換后',fontsize ='large',fontproperties=myfont)
plt.axis([0,3,0,3]);plt.grid(True)
plt.show()

從上圖可知,y方向進(jìn)行了2倍的拉伸,x方向進(jìn)行了3倍的拉伸,這就是B=[3 0; 0 2]的功勞,3和2就是伸縮比例。請(qǐng)注意,這時(shí)B除了對(duì)角線元素為各個(gè)維度的倍數(shù)外,非正對(duì)角線元素都為0,因?yàn)橄旅鎸⒁吹?,?duì)角線元素非0則將會(huì)發(fā)生切變及旋轉(zhuǎn)的效果。
2. 切變
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空間
plt.clf()
B1=np.array([[1,0],[1,1]])
B2=np.array([[1,0],[-1,1]])
B3=np.array([[1,1],[0,1]])
B4=np.array([[1,-1],[0,1]])
Y1 = np.dot(B1,A)
Y2 = np.dot(B2,A)
Y3 = np.dot(B3,A)
Y4 = np.dot(B4,A)
plt.subplot(221)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y1[0],Y1[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(222)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y2[0],Y2[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(223)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y3[0],Y3[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(224)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y4[0],Y4[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.show()

3. 旋轉(zhuǎn)
所有的變換其實(shí)都可以通過(guò)上面的伸縮和切變變換的到,如果合理地對(duì)變換矩陣B取值,能得到圖形旋轉(zhuǎn)的效果,如下:
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空間
plt.clf()
theta = np.pi/6
Bt=np.array([[np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)]])
Yt = np.dot(Bt,A)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Yt[0],Yt[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.show()

好,關(guān)于矩陣乘就這些了。那么,我們接著就進(jìn)入主題了,對(duì)特定的向量,經(jīng)過(guò)一種方陣變換,經(jīng)過(guò)該變換后,向量的方向不變(或只是反向),而只是進(jìn)行伸縮變化(伸縮值可以是負(fù)值,相當(dāng)于向量的方向反向)?這個(gè)時(shí)候我們不妨將書上對(duì)特征向量的定義對(duì)照一遍:
數(shù)學(xué)教材定義: 設(shè)A是n階方陣,如果存在 λ 和n維非零向量X,使
則 λ 稱為方陣A的一個(gè)特征值,X為方陣A對(duì)應(yīng)于或?qū)儆谔卣髦?λ 的一個(gè)特征向量。
上面特定的向量不就是特征向量嗎? λ 不就是那個(gè)伸縮的倍數(shù)嗎?因此,特征向量的代數(shù)上含義是:將矩陣乘法轉(zhuǎn)換為數(shù)乘操作;特征向量的幾何含義是:特征向量通過(guò)方陣A變換只進(jìn)行伸縮,而保持特征向量的方向不變。特征值表示的是這個(gè)特征到底有多重要,類似于權(quán)重,而特征向量在幾何上就是一個(gè)點(diǎn),從原點(diǎn)到該點(diǎn)的方向表示向量的方向。
特征向量有一個(gè)重要的性質(zhì):同一特征值的任意多個(gè)特征向量的線性組合仍然是A屬于同一特征值的特征向量。關(guān)于特征值,網(wǎng)上有一段關(guān)于“特征值是震動(dòng)的譜”的解釋:
戲說(shuō)在朝代宋的時(shí)候,我國(guó)就與發(fā)現(xiàn)矩陣特征值理論的機(jī)會(huì)擦肩而過(guò)。話說(shuō)沒(méi)有出息的秦少游在往池塘里扔了一顆小石頭后,剛得到一句“投石沖開水底天”的泡妞詩(shī)對(duì)之后,就猴急猴急地去洞房了,全然沒(méi)有想到水波中隱含著矩陣的特征值及特征向量的科學(xué)大道理。大概地說(shuō),水面附近的任一點(diǎn)水珠在原處上下振動(dòng)(實(shí)際上在做近似圓周運(yùn)動(dòng)),并沒(méi)有隨著波浪向外圈移動(dòng),同時(shí)這些上下振動(dòng)的水珠的幅度在漸漸變小,直至趨于平靜。在由某塊有著特定質(zhì)量和形狀的石頭被以某種角度和速度投入某個(gè)面積和深度特定的水池中所決定的某個(gè)矩陣中,紋波蕩漾中水珠的漸變過(guò)程中其特征值起著決定性的作用,它決定著水珠振動(dòng)的頻率和幅度減弱的衰退率。
在理解關(guān)于振動(dòng)的特征值和特征向量的過(guò)程中,需要加入復(fù)向量和復(fù)矩陣的概念,因?yàn)樵趯?shí)際應(yīng)用中,實(shí)向量和實(shí)矩陣是干不了多少事的。機(jī)械振動(dòng)和電振動(dòng)有頻譜,振動(dòng)的某個(gè)頻率具有某個(gè)幅度;那么矩陣也有矩陣的譜,矩陣的譜就是矩陣特征值的概念,是矩陣所固有的特性,所有的特征值形成了矩陣的一個(gè)頻譜,每個(gè)特征值是矩陣的一個(gè)“諧振頻點(diǎn)”。
美國(guó)數(shù)學(xué)家斯特讓(G..Strang)在其經(jīng)典教材《線性代數(shù)及其應(yīng)用》中這樣介紹了特征值作為頻率的物理意義,他說(shuō):
大概最簡(jiǎn)單的例子(我從不相信其真實(shí)性,雖然據(jù)說(shuō)1831年有一橋梁毀于此因)是一對(duì)士兵通過(guò)橋梁的例子。傳統(tǒng)上,他們要停止齊步前進(jìn)而要散步通過(guò)。這個(gè)理由是因?yàn)樗麄兛赡芤缘扔跇虻奶卣髦抵坏念l率齊步行進(jìn),從而將發(fā)生共振。就像孩子的秋千那樣,你一旦注意到一個(gè)秋千的頻率,和此頻率相配,你就使頻率蕩得更高。一個(gè)工程師總是試圖使他的橋梁或他的火箭的自然頻率遠(yuǎn)離風(fēng)的頻率或液體燃料的頻率;而在另一種極端情況,一個(gè)證券經(jīng)紀(jì)人則盡畢生精力于努力到達(dá)市場(chǎng)的自然頻率線。特征值是幾乎任何一個(gè)動(dòng)力系統(tǒng)的最重要的特征。
其實(shí),這個(gè)矩陣之所以能形成“頻率的譜”,就是因?yàn)榫仃囋谔卣飨蛄克傅姆较蛏暇哂袑?duì)向量產(chǎn)生恒定的變換作用:增強(qiáng)(或減弱)特征向量的作用。進(jìn)一步的,如果矩陣持續(xù)地疊代作用于向量,那么特征向量的就會(huì)凸現(xiàn)出來(lái)。
更多關(guān)于特征向量及特征值的實(shí)際例子參見 Wikipedia:特征向量 。
特征值分解
設(shè)A有n個(gè)特征值及特征向量,則:


若(x1,x2,...,xn)可逆,則左右兩邊都求逆,則方陣A可直接通過(guò)特征值和特征向量進(jìn)行唯一的表示,令
Q=(x1,x2,...,xn)

該表達(dá)式稱為方陣的特征值分解,這樣方陣A就被特征值和特征向量唯一表示。
一個(gè)變換方陣的所有特征向量組成了這個(gè)變換矩陣的一組基。所謂基,可以理解為坐標(biāo)系的軸。我們平常用到的大多是直角坐標(biāo)系,在線性代數(shù)中可以把這個(gè)坐標(biāo)系扭曲、拉伸、旋轉(zhuǎn),稱為基變換。我們可以按需求去設(shè)定基,但是基的軸之間必須是線性無(wú)關(guān)的,也就是保證坐標(biāo)系的不同軸不要指向同一個(gè)方向或可以被別的軸組合而成,否則的話原來(lái)的空間就“撐”不起來(lái)了。從線性空間的角度看,在一個(gè)定義了內(nèi)積的線性空間里,對(duì)一個(gè)N階對(duì)稱方陣進(jìn)行特征分解,就是產(chǎn)生了該空間的N個(gè)標(biāo)準(zhǔn)正交基,然后把矩陣投影到這N個(gè)基上。N個(gè)特征向量就是N個(gè)標(biāo)準(zhǔn)正交基,而特征值的模則代表矩陣在每個(gè)基上的投影長(zhǎng)度。特征值越大,說(shuō)明矩陣在對(duì)應(yīng)的特征向量上的方差越大,功率越大,信息量越多。不過(guò),特征值分解也有很多的局限,比如說(shuō)變換的矩陣必須是方陣。
在機(jī)器學(xué)習(xí)特征提取中,意思就是最大特征值對(duì)應(yīng)的特征向量方向上包含最多的信息量,如果某幾個(gè)特征值很小,說(shuō)明這幾個(gè)方向信息量很小,可以用來(lái)降維,也就是刪除小特征值對(duì)應(yīng)方向的數(shù)據(jù),只保留大特征值方向?qū)?yīng)的數(shù)據(jù),這樣做以后數(shù)據(jù)量減小,但有用信息量變化不大,PCA降維就是基于這種思路。
Matlab中通過(guò)eig函數(shù)就可求得特征值和特征向量矩陣。
import numpy as np
eps = np.finfo(float).eps
B = np.array([[3,-2,-.9,2*eps],[-2,4,1,-eps],[-eps/4,eps/2,-1,0],[-.5,-.5,.1,1]])
D,V = np.linalg.eig(B)
print('Q=\n',V,'\nD=\n',np.diag(D))
# 輸出
>>>Q=
[[ 6.15301856e-01 -4.17622470e-01 -5.88210528e-17 -1.52821436e-01]
[ -7.88064099e-01 -3.26069771e-01 0.00000000e+00 1.34482863e-01]
[ -2.11573219e-17 -5.96872041e-18 -3.31484838e-18 -9.78057188e-01]
[ 1.89367800e-02 8.48097858e-01 -1.00000000e+00 4.43182164e-02]]
D=
[[ 5.56155281 0. 0. 0. ]
[ 0. 1.43844719 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. -1. ]]
D對(duì)角線的元素即為特征值(表示了伸縮的比例),D就是特征值分解公式中的Q,V的每一列與D沒(méi)列對(duì)應(yīng),表示對(duì)應(yīng)的特征向量,即特征值分解中的Σ。
奇異值分解
(節(jié)選自小節(jié)標(biāo)題鏈接的原文,感謝原作者)
特征值分解是一個(gè)提取矩陣特征很不錯(cuò)的方法,但是它只適用于方陣。而在現(xiàn)實(shí)的世界中,我們看到的大部分矩陣都不是方陣,比如說(shuō)有M個(gè)學(xué)生,每個(gè)學(xué)生有N科成績(jī),這樣形成的一個(gè)M * N的矩陣就可能不是方陣,我們?cè)鯓硬拍芟衩枋鎏卣髦狄粯用枋鲞@樣一般矩陣呢的重要特征呢?奇異值分解就是用來(lái)干這個(gè)事的,奇異值分解是一個(gè)能適用于任意的矩陣的一種分解的方法。我們有必要先說(shuō)說(shuō)特征值和奇異值之間的關(guān)系。
對(duì)于特征值分解公式, ATA 是方陣,我們求 ATA 的特征值,即注:下面的數(shù)學(xué)公式中,T都應(yīng)該是上角標(biāo)

此時(shí)求得的特征值就對(duì)應(yīng)奇異值的平方,求得的特征向量v稱為右奇異向量,另外還可以得到:


所求的ui就是左奇異向量, σi 就是奇異值。
對(duì)于奇異值分解,已有人對(duì)SVD的幾何機(jī)理做了清晰的分析,此文公式圖片較多,就不一個(gè)個(gè)的復(fù)制粘貼了,直接截圖貼上,如有需要請(qǐng)點(diǎn)擊小節(jié)標(biāo)題跳轉(zhuǎn)至原文。

SVD分解實(shí)例
SVD之所以很有效,是因?yàn)椋涸诤芏嗲闆r下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上了。在這里,我們用圖像簡(jiǎn)單的實(shí)踐一下SVD的大妙處,下面是python對(duì)圖像進(jìn)行SVD分解的例子:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
#設(shè)置中文字體
myfont = FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
im = np.array(Image.open('lena.jpg').convert('L'),dtype=np.float32)
u,s,v = np.linalg.svd(im)
recv1 = np.dot(np.dot(u[:,:20],np.diag(s[:50])[:20,:50]),v[:50,:]) #svd取最高的20個(gè)特征值進(jìn)行恢復(fù)
recv2 = np.dot(np.dot(u[:,:50],np.diag(s[:100])[:50,:100]),v[:100,:]) #svd取最高的50個(gè)特征值進(jìn)行恢復(fù)
recv3 = np.dot(np.dot(u[:,:200],np.diag(s[:200])),v[:200,:]) #svd取最高的200個(gè)特征值進(jìn)行恢復(fù)
plt.clf()
plt.figure(1)
plt.subplot(221)
plt.imshow(im,cmap=plt.get_cmap('gray'))
plt.title(u'原圖',fontsize ='large',fontproperties=myfont)
plt.subplot(222)
plt.imshow(recv1,cmap=plt.get_cmap('gray'))
plt.title(u'恢復(fù):左奇異20、右奇異50',fontsize ='large',fontproperties=myfont)
plt.subplot(223)
plt.imshow(recv2,cmap=plt.get_cmap('gray'))
plt.title(u'恢復(fù):左奇異50、右奇異100',fontsize ='large',fontproperties=myfont)
plt.subplot(224)
plt.imshow(recv3,cmap=plt.get_cmap('gray'))
plt.title(u'恢復(fù):左奇異200、右奇異200',fontsize ='large',fontproperties=myfont)
plt.show()

如果按左下角的方式壓縮原圖,則存儲(chǔ)量變?yōu)椋?0x50+100x100+50=12500,而存儲(chǔ)原圖像的存儲(chǔ)量為512x512=262144,則壓縮比為262144/12500=20.97,這里沒(méi)有考慮存儲(chǔ)數(shù)據(jù)類型的差異。
SVD分解相對(duì)于特征值分解的優(yōu)勢(shì)就是:
- 分解的矩陣可以是任意矩陣
- 在恢復(fù)信號(hào)的時(shí)候左右奇異值可以選擇不同的維度
另外值得注意的一點(diǎn):不論是奇異值分解還是特征值分解,分解出來(lái)的特征向量都是正交的。
奇異值分解與PCA
(節(jié)選自小節(jié)標(biāo)題鏈接的原文,感謝原作者)
主成分分析在上一節(jié)里面也講了一些,這里主要談?wù)勅绾斡肧VD去解PCA的問(wèn)題。PCA的問(wèn)題其實(shí)是一個(gè)基的變換,使得變換后的數(shù)據(jù)有著最大的方差。方差的大小描述的是一個(gè)變量的信息量,我們?cè)谥v一個(gè)東西的穩(wěn)定性的時(shí)候,往往說(shuō)要減小方差,如果一個(gè)模型的方差很大,那就說(shuō)明模型不穩(wěn)定了。但是對(duì)于我們用于機(jī)器學(xué)習(xí)的數(shù)據(jù)(主要是訓(xùn)練數(shù)據(jù)),方差大才有意義,不然輸入的數(shù)據(jù)都是同一個(gè)點(diǎn),那方差就為0了,這樣輸入的多個(gè)數(shù)據(jù)就等同于一個(gè)數(shù)據(jù)了。以下面這張圖為例子:

這個(gè)假設(shè)是一個(gè)攝像機(jī)采集一個(gè)物體運(yùn)動(dòng)得到的圖片,上面的點(diǎn)表示物體運(yùn)動(dòng)的位置,假如我們想要用一條直線去擬合這些點(diǎn),那我們會(huì)選擇什么方向的線呢?當(dāng)然是圖上標(biāo)有signal的那條線。如果我們把這些點(diǎn)單純的投影到x軸或者y軸上,最后在x軸與y軸上得到的方差是相似的(因?yàn)檫@些點(diǎn)的趨勢(shì)是在45度左右的方向,所以投影到x軸或者y軸上都是類似的),如果我們使用原來(lái)的xy坐標(biāo)系去看這些點(diǎn),容易看不出來(lái)這些點(diǎn)真正的方向是什么。但是如果我們進(jìn)行坐標(biāo)系的變化,橫軸變成了signal的方向,縱軸變成了noise的方向,則就很容易發(fā)現(xiàn)什么方向的方差大,什么方向的方差小了。
一般來(lái)說(shuō),方差大的方向是信號(hào)的方向,方差小的方向是噪聲的方向,我們?cè)跀?shù)據(jù)挖掘中或者數(shù)字信號(hào)處理中,往往要提高信號(hào)與噪聲的比例,也就是信噪比。對(duì)上圖來(lái)說(shuō),如果我們只保留signal方向的數(shù)據(jù),也可以對(duì)原數(shù)據(jù)進(jìn)行不錯(cuò)的近似了。
PCA的全部工作簡(jiǎn)單點(diǎn)說(shuō),就是對(duì)原始的空間中順序地找一組相互正交的坐標(biāo)軸,第一個(gè)軸是使得方差最大的,第二個(gè)軸是在與第一個(gè)軸正交的平面中使得方差最大的,第三個(gè)軸是在與第1、2個(gè)軸正交的平面中方差最大的,這樣假設(shè)在N維空間中,我們可以找到N個(gè)這樣的坐標(biāo)軸,我們?nèi)∏皉個(gè)去近似這個(gè)空間,這樣就從一個(gè)N維的空間壓縮到r維的空間了,但是我們選擇的r個(gè)坐標(biāo)軸能夠使得空間的壓縮使得數(shù)據(jù)的損失最小。
還是假設(shè)我們矩陣每一行表示一個(gè)樣本,每一列表示一個(gè)feature,用矩陣的語(yǔ)言來(lái)表示,將一個(gè)m * n的矩陣A的進(jìn)行坐標(biāo)軸的變化,P就是一個(gè)變換的矩陣從一個(gè)N維的空間變換到另一個(gè)N維的空間,在空間中就會(huì)進(jìn)行一些類似于旋轉(zhuǎn)、拉伸的變化。

而將一個(gè)m * n的矩陣A變換成一個(gè)m * r的矩陣,這樣就會(huì)使得本來(lái)有n個(gè)feature的,變成了有r個(gè)feature了(r < n),這r個(gè)其實(shí)就是對(duì)n個(gè)feature的一種提煉,我們就把這個(gè)稱為feature的壓縮。用數(shù)學(xué)語(yǔ)言表示就是:

但是這個(gè)怎么和SVD扯上關(guān)系呢?之前談到,SVD得出的奇異向量也是從奇異值由大到小排列的,按PCA的觀點(diǎn)來(lái)看,就是方差最大的坐標(biāo)軸就是第一個(gè)奇異向量,方差次大的坐標(biāo)軸就是第二個(gè)奇異向量…我們回憶一下之前得到的SVD式子:

在矩陣的兩邊同時(shí)乘上一個(gè)矩陣V,由于V是一個(gè)正交的矩陣,所以V轉(zhuǎn)置乘以V得到單位陣I,所以可以化成后面的式子

將后面的式子與A * P那個(gè)m * n的矩陣變換為m * r的矩陣的式子對(duì)照看看,在這里,其實(shí)V就是P,也就是一個(gè)變化的向量。這里是將一個(gè)m * n 的矩陣壓縮到一個(gè)m * r的矩陣,也就是對(duì)列進(jìn)行壓縮,如果我們想對(duì)行進(jìn)行壓縮(在PCA的觀點(diǎn)下,對(duì)行進(jìn)行壓縮可以理解為,將一些相似的sample合并在一起,或者將一些沒(méi)有太大價(jià)值的sample去掉)怎么辦呢?同樣我們寫出一個(gè)通用的行壓縮例子:

這樣就從一個(gè)m行的矩陣壓縮到一個(gè)r行的矩陣了,對(duì)SVD來(lái)說(shuō)也是一樣的,我們對(duì)SVD分解的式子兩邊乘以U的轉(zhuǎn)置U'

這樣我們就得到了對(duì)行進(jìn)行壓縮的式子??梢钥闯?,其實(shí)PCA幾乎可以說(shuō)是對(duì)SVD的一個(gè)包裝,如果我們實(shí)現(xiàn)了SVD,那也就實(shí)現(xiàn)了PCA了,而且更好的地方是,有了SVD,我們就可以得到兩個(gè)方向的PCA,如果我們對(duì)A’A進(jìn)行特征值的分解,只能得到一個(gè)方向的PCA。
PCA就是一種用于對(duì)數(shù)據(jù)進(jìn)行降維的方法(降維肯定會(huì)丟失數(shù)據(jù),只不過(guò)能在減少大量存儲(chǔ)量的同時(shí)損失盡可能少),參見之前matlab對(duì)圖像進(jìn)行SVD分解的例子,更容易理解:實(shí)現(xiàn)了SVD就實(shí)現(xiàn)了PCA,PCA僅是SVD的包裝。
PCA的應(yīng)用很廣,主要用在機(jī)器學(xué)習(xí)中對(duì)特征進(jìn)行降維,還能用于去噪,下面兩圖是PCA降維和PCA去噪的例子(圖片來(lái)自鄒博PPT:北京9月秋季班·機(jī)器學(xué)習(xí)初步)

降維說(shuō)白了就是將信息通過(guò)投影到更低得多維度,這樣必然會(huì)帶來(lái)信息的丟失,但就如上圖,這種信息的丟失卻有時(shí)對(duì)分類沒(méi)有影響,反而能降低識(shí)別算法的維度,提高速度,緩解所謂的維度災(zāi)難。

PCA去噪的前提是噪聲的特征值會(huì)比信號(hào)的特征值小,即信噪比高的情況,否則PCA去噪會(huì)產(chǎn)生逆效果——把信號(hào)去掉了而噪聲沒(méi)去掉。
SVD其它
SVD還有其它很多方面的應(yīng)用,通過(guò)查找資料,這里先做個(gè)簡(jiǎn)單的羅列,有機(jī)會(huì)再一個(gè)個(gè)研究:
- 求偽逆。我們知道,矩陣求逆要求矩陣必須是方陣,SVD可以用來(lái)求任意矩陣的逆運(yùn)算,求任意矩陣的逆矩陣稱為求偽逆
- 最小二乘法求解。憑著對(duì)《矩陣論》的零星的記憶,SVD算法就是因?yàn)槟芮髠文嫠杂脕?lái)求解最小二乘法。
- 基于SVD的文本分類。首先接觸是從吳軍老師的《數(shù)學(xué)之美》一書上看到的,大致是:通過(guò)TF/IDF(term frequency/inverse document frequency)構(gòu)建“一百萬(wàn)篇文章和五十萬(wàn)詞的關(guān)聯(lián)性”的矩陣 A1000000x500000
,然后對(duì)A矩陣使用SVD分解之后,存儲(chǔ)量減小,而且左奇異值矩陣和右奇異值矩陣以及奇異值矩陣的物理含義將非常明晰,此處博文 有簡(jiǎn)單介紹,更多參見吳軍老師的《數(shù)學(xué)之美》
另外,開源視覺(jué)庫(kù)OpenCV中也提供SVD分解的算法。
參考
- 強(qiáng)大的矩陣奇異值分解(SVD)及其應(yīng)用
- http://blog.sciencenet.cn/blog-696950-699432.html ,關(guān)于SVD部分的講解即出自此處。
- http://www.cise.ufl.edu/~srajaman/Rajamanickam_S.pdf
- July培訓(xùn)班PPT:“北京9月秋季班:貝葉斯、PCA、SVD”.
- 戴華編著《矩陣論》 教材,科學(xué)出版社. 有時(shí)候明白一點(diǎn)之后再回頭參考數(shù)學(xué)教材要比網(wǎng)上大把的抓好得多,豁然開朗。
