Python 我的SPSA(同步扰动随机逼近优化器)实现有什么问题?
下面是我为多项式x^4-x^2实现SPSA优化的尝试。我将代码重新格式化,只对一维有效,但它似乎根本不起作用。我还认识到,SPSA通常在您没有想要最小化的函数时使用;它来自于包含噪音的测量,比如机器人运动。可能是我没有正确使用np.random.binomial吗?我使用这个网站的伪代码来尝试并实现它。对不起,我不习惯使用代码阻塞。请随时提出其他建议,我可以如何改进它。谢谢你抽出时间Python 我的SPSA(同步扰动随机逼近优化器)实现有什么问题?,python,optimization,stochastic,Python,Optimization,Stochastic,下面是我为多项式x^4-x^2实现SPSA优化的尝试。我将代码重新格式化,只对一维有效,但它似乎根本不起作用。我还认识到,SPSA通常在您没有想要最小化的函数时使用;它来自于包含噪音的测量,比如机器人运动。可能是我没有正确使用np.random.binomial吗?我使用这个网站的伪代码来尝试并实现它。对不起,我不习惯使用代码阻塞。请随时提出其他建议,我可以如何改进它。谢谢你抽出时间 import numpy as np def SPSA(α、γ、低α、A、c、迭代次数、θ): dimens
import numpy as np
def SPSA(α、γ、低α、A、c、迭代次数、θ):
dimension=len(θ)
ppar=[1,0,-1,0,0]
p=np.poly1d(ppar)
#声明向量函数量
梯度=np.零(尺寸)
增量=np.零(尺寸)
delta=np.随机二项(3.4,维数)
如果增量==0:
打印('错误增量')
其他:
打印('这是我们的增量')
打印(增量)
#变量迭代时的简单循环实现
i=0
而我
我将代码重新格式化,只对一维有效,但它似乎根本不起作用
原因必须是无条件的返回梯度θ,p(θ)
,它总是在第一次迭代中存在。也许您更希望在此处编写print(…)
,并在函数末尾返回…
ppar = [1,0, -1, 0, 0]
p = np.poly1d(ppar)
# declare vector function quantities
gradient=np.zeros(dimension)
delta=np.zeros(dimension)
delta=np.random.binomial(3,.4, dimension)
if delta==0:
print('error delta')
else:
print('this is our delta')
print(delta)
# simple for loop implementation as variables iterate
i=0
while i<=iterations:
ak=lowa/np.power(i+1+A,alpha)
ck=c/np.power(i+1,gamma)
thetaplus=theta+ck*delta
thetaminus=theta-ck*delta
yplus=p(thetaplus)
yminus=p(thetaminus)
gradient=yplus-yminus/(2*ck*delta)
theta=theta-ak*gradient
print('graident, theta and F(theta)')
return gradient,theta, p(theta)
i+=1
if gradient==0:
print('gradient is zero')`