同一向量的归一化在两种情况下给出不同的值?

2024-10-03 15:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

 r_capr
Out[148]: array([[-0.42300825,  0.90516059,  0.04181294]])

 r_capr
 np.linalg.norm(r_capr.T)
Out[149]: 0.99999999760432712

 a.T
Out[150]: array([[-0.42300825,  0.90516059,  0.04181294]])

 a.T
 np.linalg.norm(a.T)
Out[151]: 1.0

在上面我们可以看到对于同一个向量我们有不同的范数?为什么会这样?你知道吗


Tags: 范数normnpoutarray向量linalgcapr
1条回答
网友
1楼 · 发布于 2024-10-03 15:27:55

机器不是100%精确的数字,因为它们是以有限的精度存储的(取决于体系结构,它可能是16到128位浮点),所以非常精确的数字,例如接近浮点尾数的极限,更容易出错。考虑到机器精度误差,您可以放心地假设这些数字实际上是相同的。在计算标准值时,缩放或修改数值以获得不易出错的结果可能更有意义。你知道吗

此外,使用点(x,x)代替l2范数可以更精确,因为它避免了平方根。你知道吗

有关更好的讨论,请参见http://en.wikipedia.org/wiki/Machine_epsilon,因为这实际上是一个相当复杂的主题。你知道吗

精确的错误是由机器错误引起的,但由于向量实际上并不相等(您显示的是两个逻辑上等价的向量,但它们的内部表示形式将不同),因此范数的计算可能是用不同的精度数字处理的。你知道吗

看这个:

a = mat('-0.42300825 ; 0.90516059 ; 0.04181294', np.float32)
r = mat('-0.42300825 ; 0.90516059 ; 0.04181294', np.float64)
print linalg.norm(a)
print linalg.norm(r)

并比较结果。它将得到你看到的确切结果。也可以通过检查矩阵的dtype属性来验证这一点。你知道吗

相关问题 更多 >