使用NumPy矩阵运算结果不一致

ML饭 2020-01-07 10:57:19
两矩阵,直接点积运算之后抽取一行,与先从矩阵抽出一行再进行点积运算结果不同。

代码:
X = np.random.randn(50, 1000)
Y = X[0]
W = np.random.randn(1000, 10)
A = X.dot(W)
B = Y.dot(W)

测试:
B == A[0]
结果:
array([ True, False, False, False, False, False, False, False, False, False])

测试:
Y.dot(W) - X.dot(W)[0]
结果:
array([ 0.00000000e+00, -6.66133815e-15, 2.22044605e-14, 1.06581410e-14,
8.88178420e-15, -2.30926389e-14, 2.84217094e-14, -3.28626015e-14,
-4.48530102e-14, 3.90798505e-14])

这个结果是否正确?是否能得到相同的结果?

环境:Windows10,Python3.7, NumPy1.17.4

谢谢。

...全文
537 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ML饭 2020-11-04
  • 打赏
  • 举报
回复
引用 7 楼 欢乐的小猪的回复:
这就涉及浮点数在计算机中是如何表示的了。 一般float32位,1个符号位,8个指数位,小数位23个。所以它的精度是2的23次幂,=8,388,608,即6~7位。 double64位,1符号位,11指数位,52小数位。所以它的精度是2的52次幂,=4,503,599,627,370,496,即15~16位, 所以一般使用1e-6的误差来判断浮点数是否相等。
多谢。解释非常清楚。
庸了个白 2020-11-03
  • 打赏
  • 举报
回复
我这里回一下吧,我这也差不多,A[0] 和 B 的数据主要差异在小数点后的14位左右,图就不贴了,你可以多试几次,观察 T 和 F的位置。 造成这个误差的原因可能是样本量,像2楼的,样本量比较小,我尝试了很多次都能得到 T。但是样本量变大后就有误差了。 使用 while 循环,观察cpu使用情况,cpu占用不多。个人看法,跟环境不一定有关。可以去查查numpy的实现或者限制样本量分批计算
欢乐的小猪 2020-11-03
  • 打赏
  • 举报
回复
这就涉及浮点数在计算机中是如何表示的了。 一般float32位,1个符号位,8个指数位,小数位23个。所以它的精度是2的23次幂,=8,388,608,即6~7位。 double64位,1符号位,11指数位,52小数位。所以它的精度是2的52次幂,=4,503,599,627,370,496,即15~16位, 所以一般使用1e-6的误差来判断浮点数是否相等。
ML饭 2020-11-03
  • 打赏
  • 举报
回复
感谢各位。我大概理解了。应该是浮点数表示的方法,导致无法精确到毫厘。这么说也不对。1e-7已经远比毫厘要精确了。请问@欢乐的小猪:1e-7是经验值,还是有相关的严格推导
欢乐的小猪 2020-11-03
  • 打赏
  • 举报
回复
感觉浮点数比较不能用等号吧。 这里如果误差在1e-7内就算是相等的。输出就是[ True True True True True True True True True True]
import numpy as np
X = np.random.randn(50, 1000)
Y = X[0]
W = np.random.randn(1000, 10)
A = X.dot(W)
B = Y.dot(W)
print((B -A[0])<1e-7)
ML饭 2020-11-02
  • 打赏
  • 举报
回复
环境相同吗? -------------- 环境:Windows10,Python3.7, NumPy1.17.4
shasha483 2020-01-08
  • 打赏
  • 举报
回复
兄弟,我测试了一下,你的结果不对啊,我用你的代码得到的结果是这样的,环境和你的一样:
[ True True True True True True True True True True]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import numpy as np

X = np.random.randn(5, 10)
print("X------",X)
Y = X[0]
print("Y------",Y)
W = np.random.randn(10, 10)
print("W------",W)
A = X.dot(W)
B = Y.dot(W)

# print("A----",A)
# print("B----",B)

# 测试:
print(B == A[0])
# 结果:
# array([ True, False, False, False, False, False, False, False, False, False])

print("--"*20)
# 测试:
print(Y.dot(W) - X.dot(W)[0])
# 结果:
# array([ 0.00000000e+00, -6.66133815e-15, 2.22044605e-14, 1.06581410e-14,
# 8.88178420e-15, -2.30926389e-14, 2.84217094e-14, -3.28626015e-14,
# -4.48530102e-14, 3.90798505e-14])

# 这个结果是否正确?是否能得到相同的结果?

37,709

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