这是我尝试为多项式x ^ 4-x ^ 2实现SPSA优化。我确定我的代码仅适用于1维,但似乎根本不起作用。我也认识到,当您没有要最小化的功能时,通常会使用SPSA。它来自诸如机器人运动之类的包含噪声的测量。也许是因为我没有以正确的方式使用np.random.binomial?我使用了来自该网站https://www.jhuapl.edu/SPSA/PDF-SPSA/Matlab-SPSA_Alg.pdf的伪代码来尝试实施它。对不起,我不习惯使用stackoverflow的阻塞代码。请随时提出其他建议,以说明如何改进它。谢谢你的时间。
import numpy as np
def SPSA(alpha,gamma,lowa,A,c,iterations,theta):
dimension=len(theta)
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')`
答案 0 :(得分:0)
我确定我的代码仅适用于1维,但似乎根本不起作用。
其原因必须是无条件的return gradient,theta, p(theta)
,它总是在第一次迭代中退出。也许您宁愿在此写print(…)
,在函数末尾写return …
。