Scipy學習筆記
非本人原創 原鏈接 http://blog.sina.com.cn/s/blog_70586e000100moen.html
1.逆矩陣的求解
>>>import scipy
>>>from scipy import linalg
>>>a=scipy.mat('[1 2 3;2 2 1;3 4 3]')
>>>b=linalg.inv(a)
>>>print b
輸出結果
[[ 1. 3. -2. ]
[-1.5 -3. 2.5]
[ 1. 1. -1. ]]
>>> a*b
輸出結果
matrix([[ 1.00000000e+00, -4.44089210e-16, -4.44089210e-16],
[ 0.00000000e+00, 1.00000000e+00, -2.22044605e-16],
[ -4.44089210e-16, 0.00000000e+00, 1.00000000e+00]])
2.求行列式的值
>>> linalg.det(a)
輸出結果
1.9999999999999996
3.求a的模
>>> linalg.norm(a)
輸出結果
7.5498344352707498
4.求超定方程的最小二乘解
>>> a=scipy.mat('[1 -1;-1 1;2 -2;-3 1]')
>>> a
matrix([[ 1, -1],
[-1, 1],
[ 2, -2],
[-3, 1]])
>>> b=scipy.mat('[1;2;3;4]')
>>> b
matrix([[1],
[2],
[3],
[4]])
>>> x,y,z,w=linalg.lstsq(a,b)
輸出結果
>>> x #x為解
array([[-2.41666667],
[-3.25 ]])
>>> y
array([ 9.83333333])
>>> z
2
>>> w
array([ 4.56605495, 1.07291295])
5.求特征值及特征向量
>>> a=scipy.mat('[-1 1 0;-4 3 0;1 0 2]')
>>> a
matrix([[-1, 1, 0],
[-4, 3, 0],
[ 1, 0, 2]])
>>> x,y=linalg.eig(a)
輸出結果
>>> x #x為特征值
array([ 2.+0.j, 1.+0.j, 1.+0.j])
>>> y #y為特征向量
array([[ 0. , 0.40824829, 0.40824829],
[ 0. , 0.81649658, 0.81649658],
[ 1. , -0.40824829, -0.40824829]])
6.LU分解
>>> a=scipy.mat('[1 2 3;0 1 2;2 4 1]')
>>> a
matrix([[1, 2, 3],
[0, 1, 2],
[2, 4, 1]])
>>> x,y,z=linalg.lu(a)
輸出結果
>>> x
array([[ 0., 0., 1.],
[ 0., 1., 0.],
[ 1., 0., 0.]])
>>> y #L矩陣
array([[ 1. , 0. , 0. ],
[ 0. , 1. , 0. ],
[ 0.5, -0. , 1. ]])
>>> z #U矩陣
array([[ 2. , 4. , 1. ],
[ 0. , 1. , 2. ],
[ 0. , 0. , 2.5]])
7.Cholesky分解
>>> a=scipy.mat('[16 4 8;4 -5 4;8 -4 22]')
>>> a
matrix([[16, 4, 8],
[ 4, -5, 4],
[ 8, -4, 22]])
>>>linalg.cholesky(a)
輸出結果
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\Python26\lib\site-packages\scipy\linalg\decomp_cholesky.py", line 66, in cholesky
c, lower = _cholesky(a, lower=lower, overwrite_a=overwrite_a, clean=True)
File "D:\Python26\lib\site-packages\scipy\linalg\decomp_cholesky.py", line 24, in _cholesky
raise LinAlgError("%d-th leading minor not positive definite" % info)
LinAlgError: 2-th leading minor not positive definite
8.求解線性方程組
>>> a=scipy.mat('[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]')
>>> a
matrix([[ 2, 1, -5, 1],
[ 1, -3, 0, -6],
[ 0, 2, -1, 2],
[ 1, 4, -7, 6]])
>>> b=scipy.mat('[8;9;-5;0]')
>>> b
matrix([[ 8],
[ 9],
[-5],
[ 0]])
>>> linalg.solve(a,b)
輸出結果
array([[ 3.],
[-4.],
[-1.],
[ 1.]])
學習總結:
求逆矩陣:linalg.inv(*)
求行列式的值:linalg.det(*)
求模:linalg.norm(*)
求超定方程的最小二乘解:x,y,z=linalg.lstsq(a,b) #x為解
求特征值和特征向量:x,y=linalg.eig(a,b) #x為特征值 y為特征向量
求LU分解:x,y,z=linalg.lu(*) #y為L分解 z為U分解
求解線性方程組:linalg.solve(a,b)
求Cholesky分解:linalg.cholesky(a)
疑問:
求解Cholesky分解時的輸出結果出錯?
作者語:
《SciPy Reference Guide》對Scipy的學習很有幫助,但市場上還未出現其中文版。本人英文水平有限,且為非計算機專業,還望世外高人能指點下哪些章節比較實用,本人感激不盡。