python numpy逆_关于python:为什么numpy和scipy中的矩阵求逆函数对于大的二次矩阵返回不同的结果?...
可以说我定义了一个大的二次矩阵(例如150x150)。 一次它是一个numpy数组(矩阵A),一次是scipy稀疏数组(矩阵B)。
1
2
3
4
5
6
7
8
9
10
11
12import numpy as np
import scipy as sp
from scipy.sparse.linalg import spsolve
size = 150
A = np.zeros((size, size))
length = 1000
# Set some random numbers at random places
A[np.random.randint(0, size, (2, length)).tolist()] = \
np.random.randint(0, size, (length, ))
B = sp.sparse.csc_matrix(A)
现在,我计算两个矩阵的逆。 对于矩阵B,我使用两种方法来计算逆(sp.sparse.linalg.inv和spsolve)。
1
2
3
4
5epsilon = 10.**-8 # Is needed to prevent singularity of each matrix
inv_A = np.linalg.pinv(A+np.eye(size)*epsilon)
inv_B = sp.sparse.linalg.inv(B+sp.sparse.identity(size)*epsilon)
inv_B2 = spsolve(B+sp.sparse.identity(size)*epsilon, sp.sparse.identity(size))
为了检查A和B的两个逆数是否相等,我将求和的平方差相加。
1
2
3
4
5# Is not equal zero, question: Why?
# Sometimes very small (~+-10**-27), sometimes very big (~+-10**5)
print("np.sum((inv_A - inv_B)**2): {}".format(np.sum((inv_A - inv_B)**2)))
# Should be zero
print("np.sum((inv_B - inv_B2)**2): {}".format(np.sum((inv_B - inv_B2)**2)))
问题是这样的:如果我使用小的矩阵,例如 10x10,numpy作为scipy逆函数之间的误差很小(大约?+ -10 **-32)。 但是我需要大型矩阵(例如500x500)的稀疏版本。
我在这里做错了吗,还是有可能在python中计算稀疏矩阵的正确逆?
相对误差有多大?
您是说我的问题可能存在的相对误差,还是两个矩阵之间的相对误差?
我的意思是,您计算出的误差除以您要比较的两个反函数之一的平方欧几里德长度。
np.allclose是检查浮点相等性的便捷工具。
对于10x10矩阵,我得到例如100次,对于np.allclose始终为True。对于150x150,有时为True,有时为False。对于较大的像素(如200x200),它可能会返回更多的False而不是True。
实际上,一个可能的问题是您的矩阵在构造上几乎是奇异的。我想,反转几乎是奇异的矩阵会使该算法非常困难。通常,在这种情况下,与"正常"操作数相比,机器运算中不可避免的微小误差会更容易累积和爆发。您为什么不尝试一个表现更好的示例?
我上传了一张矩阵图片pl.vc/1crz9p。在此图片中,蓝色代表值-2,红色阴影为+ 4,+ 6,+ 8。可以看到,它是一个非常对角的矩阵。另外,当我用numpy计算逆时,也没有问题。矩阵是不可逆的。
您对这些解释满意吗?
您的回答对我来说很有意义(也让我很高兴)。但是我真的无法理解,为什么numpy反演比from scipy更好或更精确(对我而言这没有任何意义)。
您怎么知道哪个更精确?你把它们相乘了吗?像A A ^ -1或A ^ -1 A?
标题问题的答案是:由于不幸选择了示例矩阵。 让我详细说明。
机器精度是有限的,因此浮点运算很少会100%准确。 你试一试
1
2>>> np.linspace(0, 0.9, 10)[1:] == np.linspace(0.1, 1, 10)[:-1]
array([ True, True, True, True, True, False, True, True, True], dtype=bool)
通常,这没有问题,因为错误太小而无法察觉。
但是,对于许多计算而言,有些输入难以处理,并且可能会过度拉伸数值算法。 这当然适用于矩阵求逆,并且您很不幸无法选择如此困难的输入。
实际上,您可以通过查看矩阵的奇异值来检查矩阵是否可能处于"病态"状态。 以下是您的脚本生成的几个矩阵的矩阵条件编号(size=200;行为良好的矩阵的值更接近于1)
1
2
3
4
5
6
7
8
9971899214237.0
5.0134186641e+12
36848.0807109
958492416768.0
1.66615247737e+16
1.42435766189e+12
1954.62614384
2.35259324603e+12
5.58292606978e+12
切换到行为良好的矩阵,您的结果应该会大大改善。
python numpy逆_关于python:为什么numpy和scipy中的矩阵求逆函数对于大的二次矩阵返回不同的结果?...相关推荐
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python阈值分割_根据阈值分割numpy数组的更快方法
X[~Z]比X[Z==0]快:In [13]: import numpy as np In [14]: X = np.random.random_integers(0, 1000, size=1000 ...
- python没有模块_关于python如果没有numpy模块如何处理
1.在python中,你在python的shell输入>>>import numpy 但是编译器告诉你没有numpy库,这时候你就要导入python库,那么如何导入呢 2.收下访问h ...
- python集群_使用Python集群文档
python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...
- python机器学习预测_使用Python和机器学习预测未来的股市趋势
python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...
- python行业中性_用Python分析指数: 11月16日热门指数Z值表
衡量市场,指数高低是一个难题! 价值投资者很难知道,现在是高估,还是低估? 买的是便宜还是,贵了? 应该现在买/卖,还是再等等? 针对这个问题,我在网上看到了一些量化的处理方法.例如:平均数法,中位数 ...
- 使用python预测基金_使用python先知3 1创建预测
使用python预测基金 This tutorial was created to democratize data science for business users (i.e., minimiz ...
- python数字识别_利用Python进行数字识别
思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...
最新文章
- 步步为营-44-窗体之间传值--观察者模式
- 全面理解java异常机制
- 搭建流媒体服务器(1)
- python作业6月14日
- 东芝移动硬盘驱动_传输数据不用等,高速移动硬盘数据线畅享快传体验
- code换取微信openid_JSamp;微信_微信授权
- 2019.7.25锻炼逻辑思维9道题。
- 朝鲜 APT37被指发动软件供应链攻击,瞄准股票投资人
- mysql文档 主从_Mysql主从文档
- FFTW3在VS环境下的安装(亲测)
- mysql搭建及数据迁移教程
- IIS5 IIS6 IIS7区别
- 初中七年级上计算机试题答案,初中信息技术考试试题(含答案).docx
- 家里的无线网最近总是网速不稳定,一阵一阵的卡,是怎么回事?
- docker批量导出导入本地镜像
- 面经手册 · 第1篇《认知自己的技术栈盲区》
- 将禾赛激光雷达在rviz中采集的点云保存成pcd格式
- SimpleDateFormat大写Y和小写y的区别
- python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...
- 人物渲染篇(一) —— 基础卡通渲染 上