gpt4 book ai didi

java - 归一化双 vector 不是单位长度到机器精度

转载 作者:行者123 更新时间:2023-11-29 05:34:10 24 4
gpt4 key购买 nike

我有一个 Java 应用程序,它使用由 double 构成的高维 vector 。它通过将 vector 分量乘以欧几里德范数的倒数来归一化这些 vector 。有时,生成的 vector 的范数不等于机器精度的 1。发生这种情况并不让我感到惊讶。

我的问题是:如何规范化 vector ,使生成的 vector 具有机器精度的单位长度?

这些是我的 Vector 类计算范数和归一化 vector 的方法:

public double getFrobeniusNorm() {
return Math.sqrt(getFrobeniusNormSquared());
}

public double getFrobeniusNormSquared() {
double normSquared = 0.0;
int numberOfRows = getRowDimension();
int numberOfColumns = getColumnDimension();
for(int i = 0; i < numberOfRows; ++i) {
for(int j = 0; j < numberOfColumns; ++j) {
double matrixElement = get(i,j);
normSquared += matrixElement*matrixElement;
}
}
return normSquared;
}

public void normalize() {
double norm = getFrobeniusNorm();
if (norm == 0) {
throw new ArithmeticException("Cannot get a unit vector from the zero vector.");
} else {
double oneOverNorm = 1.0 / norm;
multiplyEquals(oneOverNorm);
}
}

由于这是 Java,我不能使用特定于操作系统和处理器的技术,否则这似乎是一个标准的浮点算法问题。

我可以使用 Kahan 求和和/或除掉最大分量来改进范数计算,但归一化和计算范数之间的一致性才是真正的问题。范数比方向更重要,所以我认为这是在范数为 1 到机器精度的约束下找到方向上最接近原始 vector 的浮点 vector 。就我的目的而言,原始 vector 是精确的。

假设原始 vector 是u。我调用 u.normalize()。然后,如果我计算 Math.abs(u.getFrobeniusNorm()-1d,在某些情况下,结果是数百个 ulp。这就是问题所在。我可以接受 vector 范数有错误。我只想对 vector 进行归一化,使由 u.getFrobeniusNorm() 计算的范数 为 1 到最小可能的 ulps。改进 u.getFrobeniusNorm() 有道理,但我认为这并不能解决一致性问题。

最佳答案

很简单:无法满足您的要求 - 假设任何可以想象的 vector 都可能,它不可能以小于 无限 的任何精度得到满足。

您可以合理地接近 1.0,这在大多数情况下应该足够好(它应该已经包含在您的代码中)。

如果事实证明对于您的情况而言准确度太小,您需要进行错误分析(既然您首先提出问题,请让有经验的人为您做错误分析 - 这会花钱)。

这里解释了浮点精度背后的基础知识:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (每个计算机科学家都应该知道的关于 float 的知识)

关于java - 归一化双 vector 不是单位长度到机器精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20078921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com