当前位置:   article > 正文

SciPy 线性代数_scipy.linalg.eig

scipy.linalg.eig

章节


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

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

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

线性方程组求解

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

示例

解下面的联立方程组:

x + 3 y + 5 z = 10 2 x + 5 y + z = 8 2 x + 3 y + 8 z = 3 x + 3y + 5z = 10 \\ 2x + 5y + z = 8 \\ 2x + 3y + 8z = 3 x+3y+5z=102x+5y+z=82x+3y+8z=3

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

$$
\left[
\begin{matrix}
1 & 3 & 5 \
2 & 5 & 1 \
2 & 3 & 8
\end{matrix}
\right]

\left[

x y z

\right] =

\left[

10 8 3

\right]

$$

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

$$
\left[
\begin{matrix}
x \
y \
z
\end{matrix}
\right]

=

\left[

135 251 238

\right]^{-1}

\left[

10 8 3

\right]

= \frac{1}{25}

\left[

232 129 19

\right]

=

\left[

9.28 5.16 0.76

\right]

$$

下面我们使用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出

[-9.28  5.16  0.76]
  • 1

计算行列式

矩阵A的行列式表示为 ∣ 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出

-4.0
  • 1

求取特征值与特征向量

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

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

A v = λ v Av = λ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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

特征值
[-0.35234996+0.j 11.35234996+0.j]
特征向量
[[-0.76642628 -0.43192981]
 [ 0.64233228 -0.90190722]]
  • 1
  • 2
  • 3
  • 4
  • 5

SVD奇异值分解

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

A m × n = U m × m Σ m × n V n × n T A_{m\times{n}} = U_{m\times{m}} Σ_{m\times{n}} V_{n\times{n}}^T Am×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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

原矩阵
[[ 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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/119037
推荐阅读
相关标签
  

闽ICP备14008679号