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
在上面我们可以看到相同的向量我们有不同的规范?为什么会这样?
答案 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属性来验证这一点。