Прогнозирование функции синуса с помощью NN - PullRequest
0 голосов
/ 24 января 2019

Я знаю, что уже есть много сообщений о предсказании функции синуса, но я думаю, что у меня все по-другому.Также я новичок в нейронных сетях, поэтому.

Мне интересно, чтобы 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, похоже, не было никакого смысла добавлять этот дополнительный поворот.

...