import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
# 生成cosx数据
x = np.linspace(0, 10*np.pi, 1000)
y = np.cos(x)
# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
y = scaler.fit_transform(y.reshape(-1, 1))
# 创建序列数据
seq_length = 20
X, Y = [], []
for i in range(len(y)-seq_length):
X.append(y[i:i+seq_length])
Y.append(y[i+seq_length])
X = np.array(X)
Y = np.array(Y)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, shuffle=False)
# 1. 线性回归模型
lr_model = LinearRegression()
lr_model.fit(X_train.reshape(-1, seq_length), y_train)
lr_pred = lr_model.predict(X_test.reshape(-1, seq_length))
lr_mse = mean_squared_error(y_test, lr_pred)
# 2. 随机森林回归
rf_model = RandomForestRegressor(n_estimators=100)
rf_model.fit(X_train.reshape(-1, seq_length), y_train.ravel())
rf_pred = rf_model.predict(X_test.reshape(-1, seq_length))
rf_mse = mean_squared_error(y_test, rf_pred)
# 3. 支持向量回归
svr_model = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)
svr_model.fit(X_train.reshape(-1, seq_length), y_train.ravel())
svr_pred = svr_model.predict(X_test.reshape(-1, seq_length))
svr_mse = mean_squared_error(y_test, svr_pred)
# 4. K近邻回归
knn_model = KNeighborsRegressor(n_neighbors=5)
knn_model.fit(X_train.reshape(-1, seq_length), y_train.ravel())
knn_pred = knn_model.predict(X_test.reshape(-1, seq_length))
knn_mse = mean_squared_error(y_test, knn_pred)
# 可视化结果
plt.figure(figsize=(15, 6))
plt.plot(y_test, label='True Values', linewidth=2)
plt.plot(lr_pred, '--', label=f'Linear Regression (MSE: {lr_mse:.4f})')
plt.plot(rf_pred, ':', label=f'Random Forest (MSE: {rf_mse:.4f})')
plt.plot(svr_pred, '-.', label=f'SVR (MSE: {svr_mse:.4f})')
plt.plot(knn_pred, ':', label=f'KNN (MSE: {knn_mse:.4f})')
plt.legend()
plt.title('Traditional ML Models Comparison on Cosx Sequence Prediction')
plt.show()
# 打印模型MSE比较
print(f"Model Performance Comparison:")
print(f"Linear Regression MSE: {lr_mse:.6f}")
print(f"Random Forest MSE: {rf_mse:.6f}")
print(f"SVR MSE: {svr_mse:.6f}")
print(f"KNN MSE: {knn_mse:.6f}")
Model Performance Comparison:
Linear Regression MSE: 0.000000
Random Forest MSE: 0.000005
SVR MSE: 0.006597
KNN MSE: 0.000002
@浙大疏锦行