矩陣的乘法是什麼,別隻告訴我只是「前一個矩陣的行乘之後一個矩陣的列」,還會一點的可能還會說「前一個矩陣的列數等於後一個矩陣的行數才能相乘」,然而,這裏卻會和你說——那都是表象。html
矩陣乘法真正的含義是變換,咱們學《線性代數》一開始就學行變換列變換,那纔是線代的核心——別會了點貓膩就忘了本——對,矩陣乘法 就是線性變換,若以其中一個向量A爲中心,則B的做用主要是使A發生以下變化:算法
clf; A = [0, 1, 1, 0, 0;... 1, 1, 0, 0, 1]; % 原空間 B = [3 0; 0 2]; % 線性變換矩陣 plot(A(1,:),A(2,:), '-*');hold on grid on;axis([0 3 0 3]); gtext('變換前'); Y = B * A; plot(Y(1,:),Y(2,:), '-r*'); grid on;axis([0 3 0 3]); gtext('變換後');
從上圖可知,y方向進行了2倍的拉伸,x方向進行了3倍的拉伸,這就是B=[3 0; 0 2]的功勞,3和2就是伸縮比例。請注意,這時B除了對角線元素爲各個維度的倍數外,非正對角線元素都爲0,由於下面將要看到,對角線元素非0則將會發生切變及旋轉的效果。app
clf; A = [0, 1, 1, 0, 0;... 1, 1, 0, 0, 1]; % 原空間 B1 = [1 0; 1 1]; % 線性變換矩陣 B2 = [1 0; -1 1]; % 線性變換矩陣 B3 = [1 1; 0 1]; % 線性變換矩陣 B4 = [1 -1; 0 1]; % 線性變換矩陣 Y1 = B1 * A; Y2 = B2 * A; Y3 = B3 * A; Y4 = B4 * A; subplot(2,2,1); plot(A(1,:),A(2,:), '-*'); hold on;plot(Y1(1,:),Y1(2,:), '-r*'); grid on;axis([-1 3 -1 3]); subplot(2,2,2); plot(A(1,:),A(2,:), '-*'); hold on;plot(Y2(1,:),Y2(2,:), '-r*'); grid on;axis([-1 3 -1 3]); subplot(2,2,3); plot(A(1,:),A(2,:), '-*'); hold on;plot(Y3(1,:),Y3(2,:), '-r*'); grid on;axis([-1 3 -1 3]); subplot(2,2,4); plot(A(1,:),A(2,:), '-*'); hold on;plot(Y4(1,:),Y4(2,:), '-r*'); grid on;axis([-1 3 -1 3]);
全部的變換其實均可以經過上面的伸縮和切變變換的到,若是合理地對變換矩陣B取值,能獲得圖形旋轉的效果,以下,機器學習
clf; A = [0, 1, 1, 0, 0;... 1, 1, 0, 0, 1]; % 原空間 theta = pi/6; B = [cos(theta) sin(theta); -sin(theta) cos(theta)]; Y = B * A; figure; plot(A(1,:),A(2,:), '-*'); hold on;plot(Y(1,:),Y(2,:), '-r*'); grid on;axis([-1 3 -1 3]);
好,關於矩陣乘就這些了。那麼,咱們接着就進入主題了,對特定的向量,通過一種方陣變換,通過該變換後,向量的方向不變(或只是反向),而只是進行伸縮變化(伸縮值能夠是負值,至關於向量的方向反向)?這個時候咱們不妨將書上對特徵向量的定義對照一遍:函數
數學教材定義: 設A是n階方陣,若是存在 λ 和n維非零向量X,使 ,則 λ 稱爲方陣A的一個特徵值,X爲方陣A對應於或屬於特徵值 λ 的一個特徵向量。學習
上面特定的向量不就是特徵向量嗎? λ 不 就是那個伸縮的倍數嗎?所以,特徵向量的代數上含義是:將矩陣乘法轉換爲數乘操做;特徵向量的幾何含義是:特徵向量經過方陣A變換隻進行伸縮,而保持特徵 向量的方向不變。特徵值表示的是這個特徵到底有多重要,相似於權重,而特徵向量在幾何上就是一個點,從原點到該點的方向表示向量的方向。ui
特徵向量有一個重要的性質:同一特徵值的任意多個特徵向量的線性組合仍然是A屬於同一特徵值的特徵向量。關於特徵值,網上有一段關於「特徵值是震動的譜」的解釋:spa
戲 說在朝代宋的時候,我國就與發現矩陣特徵值理論的機會擦肩而過。話說沒有出息的秦少游在往池塘裏扔了一顆小石頭後,剛獲得一句「投石衝開水底天」的泡妞詩 對以後,就猴急猴急地去洞房了,全然沒有想到水波中隱含着矩陣的特徵值及特徵向量的科學大道理。大概地說,水面附近的任一點水珠在原處上下振動(實際上在 作近似圓周運動),並無隨着波浪向外圈移動,同時這些上下振動的水珠的幅度在漸漸變小,直至趨於平靜。在由某塊有着特定質量和形狀的石頭被以某種角度和 速度投入某個面積和深度特定的水池中所決定的某個矩陣中,紋波盪漾中水珠的漸變過程當中其特徵值起着決定性的做用,它決定着水珠振動的頻率和幅度減弱的衰退 率。.net
在 理解關於振動的特徵值和特徵向量的過程當中,須要加入復向量和復矩陣的概念,由於在實際應用中,實向量和實矩陣是幹不了多少事的。機械振動和電振動有頻譜, 振動的某個頻率具備某個幅度;那麼矩陣也有矩陣的譜,矩陣的譜就是矩陣特徵值的概念,是矩陣所固有的特性,全部的特徵值造成了矩陣的一個頻譜,每一個特徵值 是矩陣的一個「諧振頻點」。code
美國數學家斯特讓(G..Strang)在其經典教材《線性代數及其應用》中這樣介紹了特徵值做爲頻率的物理意義,他說:
大 概最簡單的例子(我從不相信其真實性,雖然聽說1831年有一橋樑毀於此因)是一對士兵經過橋樑的例子。傳統上,他們要中止齊步前進而要散步經過。這個理 由是由於他們可能以等於橋的特徵值之一的頻率齊步行進,從而將發生共振。就像孩子的鞦韆那樣,你一旦注意到一個鞦韆的頻率,和此頻率相配,你就使頻率蕩得 更高。一個工程師老是試圖使他的橋樑或他的火箭的天然頻率遠離風的頻率或液體燃料的頻率;而在另外一種極端狀況,一個證券經紀人則盡畢生精力於努力到達市場 的天然頻率線。特徵值是幾乎任何一個動力系統的最重要的特徵。
其實,這個矩陣之因此能造成「頻率的譜」,就是由於矩陣在特徵向量所指的方向上具備對向量產生恆定的變換做用:加強(或減弱)特徵向量的做用。進一步的,若是矩陣持續地疊代做用於向量,那麼特徵向量的就會凸現出來。
更多關於特徵向量及特徵值的實際例子參見Wikipedia: http://zh.wikipedia.org/wiki/特徵向量 。
設A有n個特徵值及特徵向量,則:
將上面的寫到一塊兒成矩陣形式:
若(x1,x2,...,xn)可逆,則左右兩邊都求逆,則方陣A可直接經過特徵值和特徵向量進行惟一的表示,令
Q=(x1,x2,...,xn)
Σ = diag(λ1, λ2, ..., λn)
則 ,該表達式稱爲方陣的特徵值分解,這樣方陣A就被特徵值和特徵向量惟一表示。
一 個變換方陣的全部特徵向量組成了這個變換矩陣的一組基。所謂基,能夠理解爲座標系的軸。咱們日常用到的大可能是直角座標系,在線性代數中能夠把這個座標系扭 曲、拉伸、旋轉,稱爲基變換。咱們能夠按需求去設定基,可是基的軸之間必須是線性無關的,也就是保證座標系的不一樣軸不要指向同一個方向或能夠被別的軸組合 而成,不然的話原來的空間就「撐」不起來了。從線性空間的角度看,在一個定義了內積的線性空間裏,對一個N階對稱方陣進行特徵分解,就是產生了該空間的N 個標準正交基,而後把矩陣投影到這N個基上。N個特徵向量就是N個標準正交基,而特徵值的模則表明矩陣在每一個基上的投影長度。特徵值越大,說明矩陣在對應 的特徵向量上的方差越大,功率越大,信息量越多。不過,特徵值分解也有不少的侷限,好比說變換的矩陣必須是方陣。
在 機器學習特徵提取中,意思就是最大特徵值對應的特徵向量方向上包含最多的信息量,若是某幾個特徵值很小,說明這幾個方向信息量很小,能夠用來降維,也就是 刪除小特徵值對應方向的數據,只保留大特徵值方向對應的數據,這樣作之後數據量減少,但有用信息量變化不大,PCA降維就是基於這種思路。
Matlab中經過eig函數就可求得特徵值和特徵向量矩陣。
>> B = [ 3 -2 -.9 2*eps -2 4 1 -eps -eps/4 eps/2 -1 0 -.5 -.5 .1 1 ] B = 3.0000 -2.0000 -0.9000 0.0000 -2.0000 4.0000 1.0000 -0.0000 -0.0000 0.0000 -1.0000 0 -0.5000 -0.5000 0.1000 1.0000 >> [V D] = eig(B) V = 0.6153 -0.4176 -0.0000 -0.1437 -0.7881 -0.3261 -0.0000 0.1264 -0.0000 -0.0000 -0.0000 -0.9196 0.0189 0.8481 1.0000 0.3432 D = 5.5616 0 0 0 0 1.4384 0 0 0 0 1.0000 0 0 0 0 -1.0000
D對角線的元素即爲特徵值(表示了伸縮的比例),D就是特徵值分解公式中的Q,V的每一列與D沒列對應,表示對應的特徵向量,即特徵值分解中的Σ。
特 徵值分解是一個提取矩陣特徵很不錯的方法,可是它只適用於方陣。而在現實的世界中,咱們看到的大部分矩陣都不是方陣,好比說有M個學生,每一個學生有N科成 績,這樣造成的一個M * N的矩陣就可能不是方陣,咱們怎樣才能像描述特徵值同樣描述這樣通常矩陣呢的重要特徵呢?奇異值分解就是用來幹這個事的,奇異值分解是一個能適用於任意的 矩陣的一種分解的方法。咱們有必要先說說特徵值和奇異值之間的關係。
對於特徵值分解公式, ATA 是方陣,咱們求 ATA 的特徵值,即 ,此時求得的特徵值就對應奇異值的平方,求得的特徵向量v稱爲右奇異向量,另外還能夠獲得:
所求的ui就是左奇異向量, σi 就是奇異值。已有人對SVD的幾何機理作了清晰的分析,很是受用,就不重複造輪子,下文爲轉載自http://blog.sciencenet.cn/blog-696950-699432.html 。
SVD分解
SVD之因此頗有效,是由於:在不少狀況下,前10%甚至1%的奇異值的和就佔了所有的奇異值之和的99%以上了。在這裏,咱們用圖像簡單的實踐一下SVD的大妙處,下面是matlab對圖像進行SVD分解的例子,
I = imread('lena_gray.bmp'); % 512x512的Lena圖像 im = double(I); [s,v,d]=svd(im); % svd分解,svd分解後特徵值v對角線按從大到小排列,所以能夠選擇特徵值大的進行恢復 recv1=s(:,1:20)*v(1:20,1:50)*d(:,1:50)'; % svd取最高的100個特徵值進行恢復 recv2=s(:,1:50)*v(1:50,1:100)*d(:,1:100)'; % svd取最高的100個特徵值進行恢復 recv3=s(:,1:200)*v(1:200,1:200)*d(:,1:200)'; % svd取最高的100個特徵值進行恢復 subplot(221);imshow(I); title('原圖'); subplot(222);imshow(mat2gray(recv1)); title('恢復:左奇異20、右奇異50'); subplot(223);imshow(mat2gray(recv2)); title('恢復:左奇異50、右奇異100'); subplot(224);imshow(mat2gray(recv3)); title('恢復:左奇異200、右奇異200');
圖注:SVD二維圖像壓縮恢復
若是按左下角的方式壓縮原圖,則存儲量變爲:50x50+100x100+50=12500,而存儲原圖像的存儲量爲512x512=262144,則壓縮比爲262144/12500=20.97,這裏沒有考慮存儲數據類型的差別。
SVD分解相對於特徵值分解的優點就是:
另外值得注意的一點:不管是奇異值分解仍是特徵值分解,分解出來的特徵向量都是正交的。
關於奇異值與PCA的關係, http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 給了很好的解釋,也直接整理過來,感謝原做者:
圖注:SVD與PCA
PCA就是一種用於對數據進行降維的方法(降維確定會丟失數據,只不過能在減小大量存儲量的同時損失儘量少),參見以前matlab對圖像進行SVD分解的例子,更容易理解:實現了SVD就實現了PCA,PCA僅是SVD的包裝。
PCA的應用很廣,主要用在機器學習中對特徵進行降維,還能用於去噪,下面兩圖是PCA降維和PCA去噪的例子(圖片來自鄒博PPT:北京9月秋季班·機器學習初步)
圖注:PCA降維
降維說白了就是將信息經過投影到更低得多維度,這樣必然會帶來信息的丟失,但就如上圖,這種信息的丟失卻有時對分類沒有影響,反而能下降識別算法的維度,提升速度,緩解所謂的維度災難。
圖注:PCA去噪
PCA去噪的前提是噪聲的特徵值會比信號的特徵值小,即信噪比高的狀況,不然PCA去噪會產生逆效果——把信號去掉了而噪聲沒去掉。
SVD還有其它不少方面的應用,經過查找資料,這裏先作個簡單的羅列,有機會再一個個研究:
另外,開源視覺庫OpenCV中也提供SVD分解的算法。