Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一向量的归一化在两种情况下给出不同的值?_Python_Arrays_Python 2.7_Numpy_Norm - Fatal编程技术网

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

Python 同一向量的归一化在两种情况下给出不同的值?,python,arrays,python-2.7,numpy,norm,Python,Arrays,Python 2.7,Numpy,Norm,在上面我们可以看到,对于相同的向量,我们有不同的范数?为什么会发生这种情况?机器对数字的精度不是100%,因为它们是以有限精度存储的,这取决于体系结构。它可能是16到128位浮点,因此非常精确的数字(例如接近浮点尾数的限值)更容易出错。考虑到机器精度误差,您可以放心地假设这些数字实际上是相同的。当计算标准时,缩放或以其他方式修改数字以获得不易出错的结果可能更有意义 另外,使用dotx,x代替l2范数可以更精确,因为它避免了平方根 请参阅以获得更好的讨论,因为这实际上是一个相当复杂的主题 精确的误

在上面我们可以看到,对于相同的向量,我们有不同的范数?为什么会发生这种情况?

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

另外,使用dotx,x代替l2范数可以更精确,因为它避免了平方根

请参阅以获得更好的讨论,因为这实际上是一个相当复杂的主题

精确的误差是由机器误差引起的,但由于矢量实际上并不相等,因此显示的是两个逻辑等效的矢量,但它们的内部表示形式将不同。范数的计算可能正在以不同的精度数字进行处理

见此:

 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

并比较结果。它将得到你所看到的确切结果。您还可以通过检查矩阵的dtype属性来验证这一点。

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

另外,使用dotx,x代替l2范数可以更精确,因为它避免了平方根

请参阅以获得更好的讨论,因为这实际上是一个相当复杂的主题

精确的误差是由机器误差引起的,但由于矢量实际上并不相等,因此显示的是两个逻辑等效的矢量,但它们的内部表示形式将不同。范数的计算可能正在以不同的精度数字进行处理

见此:

 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

并比较结果。它将得到你所看到的确切结果。您还可以通过检查矩阵的数据类型属性来验证这一点。

向量的数据类型是什么?r_capr.T==a.T.all是真的吗?向量可能稍有不同,但以舍入方式打印。通过比较r_capr.viewnp.uint8和a.viewnp.uint8,可以检查两个向量是否完全相同,而不仅仅是非常接近。与返回类似,请尝试查看np.linalg.norma.T.restrape1.viewnp.uint8和np.linalg.normr_capr.T.restrape1.viewnp.uint8。它们是ndarray。我通过与a相等得到r_cap。如果其中一个数组的数据类型是float32,那么输出中将包括dtype=float32。除非对输出进行了编辑,否则r_capr和a似乎都是浮点64。当类型为float64时,numpy ndarray的repr不显示dtype值。另一方面,看起来ipython会话已经被编辑过,[…]中的提示在哪里?所以谁知道…向量的数据类型是什么?r_capr.T==a.T.都是真的吗?向量可能稍有不同,但以舍入方式打印。通过比较r_capr.viewnp.uint8和a.viewnp.uint8,可以检查两个向量是否完全相同,而不仅仅是非常接近。与返回类似,请尝试查看np.linalg.norma.T.restrape1.viewnp.uint8和np.linalg.normr_capr.T.restrape1.viewnp.uint8。它们是ndarray。我通过与a相等得到r_cap。如果其中一个数组的数据类型是float32,那么输出中将包括dtype=float32。除非对输出进行了编辑,否则r_capr和a似乎都是浮点64。当类型为float64时,numpy ndarray的repr不显示dtype值。另一方面,看起来ipython会话已被编辑,[…]提示中的内容在哪里?谁知道呢…这并没有回答问题。机器是不精确的,但具有确定性。向量之间必须存在特定的差异,结果才会不同。这并不能回答问题。机器是不精确的,但具有确定性。向量之间必须存在特定差异,结果才会不同。