Java 规范化iterable类型,以使输出为浮点的iterable,其和为1

Java 规范化iterable类型,以使输出为浮点的iterable,其和为1,java,python,floating-point,Java,Python,Floating Point,好, 我遇到了一个舍入误差问题。我有一个java程序,可以逐行读取列表和一些数字。程序要求此列表为浮点数(什么类型的浮点数?我怀疑是单精度的),其总和S介于.999和1.001之间(即.999需要ord=1关键字arg来实现您的期望。使用您当前的数据和定义 >>> Normalize(substitution_points).sum() 9.0451896403987444 您可以这样做——这也可以正确地缩放负值(linalg.norm对值的abs求和): 0.999999…

好,

我遇到了一个舍入误差问题。我有一个java程序,可以逐行读取列表和一些数字。程序要求此列表为浮点数(什么类型的浮点数?我怀疑是单精度的),其总和S介于.999和1.001之间(即.999需要
ord=1
关键字arg来实现您的期望。使用您当前的数据和定义

>>> Normalize(substitution_points).sum()
9.0451896403987444
您可以这样做——这也可以正确地缩放负值(
linalg.norm
对值的
abs
求和):

0.999999…>0.999
,因此根据您提供的规范,它应该可以工作

但是…它似乎仍然不起作用。请尝试使用
numpy.float16
——注意,创建浮点数组的更惯用方法如下:

array([ 0.,  1.,  2.,  3.,  4.], dtype=float32)

如果您只需要精确到小数点后三位,为什么不将值乘以1000,用整数进行所有运算,只在输出中添加小数点?这样可以很容易地确保总和是精确的。

您的规范化方法不会强制列表的总和为1:除以范数将范数设置为1.要将总数设置为1,需要除以当前总数:

def normalize(X):
   total = sum(X)
   return [x/total for x in X]

哎呀,我本来想让Norm=linalg.Norm(NumpyX,ord=1)@torrho,哦。这是不是意味着简单的除法对你不起作用?或者这只是你示例代码中的一个输入错误?(我没想到你可能用
linalg.Norm
来计算曼哈顿距离。)打字错误不是问题所在。我也尝试过使用float32。我想知道这是否是问题所在?也许是其他问题?任何想法,或者,如果这不起作用,那么正如@Ignacio Vazquez Abrams在他删除的帖子中所说,“唯一真正的解决方法是对规范化值求和,将差值添加到最后一个元素,然后交叉手指。”Ignacio,您可能应该取消删除!好的,我将尝试float16。如果失败,我将尝试将差异添加到向量的第一个元素(对于我的模型,这样更好)我不知道是谁拒绝删除答案,但这真的很烦人!我非常感谢所有建议。如果能将所有建议都作为参考,那就太好了。我想感谢serndele(我想那是他的名字)的建议,Daniel Pryden,以及其他人(Ivan???)的评论
>>> Normalize(substitution_points).sum()
9.0451896403987444
>>> def normalize(x):
...     a = numpy.array(x)
...     return a / a.sum()
... 
>>> normalize(substitution_points).sum()
0.99999999999999789
array([ 0.,  1.,  2.,  3.,  4.], dtype=float32)
def normalize(X):
   total = sum(X)
   return [x/total for x in X]