帮助将数学函数转换为代码:线性卡尔曼粒子群优化
Help Converting Math function into Code : Linear Kalman Particle Swarm Optimization
我正在尝试转换这篇论文中的数学:
http://www.bouncingchairs.net/pskalman-lategecco.pdf在第3页左右转到工作代码中。给出了算法本身大概在第六页,但我不会说希腊语或数学;所以我暂时被困住了。
如果我理解了这段代码,它应该是这样运行的:
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
我想你可能错过了对"norm(…)"的调用。归一化向量就是将向量的每个分量除以长度。在等式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'向量。
相关文章:
- 向量上的线性搜索
- 二叉搜索如何比线性搜索更快?
- 线性丢番图方程 - 求给定区间内的解数和解
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 线性优化目标函数中的绝对值
- 在 Cocos2dx 中初始化粒子效果后的警告 - "libpng warning: iCCP: known incorrect sRGB profile"
- 犰狳C++:带有模量计算的线性组合
- 粒子系统:所有粒子都朝同一方向运动
- C++(线性搜索和排序)
- 一般采用可索引/可调用的线性组合
- C++线性搜索算法,确定数组中元素的数量
- 如何在 c++ 中线性搜索两个数组?
- 生成线性随机整数C++
- 使用本征求解线性方程组
- 在 SEAL 中重新线性化一个密文
- 如何在C++中实现线性探测?
- C++ 本征线性系统求解,数值问题?
- 曼哈顿距离比曼哈顿距离+线性冲突效果更好
- 帮助将数学函数转换为代码:线性卡尔曼粒子群优化