2
 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

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

4

1 回答 1

-1

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

同样使用 dot(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 属性来验证这一点。

于 2013-04-16T23:23:21.710 回答