spsa算法成功的一个例子

534 阅读1分钟

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

theta=[10,10,10,10,10,10,10,10,10,10]

a=0.1

c=0.01

A=20

Alpha=0.602

garma=0.101

p=len(theta)

Fval=[]

n=300

theta_=[]

归一化

def normalization(data): _range = np.max(data) - np.min(data) return (data - np.min(data)) / _range def loss(x): N=len(x) fval=0.0 for i in range(0,int(np.floor(N/2))): fval=fval+56np.power(np.power(x[2i],2)-x[2i+1],2)+np.power(x[2i]-57,2) return fval for k in range(0,n): #产生序列ak,迭代步长 ak=a/np.power(k+1+A,Alpha)

产生序列ck,扰动步长

ck=c/np.power((k+1),garma)   

同时扰动向量生成,p维随机扰动向量△

delta=2*np.round(np.random.normal(0,1,p))-1

产生损失函数带有扰动策略的两个测量值

thetaplus=theta+ck*delta
thetaminus=theta-ck*delta
yplus=loss(thetaplus)
yminus=loss(thetaminus)
ghat=(yplus-yminus)/(2*ck*delta)
ghat=normalization(ghat)

收敛速度太慢,加一个系数,适当就好,太大容易越过极小值

theta=theta-14*ak*ghat
theta_.append(theta)

这里可以加一个判断,不加也可以,需要调整迭代步长

Fval.append(loss(theta))

print('y最小值=',np.min(Fval)) print('y最小时,x的值=',theta) plt.figure(figsize=(15,5)) plt.subplot(1,2,1) plt.title('y值变化规律',fontproperties='SimHei',fontsize=20) plt.ylabel('y变化',fontproperties='SimHei',fontsize=18) plt.xlabel('搜索步数',fontproperties='SimHei',fontsize=18) plt.plot(Fval,label='y') plt.subplot(1,2,2) plt.title('x值变化规律',fontproperties='SimHei',fontsize=20) plt.ylabel('x变化',fontproperties='SimHei',fontsize=18) plt.xlabel('搜索步数',fontproperties='SimHei',fontsize=18) for i in range(0,len(theta_[0])): x=[] for j in range(0,len(theta_)): x.append(theta_[j][i]) plt.plot(x)