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

时间:2013-04-16 23:17:49

标签: python arrays python-2.7 numpy norm

 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

在上面我们可以看到相同的向量我们有不同的规范?为什么会这样?

1 个答案:

答案 0 :(得分:-1)

机器不是100%精确的数字,因为它们以有限的精度存储(取决于架构,它可能是16到128位浮点)所以数字非常精确,例如接近浮点的极限尾数更容易出错。鉴于机器精度误差,您可以安全地假设这些数字实际上是相同的。在计算规范时,扩展或以其他方式修改数字可能更有意义,以减少容易出错的结果。

同样使用点(x,x)而不是l2范数可以更准确,因为它避免了平方根。

请参阅http://en.wikipedia.org/wiki/Machine_epsilon以获得更好的讨论,因为这实际上是一个相当复杂的主题。

您的确切错误是由机器错误引起的,但由于您的向量实际上并不相等(您显示的是两个逻辑等效的向量,但它们的内部表示形式不同),因此可能正在使用不同的精度数处理该范数的计算。 / p>

见:

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属性来验证这一点。