灰色预测模型(GM) 神经网络 指数平滑 多项式拟合 线性回归 各种预测模型dai做,写完整预测报告,可提供图表与代码
预测模型的世界里,工具比超市货架上的泡面种类还多。今天咱们扒开几个常用模型的底裤,看看到底怎么玩转这些数学魔术。先上个全家福:线性回归、指数平滑、灰色预测、神经网络、多项式拟合,最后整点硬核代码演示。
先拿线性回归开刀。这玩意儿就像炒菜放盐,基础但容易翻车。看这段代码:
import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt x = np.array([i for i in range(20)]).reshape(-1,1) y = 3*x.ravel() + np.random.normal(0, 5, 20) model = LinearRegression() model.fit(x, y) pred = model.predict([[20],[21]]) plt.scatter(x, y, color='black') plt.plot(np.append(x, [[20],[21]]), np.append(model.predict(x), pred), color='blue', linewidth=3) plt.title("线性回归预测") plt.show()这段代码的关键在数据变形。reshape(-1,1)把一维数组变成二维矩阵,这是sklearn的强制要求。预测时直接塞进新数据点就能看到未来走势。注意随机噪声的设置,标准差5让数据点看起来更真实,避免拟合出完美直线的尴尬。
接着是时间序列老司机指数平滑。Holt-Winters三剑客参数玩得溜,预测效果能上天:
from statsmodels.tsa.holtwinters import ExponentialSmoothing # 生成带趋势的数据 data = [i*0.5 + np.random.randn()*2 for i in range(30)] model = ExponentialSmoothing(data, trend='add', seasonal=None).fit() forecast = model.forecast(5) plt.plot(data, label='真实数据') plt.plot(model.fittedvalues, label='拟合值') plt.plot(range(30,35), forecast, label='预测值', linestyle='--') plt.legend() plt.show()trend='add'参数指定加法趋势,适合数据波动幅度稳定的场景。fittedvalues属性藏着模型对历史数据的拟合结果,和原始数据一对比就能看出平滑效果。注意季节性参数设为None是因为我们的假数据没做季节特征。
灰色预测模型(GM) 神经网络 指数平滑 多项式拟合 线性回归 各种预测模型dai做,写完整预测报告,可提供图表与代码
灰色预测GM(1,1)是个怪胎,专治小样本疑难杂症。来看怎么用python调教它:
def GM11(data, predict_num=3): # 累加生成 AGO = np.cumsum(data) # 构造矩阵B B = np.array([-0.5*(AGO[i] + AGO[i+1]) for i in range(len(data)-1)]).reshape(-1,1) Y = data[1:].reshape(-1,1) # 计算参数 u = np.dot(np.linalg.inv(np.dot(B.T, B)), np.dot(B.T, Y)) a, b = u[0][0], u[1][0] # 预测方程 pred = [(data[0]-b/a)*np.exp(-a*k) + b/a for k in range(len(data)+predict_num)] # 累减还原 return [pred[i+1] - pred[i] for i in range(len(pred)-1)] origin = [12.8, 15.4, 16.7, 17.9, 19.6] result = GM11(origin, 2) print(f"未来两期预测值:{result[-2:]}")这个实现里有两个骚操作:累加生成把原始数据转化成单调递增序列,累减还原又把结果打回原形。参数计算用最小二乘法,核心是那个微分方程的解。注意指数项里的k值控制预测步长,适合做短期预测。
神经网络登场时总要带点神秘感。用keras搭个简单时序预测网络:
from keras.models import Sequential from keras.layers import LSTM, Dense # 数据预处理 def create_dataset(data, look_back=3): X, Y = [], [] for i in range(len(data)-look_back): X.append(data[i:(i+look_back)]) Y.append(data[i+look_back]) return np.array(X), np.array(Y) data = np.sin(np.arange(0, 20, 0.1)) * 10 + np.random.normal(0, 0.5, 200) X, y = create_dataset(data, look_back=5) X = X.reshape(X.shape[0], X.shape[1], 1) model = Sequential() model.add(LSTM(32, input_shape=(5,1))) model.add(Dense(1)) model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=50, batch_size=16, verbose=0) # 预测未来5步 last_seq = data[-5:].reshape(1,5,1) predictions = [] for _ in range(5): pred = model.predict(last_seq)[0,0] predictions.append(pred) last_seq = np.append(last_seq[:,1:,:], [[[pred]]], axis=1)LSTM层的记忆功能是时序预测的核心,32个神经元就像32个记忆抽屉。注意预测时的滚雪球操作——每次预测结果都作为下一次输入的部分数据,这种递归预测容易产生误差累积,适合短期预测。
最后来个多项式拟合调节下气氛:
from sklearn.preprocessing import PolynomialFeatures x = np.arange(0, 10, 0.5) y = 0.3*x**3 - 2*x**2 + 4*x + np.random.normal(0, 3, 20) poly = PolynomialFeatures(degree=3) x_poly = poly.fit_transform(x.reshape(-1,1)) model = LinearRegression() model.fit(x_poly, y) xx = np.linspace(0,12,50) xx_poly = poly.transform(xx.reshape(-1,1)) pred = model.predict(xx_poly) plt.scatter(x, y, color='gray') plt.plot(xx, pred, color='red', linewidth=2) plt.axvline(x=10, color='green', linestyle='--') plt.title("多项式外推预警")degree=3指定三次多项式,这个参数要是手抖调到10,立马给你画出心电图。绿色虚线右侧是外推区域,多项式拟合在外推时容易放飞自我,这个案例提醒我们:模型装逼过头,预测容易扑街。
走完这趟模型之旅,该明白没有银弹模型。数据规律明显时线性回归能打,需要捕捉趋势选指数平滑,小样本难题找灰色预测,复杂模式上神经网络,曲线波动试试多项式。工具人工具箱里多备几把刷子,面对不同场景才能游刃有余。