矩陣運算——矩陣乘除法python

哈嘍,鑑於上一篇博文出現問題,此處特地開一篇,我也是一臉矇蔽。

很多博文只會求得矩陣特徵分解的特徵值和特徵向量,而從沒有進行驗證,驗證方法兩個

1  A*v=lam*v                    lam是特徵值

2 det(A-lam*I)=0              I是單位陣

我隨機產生的矩陣求特徵值發現有複數產生,爲了方便,網上找了不是複數的矩陣。

錯誤方法復現

>>> A
array([[-1,  1,  0],
       [-4,  3,  0],
       [ 1,  0,  2]])
lamba,va=np.linalg.eig(A)

#the first validation
>>> np.dot(A,va)
array([[ 0.        ,  0.40824829,  0.40824829],
       [ 0.        ,  0.81649658,  0.81649658],
       [ 2.        , -0.40824829, -0.40824829]])
>>> np.dot(np.diag(lamba),va)
array([[ 0.        ,  0.81649658,  0.81649658],
       [ 0.        ,  0.81649658,  0.81649658],
       [ 1.        , -0.40824829, -0.40824829]])

#服不服?這是錯的

#the second validation
>>> np.linalg.det(A-np.diag(lamba))
-2.0

#崩潰不


且不說上面有個特徵值是重複的。

原因是加轉置就正確了,公式是公式,實際操作就是不一樣,不服就錯。

【其實原因是v是特徵向量,而求得是矩陣,lam是標量,得到的是向量,按照給定的1式驗證,需要驗證3次,而加轉置只需驗證一次即可】

笨方法驗證:

>>> np.dot(A,va[:,0])
array([0., 0., 2.])
>>> lamba[0]*va[:,0]
array([0., 0., 2.])
>>> np.dot(A,va[:,1])
array([ 0.40824829,  0.81649658, -0.40824829])
>>> lamba[1]*va[:,1]
array([ 0.40824829,  0.81649658, -0.40824829])
>>> np.dot(A,va[:,2])
array([ 0.40824829,  0.81649658, -0.40824829])
>>> lamba[2]*va[:,2]
array([ 0.40824829,  0.81649658, -0.40824829])

第二個驗證錯誤的原因有兩個

1)lam是向量,2式中是標量,

2)單位矩陣不是全爲1的矩陣,而只有對角線上爲1

【紙上得來終覺淺,絕知此事要躬行】

只有當用到的時候才知道,至於除法則是求逆矩陣即可,線性代數模塊有直接的inv和pinv僞逆

不再驗證了,拜拜

 

另外有相關問題可以加入QQ羣討論,不設微信羣

QQ羣:868373192 

語音圖像視頻深度-學習羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章