numpy linalg模块的具体使用方法


Posted in Python onMay 26, 2019

最近在看机器学习的 LogisticRegressor,BayesianLogisticRegressor算法,里面得到一阶导数矩阵g和二阶导数Hessian矩阵H的时候,用到了这个模块进行求解运算,记录一下。

numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

import numpy as np
# 1. 计算逆矩阵
# 创建矩阵
A = np.mat("0 1 2;1 0 3;4 -3 8")
print (A)
#[[ 0 1 2]
# [ 1 0 3]
# [ 4 -3 8]]
# 使用inv函数计算逆矩阵
inv = np.linalg.inv(A)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]
# 检查原矩阵和求得的逆矩阵相乘的结果为单位矩阵
print (A * inv)
#[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]

注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。

# 2. 求解线性方程组
# numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量
 
#创建矩阵和数组
B = np.mat("1 -2 1;0 2 -8;-4 5 9")
b = np.array([0,8,-9])
 
# 调用solve函数求解线性方程
x = np.linalg.solve(B,b)
print (x)
#[ 29. 16. 3.]
 
# 使用dot函数检查求得的解是否正确
print (np.dot(B , x))
# [[ 0. 8. -9.]]
# 3. 特征值和特征向量
# 特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。
 
#其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量
# numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组
 
# 创建一个矩阵
C = np.mat("3 -2;1 0")
 
# 调用eigvals函数求解特征值
c0 = np.linalg.eigvals(C)
print (c0)
# [ 2. 1.]
 
# 使用eig函数求解特征值和特征向量 
#(该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量)
c1,c2 = np.linalg.eig(C)
print (c1)
# [ 2. 1.] 
print (c2)
#[[ 0.89442719 0.70710678]
# [ 0.4472136 0.70710678]]
 
# 使用dot函数验证求得的解是否正确
for i in range(len(c1)):
print ("left:",np.dot(C,c2[:,i]))
print ("right:",c1[i] * c2[:,i])
#left: [[ 1.78885438]
# [ 0.89442719]]
#right: [[ 1.78885438]
# [ 0.89442719]]
#left: [[ 0.70710678]
# [ 0.70710678]]
#right: [[ 0.70710678]
# [ 0.70710678]]
# 4.奇异值分解
# SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
# numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。
 
import numpy as np
 
# 分解矩阵
D = np.mat("4 11 14;8 7 -2")
# 使用svd函数分解矩阵
U,Sigma,V = np.linalg.svd(D,full_matrices=False)
print ("U:",U)
#U: [[-0.9486833 -0.31622777]
# [-0.31622777 0.9486833 ]]
print ("Sigma:",Sigma)
#Sigma: [ 18.97366596 9.48683298]
print ("V",V)
#V [[-0.33333333 -0.66666667 -0.66666667]
# [ 0.66666667 0.33333333 -0.66666667]]
# 结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma
 
# 使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘
print (U * np.diag(Sigma) * V)
#[[ 4. 11. 14.]
# [ 8. 7. -2.]]
# 5. 广义逆矩阵
# 使用numpy.linalg模块中的pinv函数进行求解,
# 注:inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制
 
import numpy as np
 
# 创建一个矩阵
E = np.mat("4 11 14;8 7 -2")
# 使用pinv函数计算广义逆矩阵
pseudoinv = np.linalg.pinv(E)
print (pseudoinv)
#[[-0.00555556 0.07222222]
# [ 0.02222222 0.04444444]
# [ 0.05555556 -0.05555556]]
 
# 将原矩阵和得到的广义逆矩阵相乘
print (E * pseudoinv)
#[[ 1.00000000e+00 -5.55111512e-16]
# [ 0.00000000e+00 1.00000000e+00]]
# 6. 行列式
# numpy.linalg模块中的det函数可以计算矩阵的行列式
 
import numpy as np
 
# 计算矩阵的行列式
F = np.mat("3 4;5 6")
# 使用det函数计算行列式
print (np.linalg.det(F))
# -2.0

学完这些之后,再用其中的numpy.linalg.solve()函数对(H,g)线性方程组进行求解。

def _fit(self, X, t, max_iter=100): #输入样本 , 0,1标签 ,最大迭代步数
  self._check_binary(t)
  w = np.zeros(np.size(X, 1))  #初始化权重矩阵 X行
  for _ in range(max_iter):
    w_prev = np.copy(w)    #保存原先的权重信息 用来更新权重
    y = self._sigmoid(X @ w)  #sigmoid 特征向量@权重矩阵 输出y
    grad = X.T @ (y - t)    #一阶导数
    hessian = (X.T * y * (1 - y)) @ X  #二阶导数 Hessian矩阵
    try:
      w -= np.linalg.solve(hessian, grad)
      print(w)
    except np.linalg.LinAlgError:
      break
    if np.allclose(w, w_prev): #收敛到一定的精度
      break
  self.w = w
