1. 程式人生 > >矩陣特徵值分解與奇異值分解含義解析及應用

矩陣特徵值分解與奇異值分解含義解析及應用

此文有一半轉載自他出,主要在這進行個整理,具體內容文中都有相關的轉載連結。

特徵值與特徵向量的幾何意義

矩陣的乘法是什麼,別隻告訴我只是“前一個矩陣的行乘以後一個矩陣的列”,還會一點的可能還會說“前一個矩陣的列數等於後一個矩陣的行數才能相乘”,然而,這裡卻會和你說——那都是表象。

矩陣乘法真正的含義是變換,我們學《線性代數》一開始就學行變換列變換,那才是線代的核心——別會了點貓膩就忘了本——對,矩陣乘法 就是線性變換,若以其中一個向量A為中心,則B的作用主要是使A發生如下變化:

  1. 伸縮

    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('變換後');
    1

    1

    從上圖可知,y方向進行了2倍的拉伸,x方向進行了3倍的拉伸,這就是B=[3 0; 0 2]的功勞,3和2就是伸縮比例。請注意,這時B除了對角線元素為各個維度的倍數外,非正對角線元素都為0,因為下面將要看到,對角線元素非0則將會發生切變及旋轉的效果。

  2. 切變

    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]);
    2

    2

  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]);
    3

    3

好,關於矩陣乘就這些了。那麼,我們接著就進入主題了,對特定的向量,經過一種方陣變換,經過該變換後,向量的方向不變(或只是反向),而只是進行伸縮變化(伸縮值可以是負值,相當於向量的方向反向)?這個時候我們不妨將書上對特徵向量的定義對照一遍:

數學教材定義: 設A是n階方陣,如果存在 λ 和n維非零向量X,使  ,則 λ 稱為方陣A的一個特徵值,X為方陣A對應於或屬於特徵值 λ 的一個特徵向量。

上面特定的向量不就是特徵向量嗎? λ 不就是那個伸縮的倍數嗎?因此,特徵向量的代數上含義是:將矩陣乘法轉換為數乘操作;特徵向量的幾何含義是:特徵向量通過方陣A變換隻進行伸縮,而保持特徵向量的方向不變。特徵值表示的是這個特徵到底有多重要,類似於權重,而特徵向量在幾何上就是一個點,從原點到該點的方向表示向量的方向。

特徵向量有一個重要的性質:同一特徵值的任意多個特徵向量的線性組合仍然是A屬於同一特徵值的特徵向量。關於特徵值,網上有一段關於“特徵值是震動的譜”的解釋:

戲說在朝代宋的時候,我國就與發現矩陣特徵值理論的機會擦肩而過。話說沒有出息的秦少游在往池塘裡扔了一顆小石頭後,剛得到一句“投石衝開水底天”的泡妞詩對之後,就猴急猴急地去洞房了,全然沒有想到水波中隱含著矩陣的特徵值及特徵向量的科學大道理。大概地說,水面附近的任一點水珠在原處上下振動(實際上在做近似圓周運動),並沒有隨著波浪向外圈移動,同時這些上下振動的水珠的幅度在漸漸變小,直至趨於平靜。在由某塊有著特定質量和形狀的石頭被以某種角度和速度投入某個面積和深度特定的水池中所決定的某個矩陣中,紋波盪漾中水珠的漸變過程中其特徵值起著決定性的作用,它決定著水珠振動的頻率和幅度減弱的衰退率。

在理解關於振動的特徵值和特徵向量的過程中,需要加入復向量和復矩陣的概念,因為在實際應用中,實向量和實矩陣是幹不了多少事的。機械振動和電振動有頻譜,振動的某個頻率具有某個幅度;那麼矩陣也有矩陣的譜,矩陣的譜就是矩陣特徵值的概念,是矩陣所固有的特性,所有的特徵值形成了矩陣的一個頻譜,每個特徵值是矩陣的一個“諧振頻點”。

美國數學家斯特讓(G..Strang)在其經典教材《線性代數及其應用》中這樣介紹了特徵值作為頻率的物理意義,他說:

