用 Python 预测正弦波

Predict sine wave with Python

我正在尝试使用 MLPRegressor 训练神经网络来预测正弦波的下一个点,查看性能我无法使 R2 高于 0.90,任何帮助将不胜感激!

from sklearn.neural_network import MLPRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np
import pandas as pd

# Create an `np.array` containing a sequence of 10 values of the sine function.
seq = np.array([np.sin(2*np.pi*t/10) for t in range(10)])

#generate 100 pairs of two-point sequences from the values in `seq`.
num_sequences = 100
x_train = np.array([])
y_train = np.array([])
for i in range(num_sequences):
    rand = np.random.randint(10)
    x_train = np.append(x_train, [[seq[rand], seq[np.mod(rand+1, 10)]]])
    y_train = np.append(y_train, seq[np.mod(rand+1, 10)])
    
x_train = np.resize(x_train, (100, 2))

x_test = np.array([seq, np.roll(seq, -1)])
y_test = np.array(np.roll(seq, -2))

x_test = np.reshape(x_test, (-1, 2))


# Place the data in a `pandas` `DataFrame`.

pdata = pd.DataFrame({'x1':x_train[:,0], 'x2':x_train[:,1],'y':y_train})

reg_model = MLPRegressor(hidden_layer_sizes = (64,64,64), activation = "relu", random_state = 2, max_iter = 400)

reg_model.fit(x_train, y_train)
y_pred = reg_model.predict(x_test)

print(' R2 = ', r2_score(y_pred, y_test))
print('MAE = ', mean_absolute_error(y_pred, y_test))
print('MSE = ', mean_squared_error(y_pred, y_test))

您的数据设置不正确。

您可以使用此代码创建正弦波:

sin_wave = np.sin(np.arange(-1000, 1000, 0.1))

然后使用此代码创建用于训练和测试的数据:

input_seq = np.array([sin_wave[x:x+2] for x in range(len(sin_wave)-2)])
output = np.array([sin_wave[x+2] for x in range(len(sin_wave)-2)])

x_train = input_seq[:1500]
y_train = output[:1500]
x_test = input_seq[1500:]
y_test = output[1500:]

最后,使用此代码构建、训练和评估您的模型:

reg_model = MLPRegressor(hidden_layer_sizes = (64,64,64), activation = "relu", random_state = 2, max_iter = 400)

reg_model.fit(x_train, y_train)
y_pred = reg_model.predict(x_test)

print(' R2 = ', r2_score(y_pred, y_test))
print('MAE = ', mean_absolute_error(y_pred, y_test))
print('MSE = ', mean_squared_error(y_pred, y_test))

完整代码:

from sklearn.neural_network import MLPRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np

sin_wave = np.sin(np.arange(-1000, 1000, 0.1))
input_seq = np.array([sin_wave[x:x+2] for x in range(len(sin_wave)-2)])
output = np.array([sin_wave[x+2] for x in range(len(sin_wave)-2)])

# Split into Train and test
x_train = input_seq[:1500]
y_train = output[:1500]
x_test = input_seq[1500:]
y_test = output[1500:]

reg_model = MLPRegressor(hidden_layer_sizes = (64,64,64), activation = "relu", random_state = 2, max_iter = 400)

reg_model.fit(x_train, y_train)
y_pred = reg_model.predict(x_test)

print(' R2 = ', r2_score(y_pred, y_test))
print('MAE = ', mean_absolute_error(y_pred, y_test))
print('MSE = ', mean_squared_error(y_pred, y_test))