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:Python26libsite-packagesscipylinalgdecomp_cholesky.py", line 66, in cholesky
    c, lower = _cholesky(a, lower=lower, overwrite_a=overwrite_a, clean=True)
  File "D:Python26libsite-packagesscipylinalgdecomp_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的学习很有帮助,但市场上还未出现其中文版。本人英文水平有限,且为非计算机专业,还望世外高人能指点下哪些章节比较实用,本人感激不尽。

原文地址:https://www.cnblogs.com/zhilangtaosha/p/5754589.html