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[
\begin{matrix}
1 & 3 & 5 \
2 & 5 & 1 \
2 & 3 & 8
\end{matrix}
\right]
\left[
\begin{matrix}
x \
y \
z
\end{matrix}
\right] =
\left[
\begin{matrix}
10 \
8 \
3
\end{matrix}
\right]
$$
利用矩阵求解上面方程组,如下图所示:
$$
\left[
\begin{matrix}
x \
y \
z
\end{matrix}
\right]
=
\left[
\begin{matrix}
1 & 3 & 5 \
2 & 5 & 1 \
2 & 3 & 8
\end{matrix}
\right]^{-1}
\left[
\begin{matrix}
10 \
8 \
3
\end{matrix}
\right]
= \frac{1}{25}
\left[
\begin{matrix}
-232 \
129 \
19
\end{matrix}
\right]
=
\left[
\begin{matrix}
-9.28 \
5.16 \
0.76
\end{matrix}
\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)
输出
[-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\times{n}} = U_{m\times{m}} Σ_{m\times{n}} V_{n\times{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
SciPy 线性代数的更多相关文章
- scipy科学计算库
特定函数 例贝塞尔函数: 积分 quad,dblquad,tplquad对应单重积分,双重积分,三重积分 from scipy.integrate import quad,dblquad,tplqua ...
- SciPy 信号处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 图像处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 优化
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 积分
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 插值
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 输入输出
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 常量
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
随机推荐
- vue 组件,以及组件的复用
有时候代码的某一模块可能会经常使用到,那么完全可以把这一模块抽取出来,封装为一个组件,哪里需要用到的时候只需把模块调用即可 .参考vue官方 https://cn.vuejs.org/v2/guide ...
- base64,base32bit加密解密
import base64 str='admin' str=str.encode('utf-8') #加密 bs64=base64.b64encode(str) #解密 debs64=base64.b ...
- 安装 Python 虚拟环境 (Linux)
我的 Ubuntu 18.04 预安装了 python 3.6,但是没有安装 pip,所以先进行安装: apt-get install python-pip 1. 安装虚拟环境所需包: pip ins ...
- 使用pyinstaller打包.py程序
使用pyinstaller打包.py程序 例如打包D:/Desktop 目录下的 filename.py 文件 打开 cmd 将目录切换至 D:/Desktop 输入命令 pyinstaller -F ...
- 五 Action访问方法,method配置,通配符(常用),动态
1 通过method配置(有点low) 建立前端JSP:demo4.jsp <%@ page language="java" contentType="text/h ...
- 支持USB4的Linux 5.6,有望在今年4月份推出
导读 根据外媒Phoronix的报道,Linux 5.6将支持USB4,. USB4的规范在去年9月份发布,基于雷电3,并与之向后兼容.英特尔的开源部门在去年10月份添加了USB4的初始补丁. 据报道 ...
- 帆软FineReport报表使用小技巧
1.IF函数写法: =IF(E3=0 && F3=0 && G3=0,1,0)
- 【PAT甲级】1031 Hello World for U (20 分)
题意: 输入一个字符串长度为5~80,以'U'型输出,使得底端一行字符数量不小于侧面一列,左右两列长度相等. trick: 不把输出的数组全部赋值为空格为全部答案错误,可能不赋值数组里值为0,赋值后是 ...
- JS中字符串的编码 解码
DEPTNAME 是一个字符串 编码: DEPTNAME = encodeURI(encodeURI(DEPTNAME)); 解码: DEPTNAME = decodeURI(DEPTNAME,&qu ...
- 阿里云服务器ubantu创建新用户登录显示问题
在root用户下输入:vi /etc/passwd,找到添加的用户,在后面加上/bin/bash 重新登录即回复正常