1

我正在尝试在无向、循环、加权图上执行一些计算,并且我正在寻找一个好的函数来计算聚合权重。

每条边都有一个在 [1,∞) 范围内的距离值。该算法应该更加重视较低的距离(它应该是单调递减的),并且应该为距离 ∞ 分配值 0。

我的第一直觉是简单的 1/d,它同时满足了这两个要求。(嗯,从技术上讲,1/∞ 是未定义的,但程序员往往比数学家更容易让它滑动。) 1/d 的问题是该函数更关心 1/1 和 1/2 之间的差异比 1/34 和 1/35 之间的差异。我想更清楚一点。我可以使用 √(1/d) 或 ∛(1/d) 甚至 ∜(1/d),但我觉得我错过了一大堆可能性。有什么建议么?

(我想到了 ln(1/d),但随着 d 变为 ∞,它变为 -∞,我想不出将其推至 0 的好方法。)

后来

我忘记了一个要求:w(1) 必须为 1。(这不会使现有答案无效;乘法常数很好。)

4

5 回答 5

2

也许:

exp(-d)

编辑:类似于

exp(k(1-d)), k real

将满足您的额外要求(我相信您知道,但是嘿)。

于 2009-01-26T16:23:22.087 回答
1

1/ln (d + k) 怎么样?

于 2009-01-26T16:25:00.600 回答
1

上面的一些答案是高斯分布的版本,我同意这是一个不错的选择。在自然界中经常可以找到高斯或正态分布。它是一个阶数无穷大的 B-Spline 基函数。

将其用作混合函数的一个缺点是它的无限支持比有限混合函数需要更多的计算。混合物是产品系列的总和。实际上,当下一项小于容差时,求和可能会停止。

如果可能的话,形成一个静态表来保存离散的高斯函数值,因为计算这些值的计算成本很高。如果需要,插入表值。

于 2009-01-27T06:49:33.507 回答
0

这个怎么样?

w ( d ) = (1 + k )/( d + k ) 对于一些大的k

d = 2 + k将是w ( d ) = 1/2的地方

于 2009-01-26T16:58:48.287 回答
0

看来您实际上是在寻找线性减少,类似于无穷大-d。显然这个解决方案是垃圾,但由于您可能没有使用任意精度的数据类型来表示距离,您可以使用 yourDatatype.MaxValue - d 来为此获得线性递减函数。

实际上,您可能会考虑使用 (yourDatatype.MaxValue - d) + 1 您正在使用双打,因为如果您的距离为“无穷大”,您可以将权重分配为 0(因为双打实际上有一个值。)

当然,您仍然需要考虑诸如 w(d) = double.infinity 或 w(d) = integer.MaxValue 之类的实现细节,但如果您知道您正在使用的实际数据类型,这些应该很容易发现;)

于 2009-02-13T21:22:29.747 回答