多项式回归

本文讲解多项式回归,强调特征变换和模型复杂度选择,以Pythonsklearn实现并分析示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多项式回归

  • 多项式回归 是非线性回归的一种,之前讨论的线性回归都是直线,而多项式回归则是曲线的回归,它通过引入原始预测变量的高阶项(如平方、立方等)来拟合数据的非线性模式。
  • 在多项式回归中,虽然模型对数据的关系是非线性的,但它依然是线性的,因为这种非线性体现在特征变换上,而不是模型的系数和变量之间的关系。这就是为什么多项式回归被视为线性回归的一个特例。
  • 例如,一个二次多项式回归模型可以表述为 y = β 0 + β 1 x + β 2 x 2 + ϵ y = \beta_0 + \beta_1x + \beta_2x^2 + \epsilon y=β0+β1x+β2x2+ϵ,其中模型对于系数 (\beta) 是线性的,尽管它对于 (x) 是非线性的。

本文基于教程链接数据基于https://github.com/trekhleb/homemade-machine-learning/blob/master/data/non-linear-regression-x-y.csv

首先,我们取到的数据集散点图如下,这种情况下用一条直线来回归则有些不恰当:
在这里插入图片描述
所以就需要使用一条多项式来模拟曲线回归。在多项式回归中最重要的就是选择多项式的复杂度,
Y = β 0 + β 1 X + β 2 X 2 + β 3 X 3 + . . . + β n X n + ϵ Y = \beta_0 + \beta_1X + \beta_2X^2 + \beta_3X^3 + ... + \beta_nX^n + \epsilon Y=β0+β1X+β2X2+β3X3+...+βnXn+ϵ多项式的复杂度(即公式中的n)不宜太低(欠拟合)或过高(过拟合)。如下图就是过低导致的欠拟合:
在这里插入图片描述
具体python代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split #用于划分训练集和测试集。
from sklearn.preprocessing import PolynomialFeatures #用于生成多项式特征。
from sklearn.linear_model import LinearRegression #用于执行线性回归。
from sklearn.metrics import mean_squared_error #用于评估模型性能。


# 导入数据
path = 'non-linear-regression-x-y.csv'
data = pd.read_csv(path)

# 分离特征和目标变量
X = data['x'].values.reshape(-1, 1)  # 重塑X为二维数组
y = data['y'].values

"""
绘制数据散点图
"""
# 绘制散点图
plt.scatter(X, y)
plt.xlabel('X Value')
plt.ylabel('Y Value')
plt.title('Scatter Plot of X vs Y')
plt.show()

# 创建多项式特征(例如,二次多项式)
poly = PolynomialFeatures(degree=8)
X_poly = poly.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_poly, y, test_size=0.3, random_state=42)

# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse}")

# 可选:绘制模型拟合结果
import matplotlib.pyplot as plt
plt.scatter(X, y, color='blue')
plt.plot(X, model.predict(poly.fit_transform(X)), color='red')
plt.title('Non-linear Regression')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

多项式回归的结果如下,本数据集中使用了degree=8(即n=8)均方误差: 107.16818285704927:
在这里插入图片描述

