Я знаю, что уже есть много сообщений о предсказании функции синуса, но я думаю, что у меня все по-другому.Также я новичок в нейронных сетях, поэтому.
Мне интересно, чтобы NN предсказывал следующее значение в последовательности sin (x_i), учитывая предыдущие n (points_in) значения x_i и sin (x_i).
Я подумал, что NN может узнать, что sin (x) - это решение y '' + y = 0.Используя методы конечных разностей для n = 2, решение будет тогда y [i] = (-y [-2 + i] + 2 y [-1 + i]) / (1 + dx ^ 2).Существует аналогичное решение, использующее метод конечных разностей для n = 4 (хотя коэффициенты являются более грязными), и это должно иметь значительно меньшую ошибку (~ dx ^ 2).Тем не менее, когда я бегу за points_in = 2 и points_in = 4, первое дает меньшую ошибку, хотя они имеют одинаковый порядок величины.Также я считаю, что обе ошибки от NN больше, чем этот метод конечных разностей.
Есть ли какой-то гиперпараметр, который я могу настроить так, чтобы NN работал лучше, или я совершил какую-то глупую ошибку?
from sklearn.neural_network import MLPRegressor
import numpy as np
examples = 10000
points_in = 4
divisor = 10
np.random.seed(1)
X1 = np.zeros((examples,points_in*2))
Y1= np.zeros((examples,1))
for i in range(examples):
rand = 2*np.random.rand()-1
X1_temp = np.arange(points_in).reshape(-1, 1)/divisor+rand
X2_temp = .5*np.sin(2 * np.pi * X1_temp).ravel()
X2_temp = X2_temp.reshape((points_in,1))
temp = np.concatenate((X1_temp,X2_temp)).reshape((points_in*2,))
X1[i,:] = temp
Y1_temp = (np.arange(1).reshape(-1, 1)+points_in)/divisor+rand
Y2_temp = .5*np.sin(2 * np.pi * Y1_temp).ravel()
Y2_temp = Y2_temp.reshape((1,))
Y1[i,:] = Y2_temp
Y1_X[i,:] = Y1_temp.reshape((1,))
Y1=Y1.reshape((examples,))
nn = MLPRegressor(hidden_layer_sizes=(3), activation='tanh', solver='lbfgs',alpha = 0)
n = nn.fit(X1, Y1)
k_1 = (nn.predict(X1)-Y1)**2/examples
print(k_1.sum())
В сторону: Ни один из методов конечных разностей не заботится о x.Я надеялся, что NN сможет выучить функцию 1 / (1+ (x [i-1] -x [i-2]) ^ 2) и сможет работать для любого dx.Однако, поскольку NN не решил проблему для фиксированного dx, похоже, не было никакого смысла добавлять этот дополнительный поворот.