Python numpy 浮点数精度问题
Python numpy 浮点数精度问题
在复现FP(fictitious play, Iterative solution of games by fictitious play-page393)算法的时候,迭代到中间发现没法复现paper里的结果,发现是numpy矩阵运算浮点数精度的问题。
- 具体问题
矩阵和向量相乘
3 & 1 & 1 & 1
\end{pmatrix}
\times \begin{pmatrix}
3 & 1.1 & 1.2 \\
1.3 & 2 & 0 \\
0 & 1 & 3.1 \\
2 & 1.5 & 1.1
\end{pmatrix}
= \begin{pmatrix}
12.3 & 7.8 & 7.8
\end{pmatrix}
\]
然后取argmin想得到第一个7.8的index,也就是1。但由于精度的问题,导致两个7.8实际不一样大,取到了第二个7.8的index。
具体问题代码为
import numpy as np
x = np.matrix([3,1,1,1])*np.matrix([[3,1.1,1.2],[1.3,2,0],[0,1,3.1],[2,1.5,1.1]])
print('matrix: ',x)
print('value: ',x[0,0],x[0,1],x[0,2])
print('index: ',np.argmin(x))
得到
matrix: [[12.3 7.8 7.8]]
value: 12.3 7.800000000000001 7.799999999999999
index: 2
可以发现明明相同的两个7.8由于精度变成了两个大小不同的数,所以argmin得到了2。
- 解决办法
二进制固有的问题,只能自己手动近似,用保留小数点位数消除误差。
如这里保留5位小数:
import numpy as np
x = np.round(np.matrix([3,1,1,1])*np.matrix([[3,1.1,1.2],[1.3,2,0],[0,1,3.1],[2,1.5,1.1]]),5)
print('matrix: ',x)
print('value: ',x[0,0],x[0,1],x[0,2])
print('index: ',np.argmin(x))
得到
matrix: [[12.3 7.8 7.8]]
value: 12.3 7.8 7.8
index: 1
- 注意事项
这个办法不能解决所有问题,毕竟每个问题精度要求不一样。但由于计算机二进制的原因,没法从根本上解决,只能通过近似的方式,具体问题具体解决。
Python numpy 浮点数精度问题的更多相关文章
- 用decimal模块增加python的浮点数精度
浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里 ...
- Python中浮点数精度处理
Python中,浮点数运算,经常会碰到如下情况: 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确.比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:0.0001 ...
- Python的浮点数损失精度问题
本篇讨论的现象可以从下面这段脚本体现出来: >>> x = 0.0 >>> for i in range(10): x += 0.1 print(x) 0.1 0. ...
- Python之☞float浮点数精度问题
Python的浮点数损失精度问题(转) 一个简单的面试题: >>>0.1+0.1+0.1 0.2 >>>0.1+0.1+0.1 0.3000000000000000 ...
- Python numpy中矩阵的用法总结
关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...
- Python NumPy学习总结
一.NumPy简介 其官网是:http://www.numpy.org/ NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Num ...
- mingw fbx sdk /浮点数精度
接下来要做一个linux下的程序了. 下载linux version fbx sdk tar zxvf ...gz 按照安装说明 提升权限并没什么用 还是,cannot execute bin ...
- Python/Numpy大数据编程经验
Python/Numpy大数据编程经验 1.边处理边保存数据,不要处理完了一次性保存.不然程序跑了几小时甚至几天后挂了,就啥也没有了.即使部分结果不能实用,也可以分析程序流程的问题或者数据的特点. ...
- 在python&numpy中切片(slice)
在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...
随机推荐
- [ C++ ] set_new_handler解析
当 operator new 中malloc返回值为0(NULL)时,表示分配内存失败(可能是因为内存不足), 此时会通过_callnewh()调用用户通过set_new_handler()设定的ne ...
- disruptor架构三 使用场景更加复杂的场景
先c1和c2并行消费生产者产生的数据,然后c3再消费该数据 我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实 ...
- webpack4.X + react搭建
环境准备工作:windows7.webStorm 2017.1.4.Nodejs 8.7.0.npm 5.4.2 PS:安装的时我们都带上版本,这样即便webpack版本发生变化,也不会出现版本问题. ...
- spring引用hibernate映射文件的四种方式
1.mappingResources 2.mappingLocations 3.mappingDirectoryLocations 4.mappingJarLocations 四种方式:https:/ ...
- Syntax error, insert "}" to complete MethodBody
jsp中代码在Eclipse中打开正常,导入项目导入MyEclipse后显示如下异常: Syntax error, insert "}" to complete MethodBod ...
- NPOI 操作数据库中数据的导入导出(Excel.xls文件) 和null数据的处理。
App.config: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...
- C# 自定义常用代码段快捷键
不断更新中... 分享地址:http://pan.baidu.com/s/15oE0X
- 灵魂代码分享HTML元素标签语义化及使用场景实用到爆
灵魂三问: 标签语义化是什么?为什么要标签语义化?标签语义化使用场景有哪些? 下面让我们跟着这三个问题来展开一下本文的内容. 一.标签语义化是什么? 标签语义化就是让元素标签做适当的事情.例如 p 标 ...
- Java实现第十一届蓝桥杯JavaB组 省赛真题
试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 1921,其中 ...
- [Mybatis]Mybatis常用操作
Mybatis是目前国内比较流行的ORM框架,特点是可以写灵活的SQL语句,非常适合中小企业的面向数据库开发. 本文总结自己开发过程中常用的Mybatis操作. 一.插入操作 主键自增插入单条 < ...