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

Posted

技术标签:

【中文标题】同一向量的归一化在两种情况下给出不同的值?【英文标题】:normalization of the same vector gives different values at two cases? 【发布时间】:2013-04-09 13:17:16 【问题描述】:
 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

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

【问题讨论】:

向量的dtypes 是什么? (r_capr.T == a.T).all() 是真的吗?矢量可能会略有不同,但会以四舍五入方式打印。 您可以通过比较r_capr.view(np.uint8)a.view(np.uint8) 来检查您的两个向量是否完全相同,而不仅仅是非常接近。与返回类似,请尝试查看 np.linalg.norm(a.T).reshape(1).view(np.uint8)np.linalg.norm(r_capr.T).reshape(1).view(np.uint8) 他们是ndarray。我通过等同于 a 得到 r_cap。 如果其中一个数组的 dtypes 是 float32,则dtype=float32 将包含在输出中。除非输出已被编辑,否则 r_capra 似乎都是 float64。 (当类型为 float64 时,numpy ndarray 的 repr 不显示 dtype 值。)另一方面,看起来 ipython 会话已被编辑(In [...] 提示在哪里?),那么谁知道... 【参考方案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 属性来验证这一点。

【讨论】:

这不能回答问题。机器不精确,但具有确定性。向量之间必须存在特定差异,结果才会不同。

以上是关于同一向量的归一化在两种情况下给出不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

数据归一化和两种常用的归一化方法

数据归一化和两种常用的归一化方法

数据归一化和两种常用的归一化方法

matlab中啥叫归一化坐标

数据归一化的两种常用方法

关于用matlab进行向量归一化的问题