日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tensorflow快餐教程(6) - 矩阵分解

發布時間:2024/8/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tensorflow快餐教程(6) - 矩阵分解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:?特征分解,奇異值分解,Moore-Penrose廣義逆

矩陣分解

特征向量和特征值

我們在《線性代數》課學過方陣的特征向量和特征值。

定義:設AFn×nA∈Fn×n是n階方陣。如果存在非零向量XFn×1X∈Fn×1使AX=λXAX=λX對某個常數λFλ∈F成立,則稱λλ是A的特征值(eigenvalue),X是屬于特征值λλ的特征向量。
σσ是數域F上向量空間V上的線性變換,如果某個非零向量uVu∈Vσσ映射到自己的常數倍σ(u)=λuσ(u)=λu,則稱常數λFλ∈Fσσ的特征值,向量u是屬于特征值λλ的特征向量。

又找λλ又找A確實不是一件容易事。好在,我們可以把這事兒交給Tensorflow去解決。我們可以用tf.self_adjoint_eigvals來求特征值,相當于MATLAB的eig函數,只不過名字長了點。

例:

>>> A1 = tf.constant([[3,2,1],[0,-1,-2],[0,0,3]],dtype=tf.float64) >>> sess.run(A1) array([[ 3., 2., 1.],[ 0., -1., -2.],[ 0., 0., 3.]]) >>> sess.run(tf.self_adjoint_eigvals(A1)) array([-1., 3., 3.])

附:MATLAB例:

> A1 = [3,2,1;0,-1,-2;0,0,3] A1 =3 2 10 -1 -20 0 3> eig(A1) ans =3-13

也就是說,A1矩陣有3個特征值-1,3,3。

特征分解

我們把用self_adjoint_eigvals求出來的向量轉換成對角矩陣:

>>> sess.run(tf.diag(tf.self_adjoint_eigvals(A1))) array([[-1., 0., 0.],[ 0., 3., 0.],[ 0., 0., 3.]])

同樣,我們把每個特征向量組成一個矩陣,假設為V.?
這樣,我們可以得到一個公式:A=Vdiag(λ)V?1A=Vdiag(λ)V?1
按照上面公式方法對矩陣A所做的操作叫做A的特征分解(eigen decomposition)

不是每一個矩陣都可以分解成特征值和特征向量。在某些情況下,特征分解存在,但是值是復數而不是實數。幸運的是,機器學習中遇到的方陣基本都可以分解成A=QΛQTA=QΛQT,其中Q是特征向量構成的正交矩陣,ΛΛ是對角矩陣。

奇異值分解

對于多數方陣,我們可以進行特征值分解。如果對于非方陣該怎么辦呢?答案是我們有類似的奇異向量(Singular vector)和奇異值(singular value). 通過奇異向量和奇異值,我們可以把非方陣進行奇異值分解(singular value decomposition),簡稱svd.?
SVD將矩陣分解為三個矩陣的乘積:A=UDVTA=UDVT。其中,U和V都定義為正交矩陣。D是對角矩陣,雖然不一定是方陣。
如果A是一個mn的矩陣,那么U是一個mm的矩陣,V是一個nn的矩陣,D與A一樣是mn的矩陣。

我們可以通過tf.svd函數來做奇異值分解,例:

>>> As =tf.constant( [[1,2,3],[4,5,6]], dtype=tf.float64) >>> sess.run(As) array([[1., 2., 3.],[4., 5., 6.]]) >>> sess.run(tf.svd(As, full_matrices=True)) (array([9.508032 , 0.77286964]), array([[-0.3863177 , -0.92236578],[-0.92236578, 0.3863177 ]]), array([[-0.42866713, 0.80596391, 0.40824829],[-0.56630692, 0.11238241, -0.81649658],[-0.7039467 , -0.58119908, 0.40824829]]))

As矩陣是23的矩陣。所以U是22的,而V是3*3的。第1個值是奇異值,[9.508032 , 0.77286964],它是D的對角線上值,其它位置為0.
D的完整值為:

array([[9.508032 , 0. , 0. ],[0. , 0.77286964, 0. ]])

三個矩陣的完整值為:

#U array([[-0.3863177 , -0.92236578],[-0.92236578, 0.3863177 ]]) #D array([[9.508032 , 0. , 0. ],[0. , 0.77286964, 0. ]]) #V array([[-0.42866713, 0.80596391, 0.40824829],[-0.56630692, 0.11238241, -0.81649658],[-0.7039467 , -0.58119908, 0.40824829]])

我們來驗算一下這個奇異值分解是不是正確的,別忘了V是要轉置的:

>>> sess.run(U @ D @ tf.transpose(V)) array([[0.99999997, 1.99999999, 2.99999997],[3.99999997, 5.00000001, 5.99999996]])

雖然是有點浮點計算誤差,但是結果還確實是我們分解前的那個。關于計算誤差的問題,在機器學習中也自然是重要問題,后面會討論。

Moore-Penrose廣義逆

鋪墊了這么多,其實我們是在為解線性方程組奮斗。我們在第一節Tensorflow的線性回歸例子,還有神經網絡的例子都看到,求解線性方程組是重要的運算。
形如Ax=b的線性方程組,如果A有逆矩陣就好辦了,兩邊分別右乘A逆就可以解出方程組。
但是問題是,機器學習中有很多方程是欠定的(underdetermined)。
這時候我們就需要一種類似于逆矩陣的工具 - Moore-Penrose廣義逆(pseudoinverse)。
Moore-Penrose廣義逆定義如下:
A+=limα0(ATA+αI)?1ATA+=limα→0(ATA+αI)?1AT

這個定義在計算時是沒法使用的,我們使用另一個公式來算
A+=VD+UTA+=VD+UT

這個公式一看太熟悉了,就是剛才我們學習的奇異值分解嘛。
其中D+D+,D的廣義逆的計算方法是所有非0值取倒數,然后矩陣轉置。

對于一個AX=B方程組的最小二乘法解,一般來講不是唯一的。通常把它們中2-范數最小的一個稱為極小最小二乘解,也叫最佳逼近解。
可以證明,AX=B必有唯一的極小最小二乘解,這個解就是X=A+BX=A+B

廣義逆簡史

首先復習一下逆陣的概念,如果一個矩陣有逆陣,條件為:

  • 必須是方陣
  • 行列式不能為0
  • 美國數學家Moore于1920年逆矩陣的概念推廣到任意矩陣上,使用的方法是正交投影算子來定義的。
    1955年,英國數學家Penrose用下面的方程組來定義廣義逆:
    AGA=A,GAG=G,(AG)H=AG(GA)H=GAAGA=A,GAG=G,(AG)H=AG(GA)H=GA
    其中,H這個符號代表矩陣共軛的轉置,對于實數就相當于T。
    不久之后,瑞典大地測量學家Arne Bjerhammer證明了Moore廣義逆與Penrose廣義逆的等價性。所以把它定義為Moore-Penrose廣義逆。除了A+A+之外,還有A?

    A?廣義逆等。


    作者:lusing

    原文鏈接

    本文為云棲社區原創內容,未經允許不得轉載。

    總結

    以上是生活随笔為你收集整理的Tensorflow快餐教程(6) - 矩阵分解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。