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
在上面我们可以看到对于同一个向量我们有不同的范数?为什么会这样?
机器不是 100% 精确的数字,因为它们以有限的精度存储(取决于体系结构,它可能是 16 到 128 位 float )所以非常精确的数字,例如接近 float 的限制尾数更容易出错。考虑到机器精度误差,您可以放心地假设这些数字实际上是相同的。在计算范数时,缩放或以其他方式修改您的数字以获得不易出错的结果可能更有意义。
同时使用 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 属性来验证这一点。
我是一名优秀的程序员,十分优秀!