大概最簡單的例子(我從不相信其真實性,雖然據說1831年有一橋樑毀於此因)是一對士兵通過橋樑的例子。傳統上,他們要停止齊步前進而要散步通過。這個理由是因為他們可能以等於橋的特徵值之一的頻率齊步行進,從而將發生共振。就像孩子的鞦韆那樣,你一旦注意到一個鞦韆的頻率,和此頻率相配,你就使頻率蕩得更高。一個工程師總是試圖使他的橋樑或他的火箭的自然頻率遠離風的頻率或液體燃料的頻率;而在另一種極端情況,一個證券經紀人則盡畢生精力於努力到達市場的自然頻率線。特徵值是幾乎任何一個動力系統的最重要的特徵。

其實,這個矩陣之所以能形成“頻率的譜”,就是因為矩陣在特徵向量所指的方向上具有對向量產生恆定的變換作用:增強(或減弱)特徵向量的作用。進一步的,如果矩陣持續地疊代作用於向量,那麼特徵向量的就會凸現出來。

特徵值分解

設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稱為右奇異向量,另外還可以得到:

SVD分解

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二維影象壓縮恢復

圖注:SVD二維影象壓縮恢復

如果按左下角的方式壓縮原圖,則儲存量變為:50x50+100x100+50=12500,而儲存原影象的儲存量為512x512=262144,則壓縮比為262144/12500=20.97,這裡沒有考慮儲存資料型別的差異。

SVD分解相對於特徵值分解的優勢就是:

  1. 分解的矩陣可以是任意矩陣
  2. 在恢復訊號的時候左右奇異值可以選擇不同的維度

另外值得注意的一點:不論是奇異值分解還是特徵值分解,分解出來的特徵向量都是正交的。

奇異值分解與PCA

圖注:SVD與PCA

圖注:SVD與PCA

PCA就是一種用於對資料進行降維的方法(降維肯定會丟失資料,只不過能在減少大量儲存量的同時損失儘可能少),參見之前matlab對影象進行SVD分解的例子,更容易理解:實現了SVD就實現了PCA,PCA僅是SVD的包裝。

PCA的應用很廣,主要用在機器學習中對特徵進行降維,還能用於去噪,下面兩圖是PCA降維和PCA去噪的例子(圖片來自鄒博PPT:北京9月秋季班·機器學習初步)

圖注:PCA降維

圖注:PCA降維

降維說白了就是將資訊通過投影到更低得多維度,這樣必然會帶來資訊的丟失,但就如上圖,這種資訊的丟失卻有時對分類沒有影響,反而能降低識別演算法的維度,提高速度,緩解所謂的維度災難。

圖注:PCA去噪

圖注:PCA去噪

PCA去噪的前提是噪聲的特徵值會比訊號的特徵值小,即信噪比高的情況,否則PCA去噪會產生逆效果——把訊號去掉了而噪聲沒去掉。

SVD其它

SVD還有其它很多方面的應用,通過查詢資料,這裡先做個簡單的羅列,有機會再一個個研究:

  1. 求偽逆。我們知道,矩陣求逆要求矩陣必須是方陣,SVD可以用來求任意矩陣的逆運算,求任意矩陣的逆矩陣稱為求偽逆
  2. 最小二乘法求解。憑著對《矩陣論》的零星的記憶,SVD演算法就是因為能求偽逆所以用來求解最小二乘法。
  3. 基於SVD的文字分類。首先接觸是從吳軍老師的《數學之美》一書上看到的,大致是:通過TF/IDF(term frequency/inverse document frequency)構建“一百萬篇文章和五十萬詞的關聯性”的矩陣 A1000000x500000 ,然後對A矩陣使用SVD分解之後,儲存量減小,而且左奇異值矩陣和右奇異值矩陣以及奇異值矩陣的物理含義將非常明晰,http://blog.csdn.net/wangzhiqing3/article/details/7431276 有簡單介紹,更多參見吳軍老師的《數學之美》

另外,開源視覺庫OpenCV中也提供SVD分解的演算法。

參考