數學學習如此容易:用Python計算特徵值和特徵向量

什麼是NumPy?

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。

數學學習如此容易:用Python計算特徵值和特徵向量

NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協作者共同開發,2005 年,Travis Oliphant 在 Numeric 中結合了另一個同性質的程序庫 Numarray 的特色,並加入了其它擴展而開發了 NumPy。NumPy 為開放源代碼並且由許多協作者共同維護開發。

NumPy 是一個運行速度非常快的數學庫,主要用於數組計算,包含:

  • 一個強大的N維數組對象 ndarray
  • 廣播功能函數
  • 整合 C/C++/Fortran 代碼的工具
  • 線性代數、傅里葉變換、隨機數生成等功能

特徵值和特徵向量的定義

設A是n階方陣,如果數λ和n維非零列向量x使關係式Ax=λx成立,那麼這樣的數λ稱為矩陣A特徵值,非零向量x稱為A的對應於特徵值λ的特徵向量。式Ax=λx也可寫成( A-λE)X=0。這是n個未知數n個方程的齊次線性方程組,它有非零解的充分必要條件是係數行列式| A-λE|=0。

特徵值 是方程式Ax=ax的標量解(scalar solutions),其中A是一個二維矩陣,而x是一維向量。 特徵向量 實際上就是表示特徵值的向量。

提示:

特徵值和特徵向量都是基本的數學概念,並且常用於一些重要的算法中,如 主成分分析(PCA) 算法。PCA可以極大地簡化大規模數據集的分析過程。

用NumPy進行計算

計算特徵值時,可以求助於numpy.linalg程序包提供的eigvals()子例程。函數eig()的返回值是一個元組,其元素為特徵值和特徵向量。

可以用子程序包numpy.linalg的eigvals()和eig()函數來獲得矩陣的特徵值和特徵向量,並通過dot()函數(詳見本書對應的eigenvalues.py文件)來驗算結果。


import numpy as np

A = np.mat("3 -2;1 0")
print "A\\n", A

print "Eigenvalues", np.linalg.eigvals(A)

eigenvalues, eigenvectors = np.linalg.eig(A)
print "First tuple of eig", eigenvalues
print "Second tuple of eig\\n", eigenvectors

for i in range(len(eigenvalues)):
   print "Left", np.dot(A, eigenvectors[:,i])
   print "Right", eigenvalues[i] * eigenvectors[:,i]
   print

下面來計算一個矩陣的特徵值。

數學學習如此容易:用Python計算特徵值和特徵向量

1.創建矩陣。

下列代碼將創建一個矩陣:


A = np.mat("3 -2;1 0")
print "A\\n", A

下面的矩陣即剛才創建的矩陣。


<code>A
[[ 3 -2]
[ 1  0]]
/<code>

2.利用e``ig()函數計算特徵值。

這時,我們可以使用eig()子例程:


print "Eigenvalues", np.linalg.eigvals(A)

該矩陣的特徵值如下:


Eigenvalues [ 2.  1.] 

3.利用eig()``函數取得特徵值和特徵向量。

數學學習如此容易:用Python計算特徵值和特徵向量

利用eig()函數,可以得到特徵值和特徵向量。注意,該函數返回的是一個元組,其第一個元素是特徵值,第二個元素為相應的eigenvectors,其以面向列的方式 排列:


eigenvalues, eigenvectors = np.linalg.eig(A)
print "First tuple of eig", eigenvalues
print "Second tuple of eig\\n", eigenvectors

特徵值eigenvalues和特徵向量eigenvectors的值為:


First tuple of eig [ 2.  1.]
Second tuple of eig
[[ 0.89442719  0.70710678]
[ 0.4472136   0.70710678]]

4.驗算結果。

通過dot()函數計算特徵值方程式Ax = ax兩邊的值,就可以對結果進行驗算:


for i in range(len(eigenvalues)):
   print "Left", np.dot(A, eigenvectors[:,i])
   print "Right", eigenvalues[i] * eigenvectors[:,i]
   print

輸出內容如下所示:


Left [[ 1.78885438]
[ 0.89442719]]
Right [[ 1.78885438]
[ 0.89442719]]
Left [[ 0.70710678]
[ 0.70710678]]

Right [[ 0.70710678]
[ 0.70710678]]

喜歡本文嗎? (單選)
0人
0%
喜歡,要收藏,更要轉發
0人
0%
不喜歡
<button>投票/<button>

想要更多Python學習數學,請點擊。

數學學習如此容易:用Python計算特徵值和特徵向量


分享到:


相關文章: