zoukankan      html  css  js  c++  java
  • SciPy 线性代数

    章节


    SciPy线性代数包是使用优化的ATLAS LAPACK和BLAS库构建的,具有高效的线性代数运算能力。

    线性代数包里的函数,操作对象都是二维数组。

    SciPy.linalg 与 NumPy.linalg
    与NumPy.linalg相比,scipy.linalg除了包含numpy.linalg中的所有函数,还具有numpy.linalg中没有的高级功能。

    线性方程组求解

    scipy.linalg.solve 函数可用于解线性方程。例如,对于线性方程$a * x + b * y = z$,求出未知数x, y值。

    示例

    解下面的联立方程组:

    $$
    x + 3y + 5z = 10
    2x + 5y + z = 8
    2x + 3y + 8z = 3
    $$

    上面的方程组,可以用矩阵表示为:

    $$
    left[
    egin{matrix}
    1 & 3 & 5
    2 & 5 & 1
    2 & 3 & 8
    end{matrix}
    ight]

    left[
    egin{matrix}
    x
    y
    z
    end{matrix}
    ight] =

    left[
    egin{matrix}
    10
    8
    3
    end{matrix}
    ight]

    $$

    利用矩阵求解上面方程组,如下图所示:

    $$
    left[
    egin{matrix}
    x
    y
    z
    end{matrix}
    ight]

    =

    left[
    egin{matrix}
    1 & 3 & 5
    2 & 5 & 1
    2 & 3 & 8
    end{matrix}
    ight]^{-1}

    left[
    egin{matrix}
    10
    8
    3
    end{matrix}
    ight]

    = frac{1}{25}

    left[
    egin{matrix}
    -232
    129
    19
    end{matrix}
    ight]

    =

    left[
    egin{matrix}
    -9.28
    5.16
    0.76
    end{matrix}
    ight]

    $$

    下面我们使用scipy来求解。

    scipy.linalg.solve函数接受两个输入,数组a和数组b,数组a表示系数,数组b表示等号右侧值,求出的解将会放在一个数组里返回。

    让我们考虑下面的例子。

    # 导入scipy和numpy包
    from scipy import linalg
    import numpy as np
    
    # 声明numpy数组
    a = np.array([[1, 3, 5], [2, 5, 1], [2, 3, 8]])
    b = np.array([10, 8, 3])
    
    # 求解
    x = linalg.solve(a, b)
    
    # 输出解值
    print (x)
    

    输出

    [-9.28  5.16  0.76]
    

    计算行列式

    矩阵A的行列式表示为$|A|$,行列式计算是线性代数中的常见运算。

    SciPy中,可以使用det()函数计算行列式,它接受一个矩阵作为输入,返回一个标量值,即该矩阵的行列式值。

    示例

    # 导入scipy和numpy包
    from scipy import linalg
    import numpy as np
    
    # 声明numpy数组
    A = np.array([[3,4],[7,8]])
    
    # 计算行列式
    x = linalg.det(A)
    
    # 输出结果
    print (x)
    

    输出

    -4.0
    

    求取特征值与特征向量

    求取矩阵的特征值、特征向量,也是线性代数中的常见计算。

    通常,可以根据下面的关系,求取矩阵(A)的特征值(λ)、特征向量(v):

    $$ Av = λv $$

    scipy.linalg.eig 函数可用于计算特征值与特征向量,函数返回特征值和特征向量。

    示例

    # 导入scipy和numpy包
    from scipy import linalg
    import numpy as np
    
    # 声明numpy数组
    A = np.array([[3,4],[7,8]])
    
    # 求解
    l, v = linalg.eig(A)
    
    # 打印特征值
    print('特征值')
    print (l)
    
    # 打印特征向量
    print('特征向量')
    print (v)
    

    上面的程序将生成以下输出。

    特征值
    [-0.35234996+0.j 11.35234996+0.j]
    特征向量
    [[-0.76642628 -0.43192981]
     [ 0.64233228 -0.90190722]]
    

    SVD奇异值分解

    奇异值分解(SVD)是现在比较常见的算法之一,也是数据挖掘工程师、算法工程师必备的技能之一。 假设A是一个$M×N$的矩阵,那么通过矩阵分解将会得到$U,Σ,VT$(V的转置)三个矩阵,其中U是一个$M×M$的方阵,被称为左奇异向量,方阵里面的向量是正交的;Σ是一个$M×N$的对角矩阵,除了对角线的元素其他都是0,对角线上的值称为奇异值;$VT$(V的转置)是一个$N×N$的矩阵,被称为右奇异向量,方阵里面的向量也都是正交的。

    $$ A_{m imes{n}} = U_{m imes{m}} Σ_{m imes{n}} V_{n imes{n}}^T$$

    让我们考虑下面的例子。

    # 导入scipy和numpy包
    from scipy import linalg
    import numpy as np
    
    # 声明numpy数组
    a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
    
    # 输出原矩阵
    print('原矩阵')
    print(a)
    
    # 求解
    U, s, Vh = linalg.svd(a)
    
    # 输出结果
    print('奇异值分解')
    print(U, "#U")
    print(Vh, "#Vh")
    print(s, "#s")
    

    上面的程序将生成以下输出。

    原矩阵
    [[ 1.81840014+0.16615057j -0.47446573-2.36327076j]
     [-0.19366846-0.44489565j -0.03227288+0.02260894j]
     [-0.91921239-0.99340761j -1.33606096+0.40858722j]]
    奇异值分解
    [[-0.84399035+0.03548862j -0.1574924 +0.44602345j  0.08723906-0.23466874j]
     [ 0.03893388+0.08672055j -0.19156838-0.45118633j -0.02718865-0.86600053j]
     [ 0.23121352+0.47320699j -0.71944217+0.13562682j  0.41089761+0.13336765j]] #U
    [[-0.63461867+0.j          0.05670247+0.77074248j]
     [ 0.77282543+0.j          0.04656219+0.63290822j]] #Vh
    [3.55734783 0.7144458 ] #s
    
    
    
  • 相关阅读:
    在Windows下生成SSH文件
    git常用命令总结
    小Q的歌单
    在vmware下安装Ubuntu16-04
    hexo-next博客中mathjax显示问题解决
    可乐复制问题
    hexo-next博客添加评论功能
    hexo-next博客添加在线联系功能
    tableau desktop
    tableau desktop
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11819411.html
Copyright © 2011-2022 走看看