我知道已经有很多关于预测正弦函数的文章,但是我认为我的观点有所不同。我也是神经网络的新手。
在给定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的问题,因此增加这种额外扭曲似乎没有任何意义。