Scipy学习笔记 矩阵计算
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的学习很有帮助,但市场上还未出现其中文版。本人英文水平有限,且为非计算机专业,还望世外高人能指点下哪些章节比较实用,本人感激不尽。