# [-0.17924772 1.02982033 0.54459921]
# [-0.25994586 1.76892341 0.90294418]
# [-0.35180664 2.60346027 1.25122256]
# [-0.468509  3.54309929 1.60131553]
# [-0.58591528 4.43787542 1.93496706]
# [-0.65896159 4.97839095 2.14764763]
# [-0.67659725 5.10615457 2.20048333]
# [-0.67736191 5.11159274 2.20281247]
# [-0.67736325 5.11160214 2.20281657]

PS:更多示例

# 线性代数
# numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

import numpy as np

# 1. 计算逆矩阵
# 创建矩阵
A = np.mat("0 1 2;1 0 3;4 -3 8")
print (A)
#[[ 0 1 2]
# [ 1 0 3]
# [ 4 -3 8]]

# 使用inv函数计算逆矩阵
inv = np.linalg.inv(A)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]

# 检查原矩阵和求得的逆矩阵相乘的结果为单位矩阵
print (A * inv)
#[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]

# 注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。


# 2. 求解线性方程组
# numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量

import numpy as np

#创建矩阵和数组
B = np.mat("1 -2 1;0 2 -8;-4 5 9")
b = np.array([0,8,-9])

# 调用solve函数求解线性方程
x = np.linalg.solve(B,b)
print (x)
#[ 29. 16. 3.]

# 使用dot函数检查求得的解是否正确
print (np.dot(B , x))
# [[ 0. 8. -9.]]


# 3. 特征值和特征向量
# 特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量
# numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组 

import numpy as np

# 创建一个矩阵
C = np.mat("3 -2;1 0")

# 调用eigvals函数求解特征值
c0 = np.linalg.eigvals(C)
print (c0)
# [ 2. 1.]

# 使用eig函数求解特征值和特征向量 (该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量)
c1,c2 = np.linalg.eig(C)
print (c1)
# [ 2. 1.] 
print (c2)
#[[ 0.89442719 0.70710678]
# [ 0.4472136 0.70710678]] 

# 使用dot函数验证求得的解是否正确
for i in range(len(c1)):
 print ("left:",np.dot(C,c2[:,i]))
 print ("right:",c1[i] * c2[:,i])
#left: [[ 1.78885438]
# [ 0.89442719]]
#right: [[ 1.78885438]
# [ 0.89442719]]
#left: [[ 0.70710678]
# [ 0.70710678]]
#right: [[ 0.70710678]
# [ 0.70710678]]

 

# 4.奇异值分解
# SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
# numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。

import numpy as np

# 分解矩阵
D = np.mat("4 11 14;8 7 -2")
# 使用svd函数分解矩阵
U,Sigma,V = np.linalg.svd(D,full_matrices=False)
print ("U:",U)
#U: [[-0.9486833 -0.31622777]
# [-0.31622777 0.9486833 ]]
print ("Sigma:",Sigma)
#Sigma: [ 18.97366596 9.48683298]
print ("V",V)
#V [[-0.33333333 -0.66666667 -0.66666667]
# [ 0.66666667 0.33333333 -0.66666667]]
# 结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma

# 使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘
print (U * np.diag(Sigma) * V)
#[[ 4. 11. 14.]
# [ 8. 7. -2.]]

# 5. 广义逆矩阵
# 使用numpy.linalg模块中的pinv函数进行求解,
# 注:inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制

import numpy as np

# 创建一个矩阵
E = np.mat("4 11 14;8 7 -2")
# 使用pinv函数计算广义逆矩阵
pseudoinv = np.linalg.pinv(E)
print (pseudoinv)
#[[-0.00555556 0.07222222]
# [ 0.02222222 0.04444444]
# [ 0.05555556 -0.05555556]]

# 将原矩阵和得到的广义逆矩阵相乘
print (E * pseudoinv)
#[[ 1.00000000e+00 -5.55111512e-16]
# [ 0.00000000e+00 1.00000000e+00]]

# 6. 行列式
# numpy.linalg模块中的det函数可以计算矩阵的行列式

import numpy as np

# 计算矩阵的行列式
F = np.mat("3 4;5 6")
# 使用det函数计算行列式
print (np.linalg.det(F))
# -2.0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析json实例方法
Nov 19 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
python模块之re正则表达式详解
Feb 03 Python
python实现textrank关键词提取
Jun 22 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
python安装requests库的实例代码
Jun 25 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
python flask解析json数据不完整的解决方法
May 26 #Python
如何使用pyinstaller打包32位的exe程序
May 26 #Python
让你Python到很爽的加速递归函数的装饰器
May 26 #Python
Django框架模板的使用方法示例
May 25 #Python
Django框架搭建的简易图书信息网站案例
May 25 #Python
Django框架实现的分页demo示例
May 25 #Python
Flask框架工厂函数用法实例分析
May 25 #Python
You might like
PHP英文字母大小写转换函数小结
2014/05/03 PHP
php生成短域名函数
2015/03/23 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
jcrop基本参数一览
2013/07/16 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
微信小程序日历效果
2018/12/29 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
解决Python发送Http请求时,中文乱码的问题
2020/04/30 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
坎儿井导游词
2015/02/09 职场文书
统计工作个人总结
2015/03/03 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS