用NN预测正弦函数

时间:2019-01-24 20:06:02

标签: python data-science

我知道已经有很多关于预测正弦函数的文章,但是我认为我的观点有所不同。我也是神经网络的新手。

在给定x_i和sin(x_i)的前n个(points_in)值的情况下,我希望让NN预测序列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。我希望神经网络能够学习功能1 /(1+(x [i-1] -x [i-2])^ 2)并能够对任何dx工作。但是,由于NN不能解决固定dx的问题,因此增加这种额外扭曲似乎没有任何意义。

0 个答案:

没有答案