【机器学习】多项式回归

多项式回归 是回归分析的一种扩展形式,通过增加多项式特征,可以模拟输入特征与输出之间的非线性关系。与线性回归不同,线性回归仅适用于直线拟合,而多项式回归则可以用曲线拟合复杂数据。本教程将系统讲解多项式回归模型,包括模型的推导、数据转换、模型训练、损失函数的定义和梯度下降,并使用numpy实现。最后,我们会通过sklearn实现多项式回归模型。

多项式回归模型简介

多项式回归模型的核心在于扩展输入特征。对于一个特征 (x),我们可以将它转化为多项式特征,例如将输入特征 (x) 转换为二次特征(或更高次),模型表达式如下:

y = w 0 + w 1 x + w 2 x 2 + ⋯ + w n x n + b y = w_0 + w_1 x + w_2 x^2 + \cdots + w_n x^n + b y=w0+w1x+w2x2+⋯+wnxn+b

其中:

  • ( y ) 是预测值,
  • ( x ) 是输入特征,
  • ( w_0, w_1, \ldots, w_n ) 是模型的权重,
  • ( b ) 是偏置项。

这个模型是输入特征 (x) 的 n次多项式。多项式回归通过增加特征的次幂,允许模型更好地拟合非线性数据。

数据转换:构建多项式特征

在构建多项式回归模型前,需要将输入特征转换为多项式特征。例如,给定一个特征 ( x ),我们将它扩展为多项式特征 ( [1, x, x^2, \ldots, x^n] )。

我们定义一个函数 poly_features 来生成多项式特征。

python 复制代码
import numpy as np

def poly_features(X, degree):
    """
    将输入特征 X 扩展为多项式特征矩阵。
    X : 原始特征 (n_samples, 1)
    degree : 多项式的最高次数
    """
    X_poly = np.ones((X.shape[0], degree + 1))  # 初始化为 1
    for i in range(1, degree + 1):
        X_poly[:, i] = X[:, 0] ** i
    return X_poly

损失函数:均方误差 (Mean Squared Error, MSE)

为了评估模型预测值与真实值的误差,我们使用均方误差 作为损失函数:
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^2 MSE=n1i=1∑n(yi−yi^)2

其中:

  • ( y_i ) 是第 ( i ) 个样本的真实值,
  • ( \hat{y_i} ) 是模型的预测值,
  • ( n ) 是样本总数。

模型训练:梯度下降优化

多项式回归模型的优化可以通过梯度下降实现。以下是计算梯度的实现:

python 复制代码
def compute_gradients(X, y, w, b):
    n = len(y)
    y_pred = X.dot(w) + b
    dw = (2/n) * X.T.dot(y_pred - y)
    db = (2/n) * np.sum(y_pred - y)
    return dw, db

使用梯度下降训练模型

接下来,我们使用梯度下降来优化模型参数:

python 复制代码
def gradient_descent(X, y, w, b, learning_rate, iterations):
    for i in range(iterations):
        dw, db = compute_gradients(X, y, w, b)
        w -= learning_rate * dw
        b -= learning_rate * db
        
        if i % 100 == 0:
            y_pred = X.dot(w) + b
            loss = mse_loss(y, y_pred)
            print(f"Iteration {i}: Loss = {loss}")
    return w, b

代码实现:多项式回归模型

我们使用numpy从头实现一个多项式回归模型。

数据准备

我们生成一个非线性数据集,用来训练多项式回归模型。

python 复制代码
import matplotlib.pyplot as plt

# 生成非线性数据
np.random.seed(42)
X = 6 * np.random.rand(100, 1) - 3  # X 范围在 [-3, 3]
y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1)  # y = 0.5x^2 + x + 2 + 噪声

# 可视化数据
plt.scatter(X, y)
plt.xlabel("X")
plt.ylabel("y")
plt.title("Generated Non-linear Data")
plt.show()

转换多项式特征

假设我们想训练一个二次多项式回归模型。

python 复制代码
# 转换成二次多项式特征
degree = 2
X_poly = poly_features(X, degree)

初始化模型参数并定义损失函数

我们初始化权重和偏置,并定义损失函数:

python 复制代码
# 初始化参数
w = np.random.randn(degree + 1, 1)
b = np.random.randn(1)

# 定义均方误差损失函数
def mse_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

训练模型

设置学习率和迭代次数,进行模型训练。

python 复制代码
learning_rate = 0.01
iterations = 1000
w_trained, b_trained = gradient_descent(X_poly, y, w, b, learning_rate, iterations)
print(f"Trained weights: {w_trained}, Trained bias: {b_trained}")

可视化拟合曲线

我们将模型拟合的曲线与原始数据进行对比。

python 复制代码
# 生成预测值
X_fit = np.linspace(-3, 3, 100).reshape(100, 1)  # 用于绘制拟合曲线
X_fit_poly = poly_features(X_fit, degree)
y_fit = X_fit_poly.dot(w_trained) + b_trained

# 绘制结果
plt.scatter(X, y, label="Original Data")
plt.plot(X_fit, y_fit, color='red', label="Polynomial Fit")
plt.xlabel("X")
plt.ylabel("y")
plt.title("Polynomial Regression Fit")
plt.legend()
plt.show()

使用sklearn实现多项式回归

最后,我们使用sklearn快速实现多项式回归模型。

python 复制代码
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 生成多项式特征
poly = PolynomialFeatures(degree=2)
X_poly_sklearn = poly.fit_transform(X)

# 训练模型
lin_reg = LinearRegression()
lin_reg.fit(X_poly_sklearn, y)

# 可视化拟合曲线
y_sklearn_fit = lin_reg.predict(poly.fit_transform(X_fit))
plt.scatter(X, y, label="Original Data")
plt.plot(X_fit, y_sklearn_fit, color='red', label="Sklearn Polynomial Fit")
plt.xlabel("X")
plt.ylabel("y")
plt.title("Polynomial Regression with Sklearn")
plt.legend()
plt.show()

总结

本文通过逐步推演实现了多项式回归模型,深入理解了多项式特征转换、损失函数和梯度下降优化过程。最后,我们通过sklearn验证了模型的实现并进行了可视化展示,希望这篇教程帮助你掌握多项式回归的基本原理与实现。

相关推荐
AngelPP1 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年1 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼1 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS1 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区3 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈3 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang3 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk15 小时前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能
西门老铁6 小时前
🦞OpenClaw 让 MacMini 脱销了,而我拿出了6年陈的安卓机
人工智能