0

我正在尝试转换本文提出的数学:

http://www.bouncingchairs.net/pskalman-lategecco.pdf

大约第 3 页向前进入工作代码。算法本身在第 6 页左右给出,但我不会说希腊语或数学;所以暂时我被困住了。

如果我理解代码,它应该像这样运行:

    vt = particle velocity, 1d array
    vbest = best particle velocity 1d array
    v_prime = 1d storage array
    v_hat = 1d storage array

    alpha = 0.45
    sigma = 0.60

    denom = float
    denom_best = float

准备:

for(int i = 0; i < vt.length; i++)
{
     denom += vt[i] ^ 2
     denom_best += vbest[i] ^ 2
}
denom = denom ^ (1/2)
denom_best = denom_best ^ (1/2)

等式 7:

for(int i = 0; i < vt.length; i++)
{
v_prime[i] = alpha * (vt[i]/denom) + (1 - alpha) * (vbest[i]/denom_best)
}

公式 8:

for(int i = 0; i < vt.length; i++)
{ 
 v_hat[i] = Rand_Gauss(v_prime[i], sigma) //gaussian random number with 
                                          //v_prime[i] average, and sigma StDev
}

等式 9:

for(int i = 0; i < vt.length; i++)
{
vt[i] = (alpha * denom + (1 - alpha) * denom_best) * v_hat[i]
}

这甚至接近数学所说的吗?

提前致谢,-JW

4

1 回答 1

0

我认为您可能会错过对“规范(...)”的调用。对向量进行归一化只是将向量的每个分量除以长度。在等式 9 中,他们计算了 vt 和 vbest 长度的加权和,并将该平均长度乘以范数(vbar)。你只是直接将它乘以 vbar 。

该等式背后的意图似乎是创建一个新向量 v_{t+1},其长度是 vt 和 vbest 的平均长度。但是,vhat 可以是任何长度,所以大多数时候等式 9 中的乘法不会给你正确的答案,除非你强制 vhat 向量的长度正好是 1。这就是向量范数的作用。

范数只是向量的分量除以长度。因此,将等式 9 的代码替换为以下内容:

vtlen=0
for(int i=0; i<vt.length; i++)
{
    vtlen+=vt[i]*vt[i];
}
vtlen=sqrt(vtlen);
for(int i=0; i<vt.length; i++)
{
    vt[i] = (alpha * denom + (1 - alpha) * denom_best) * (v_hat[i] / vtlen);
}

您还忽略了公式 7 中的范数运算。我没有阅读论文,但这里可能不是绝对必要的,因为权重总和为 1 并且向量已经归一化。我必须花更多的时间来说服自己以一种或另一种方式,但继续对计算出的 v' 向量进行归一化肯定不会有什么坏处。

于 2011-05-01T02:53:52.067 回答