<think>首先,用户的问题是:“我想了解多项式回归算法的原理或实现方法 请问多项式回归算法原理及实现方法详解”。这是一个关于多项式回归的查询,我需要提供清晰、结构化的回答。 根据系统级指令: - 所有行内数学表达式必须使用 `$...$` 格式。 - 独立公式必须使用 `$$...$$` 格式并单独成段。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如 `[^1]`。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考提供的引用: - [^1]:多项式回归简介,历史,线性回归的关系等。 - [^2]:多项式回归的基础理解,代码示范。 - [^3]:多项式回归是线性回归的扩展,捕捉非线性关系。 - [^4]:多项式回归使用情况,当因变量和自变量非线性时。 我需要基于这些引用构建回答。用户要求的是原理和实现方法详解。 结构化回答: 1. **介绍多项式回归**:简要解释什么是多项式回归,它线性回归的关系。 2. **数学原理**:详细说明多项式回归的数学模型,包括公式。 3. **实现方法**:提供代码示例,可能使用Python。 4. **优缺点和应用场景**:讨论其优势和局限性。 5. **相关问题**:生成相关问题。 使用引用: - 在适当的地方添加引用标识,如当提到引用内容时。 数学表达: - 行内公式:如 `$y = \beta_0 + \beta_1 x + \beta_2 x^2$` - 独立公式:如多项式回归方程。 实现方法: - 提供Python代码示例,使用代码块格式。 相关问题: - 生成3-5个相关问题。 完整回答结构: - 标题:多项式回归算法原理及实现方法详解 - 内容: - 1. 多项式回归简介 - 2. 数学原理 - 3. 实现步骤 - 4. 优缺点和应用场景 - 5. 相关问题</think>### 多项式回归算法原理及实现方法详解 多项式回归是一种常用的机器学习回归算法,它通过扩展线性回归模型来捕捉数据中的非线性关系。以下是逐步详解其原理和实现方法,基于可靠参考内容[^1][^2][^3][^4]。 --- #### 1. **多项式回归简介** 多项式回归是线性回归的扩展形式,适用于因变量(目标)自变量(特征)之间存在非线性关系的情况。当线性回归无法有效拟合数据时(如数据呈现曲线趋势),多项式回归通过引入自变量的高次项(如平方、立方等)来提升模型灵活性[^1][^3]。例如: - 线性回归模型:$y = \beta_0 + \beta_1 x$ - 多项式回归模型(二次):$y = \beta_0 + \beta_1 x + \beta_2 x^2$ 这里,$x^2$ 是二次项,帮助拟合曲线关系。多项式回归的核心优势是能在保持模型简单性的同时处理非线性数据[^2][^4]。 #### 2. **数学原理详解** 多项式回归的数学基础是通过特征工程扩展原始特征。假设原始特征为 $x$,多项式回归引入 $x$ 的 $k$ 次多项式项: $$y = \beta_0 + \beta_1 x + \beta_2 x^2 + \cdots + \beta_k x^k + \epsilon$$ 其中: - $y$ 是因变量(目标值) - $x$ 是自变量(特征) - $\beta_0, \beta_1, \ldots, \beta_k$ 是模型参数(系数) - $\epsilon$ 是误差项 - $k$ 是多项式次数(degree),控制模型复杂度 模型拟合过程使用最小二乘法优化参数 $\beta$,最小化残差平方和(RSS): $$\min_{\beta} \sum_{i=1}^{n} (y_i - (\beta_0 + \beta_1 x_i + \cdots + \beta_k x_i^k))^2$$ 这线性回归相同,但特征矩阵被扩展为多项式形式[^1][^3][^4]。例如,原始特征 $x$ 扩展为 $[1, x, x^2, \ldots, x^k]$。 **关键点**: - **多项式次数 $k$**:次数越高,模型越灵活,但可能过拟合(如 $k=10$ 时模型可能震荡)。通常通过交叉验证选择最优 $k$[^1][^4]。 - **正则化**:为防止过拟合,可加入 L1/L2 正则化(如 Ridge 回归),优化目标变为: $$\min_{\beta} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{k} \beta_j^2$$ 其中 $\lambda$ 是正则化强度[^1][^3]。 - **线性回归关系**:多项式回归本质是线性模型,但通过特征变换处理非线性问题[^3]。 #### 3. **实现方法详解(Python 示例)** 实现多项式回归包括特征扩展和模型训练。以下是使用 Python 和 scikit-learn 库的完整步骤: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split from sklearn.pipeline import make_pipeline # 步骤1: 生成示例数据(非线性关系) np.random.seed(42) X = np.linspace(-3, 3, 100).reshape(-1, 1) # 特征 x y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1) * 0.5 # 目标 y = 0.5x² + x + 2 + 噪声 # 步骤2: 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 步骤3: 创建多项式回归模型(k=2) poly_reg = make_pipeline( PolynomialFeatures(degree=2), # 特征扩展:添加 x² 项 LinearRegression() # 线性回归拟合 ) # 步骤4: 训练模型 poly_reg.fit(X_train, y_train) # 步骤5: 预测和评估 y_pred = poly_reg.predict(X_test) mse = mean_squared_error(y_test, y_pred) print(f"测试集均方误差 (MSE): {mse:.4f}") # 步骤6: 可视化结果 plt.scatter(X, y, color='blue', label="真实数据") plt.plot(X, poly_reg.predict(X), color='red', label="多项式回归拟合") plt.title("多项式回归拟合示例 (k=2)") plt.xlabel("x") plt.ylabel("y") plt.legend() plt.show() ``` **代码说明**: - **特征扩展**:`PolynomialFeatures(degree=k)` 自动生成 $x, x^2, \ldots, x^k$ 项。例如,当 `k=2` 时,输入 $x$ 扩展为 $[1, x, x^2]$[^3][^4]。 - **模型训练**:使用 `LinearRegression` 拟合扩展后的特征,核心是最小二乘法优化。 - **评估指标**:均方误差(MSE)衡量预测精度。 - **输出示例**:拟合曲线将捕捉二次趋势(如抛物线),MSE 值应较低(接近 0)。 **优化建议**: - **选择多项式次数**:通过交叉验证测试不同 $k$(如 $k=1,2,3$),选择最小验证误差的 $k$。 - **正则化**:若过拟合(如 $k$ 过大时测试误差上升),使用 `Ridge` 回归替代 `LinearRegression`[^1][^3]。 - **多变量扩展**:对于多个特征(如 $x_1, x_2$),多项式回归可生成交互项(如 $x_1 x_2$)[^1]。 #### 4. **优缺点和应用场景** - **优点**: - 简单高效,能拟合非线性数据。 - 实现容易(基于线性回归框架)。 - 适用于低维数据建模[^1][^4]。 - **缺点**: - 高次多项式易过拟合(需正则化或交叉验证)。 - 特征扩展后维度爆炸(如 $k$ 大时计算成本高)。 - 外推性能差(预测超出训练范围的数据不准确)[^2][^3]。 - **应用场景**: - 经济学:预测商品价格需求量的曲线关系。 - 工程学:拟合传感器读数物理量的非线性响应。 - 生物学:建模药物剂量效果的饱和曲线[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值