Пример успеха алгоритма spsa

алгоритм

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[2я]-57,2) вернуть fval для k в диапазоне (0, n): #Сгенерировать последовательность ak, размер шага итерации ak=a/np.power(k+1+A,Альфа)

Сгенерировать последовательность 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 min=',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', размер шрифта=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 change', fontproperties='SimHei', размер шрифта=18) plt.xlabel('Шаги поиска',fontproperties='SimHei',fontsize=18) для i в диапазоне (0, len (theta_ [0])): х=[] для j в диапазоне (0, len (theta_)): x.append(theta_[j][i]) plt.plot(x)