SciPy线性代数包是使用优化的ATLAS LAPACK和BLAS库构建的,具有高效的线性代数运算能力。
线性代数包里的函数,操作对象都是二维数组。
SciPy.linalg 与 NumPy.linalg
与NumPy.linalg相比,scipy.linalg除了包含numpy.linalg中的所有函数,还具有numpy.linalg中没有的高级功能。
线性方程组求解
scipy.linalg.solve 函数可用于解线性方程。例如,对于线性方程a * x + b * y = za∗x+b∗y=z,求出未知数x, y值。
示例
解下面的联立方程组:
下面我们使用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|∣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 = λvAv=λ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×NM×N的矩阵,那么通过矩阵分解将会得到U,Σ,V^TU,Σ,VT(V的转置)三个矩阵,其中U是一个M×MM×M的方阵,被称为左奇异向量,方阵里面的向量是正交的;Σ是一个M×NM×N的对角矩阵,除了对角线的元素其他都是0,对角线上的值称为奇异值;V^TVT(V的转置)是一个N×NN×N的矩阵,被称为右奇异向量,方阵里面的向量也都是正交的。
A_{m\times{n}} = U_{m\times{m}} Σ_{m\times{n}} V_{n\times{n}}^TAm×n=Um×mΣm×nVn×nT
让我们考虑下面的例子。
# 导入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