Я сделал код, который, учитывая два набора Ax и Ay, возвращает синусоидальную функцию K + H sin (a x), которая лучше всего подходит для графика Ax X Ay. Для тестирования я позволю Ax X быть точной синусоидальной функцией и посмотреть, предсказывает ли программа все переменные. Однако я не могу допустить, чтобы такие переменные, как my_range, kr, Hr и ar, были слишком большими, потому что это приводит к высокой средней ошибке. Для этого есть ошибка или математическое объяснение?
код:
import numpy as np
from math import *
from random import *
my_range = pi/2
Ax = np.arange(0,my_range, 0.01)
kr=2
Hr=2
ar=2
Ay = kr+ Hr*np.sin(ar*Ax)
k= random()*2 -1
H = random()*2 -1
a= random()*2 -1
rate = 0.05
for n in range(1,50000):
rand = randint(0, Ax.shape[0]-1)
xi = Ax[rand]
yi= Ay[rand]
o=a*xi
u2=k+H*sin(o)
u =u2-yi
y=u**2
dy_du = 2*u
du2_dH = sin(o)
du2_do = cos(o)
do_da = xi
dy_dk = dy_du
dy_dH=dy_du*du2_dH
dy_da=dy_du*du2_do*do_da
a -= dy_da*rate
k -= dy_dk*rate
H -=dy_dH*rate
# k + H*sin(a*x)
print("y="+str(k)+"+"+str(H)+"*sin("+str(a)+"x"+")")
error_f = Ay- (k+H*np.sin(a*Ax))
average_error = np.average(np.abs(error_f))
print("average error="+str(average_error))
Obs: это код со значениями, с которыми работает регрессия