线性回归之多项式升维

news2025/7/11 4:59:57

文章目录

  • 多项式升维简介
  • 简单案例
  • 实战案例
  • 多项式升维优缺点

多项式升维简介

  • 多项式升维(Polynomial Expansion)是线性回归中一种常用的特征工程方法,它通过将原始特征进行多项式组合来扩展特征空间,从而让线性模型能够拟合非线性关系。

  • 标准的线性回归模型形式为:
    y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n + ε y = w₀ + w₁x₁ + w₂x₂ + ... + wₙxₙ + ε y=w0+w1x1+w2x2+...+wnxn+ε

  • 多项式升维通过创建原始特征的高次项和交互项来扩展模型:
    y = w 0 + w 1 x + w 2 x 2 + . . . + w d x d + ε y = w₀ + w₁x + w₂x² + ... + w_dx^d + ε y=w0+w1x+w2x2+...+wdxd+ε

  • 升维的目的是为了解决欠拟合的问题(提高模型的准确率),因为当维度不够时,对于预测结果考虑的因素不足,不能准确的计算出模型。
    在这里插入图片描述

  • 在做升维的时候,最常见的手段就是将已知维度进行相乘来构建新的维度,如下图所示。下图左展示的是线性不可分的情况,下图右通过升维使得变得线性可分。
    在这里插入图片描述

  • 多项式回归是机器学习中一种特殊的升维技术,虽然它可以被视为一种算法,但和归一化类似,通常被归类为数据预处理手段。在scikit-learn库中,它被放置在sklearn.preprocessing模块下。其核心原理是通过将原始特征进行组合(包括特征自身的乘积),生成二阶或更高阶的新特征,从而扩展特征空间。

  • 命名为"回归"的原因主要源于它常与线性回归配合使用。标准的线性回归模型旨在捕捉X和y之间的线性关系,但当数据呈现非线性特征时,我们有两种解决方案:

  1. 改用非线性模型(如回归树、神经网络等)直接拟合数据
  2. 坚持使用线性模型,但通过特征工程将数据转化为线性可分的形态
  • 线性模型具有计算效率高的显著优势。通过多项式升维,我们既保留了线性模型的快速计算特性,又使其能够适应更复杂的数据分布。以医疗费用预测为例:当用年龄预测医疗支出时,若费用随年龄呈二次曲线增长(老年人医疗成本加速上升),简单的线性关系无法准确描述,这时多项式特征就能有效捕捉这种非线性模式。
Data 数据-->Algorithm 算法-->Model模型
Data 线性-->Algorithm 线性-->Model Good
Data 非线性-->Algorithm 非线性-->Model Good
Data 非线性-->Algorithm 线性-->Model Bad
Data 非线性-->Data线性--Algorithm 线性-->Model Good

在这里插入图片描述
y ^ = w 0 + w 1 x 1 + w 2 x 2 \hat y=w_0+w_1x_1+w_2x_2 y^=w0+w1x1+w2x2
y ^ = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 1 2 + w 4 x 2 2 + w 5 x 1 x 2 \hat y=w_0+w_1x_1+w_2x_2+w_3x_{1}^{2}+w_4x_{2}^{2}+w_5x_1x_2 y^=w0+w1x1+w2x2+w3x12+w4x22+w5x1x2

简单案例

  • 单变量多项式回归
from sklearn.preprocessing import PolynomialFeatures
import numpy as np

# 假设我们有单变量数据
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)

# 创建二次多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
  • 多变量多项式回归
# 假设有双变量数据
X = np.array([[1, 2], [3, 4], [5, 6]])

# 创建二次多项式特征(包括交互项)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

实战案例

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

# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

np.random.seed(42)
m = 1000
X = 6 * np.random.rand(m, 1) - 3
Y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)

# 数据集的划分 训练集和测试集
X_train = X[:800]
X_test = X[800:]
Y_train = Y[:800]
Y_test = Y[800:]

# 真实数据
plt.plot(X, Y, 'b.', label='真实数据')
plt.title("真实数据分布")
plt.xlabel("特征值 X")
plt.ylabel("目标值 Y")
plt.legend()
# plt.show()

# 构建字典 保证后面使用一阶、二阶、十阶多项回归的时候可以使用不同的图示
my_dict = {1: 'g-', 2: 'r+', 10: 'y*'}

# 循环执行 数据预处理、模型训练、模型评估
for i in my_dict:
    ploy_feature = PolynomialFeatures(degree=i, include_bias=True)
    X_poly_train = ploy_feature.fit_transform(X_train)
    X_poly_test = ploy_feature.fit_transform(X_test)
    print(f"第{i}阶的多项式回归")
    print('原始数据集')
    print(X_train[0])
    print("升维数据集", )
    print(X_poly_train[0])
    print('原始数据集维度')
    print(X_train.shape)
    print('升维数据集维度')
    print(X_poly_train.shape)

    lin_reg = LinearRegression(fit_intercept=False)
    lin_reg.fit(X_poly_train, Y_train)
    print(lin_reg.intercept_, lin_reg.coef_)

    Y_train_predict = lin_reg.predict(X_poly_train)
    Y_test_predict = lin_reg.predict(X_poly_test)
    plt.plot(X_train, Y_train_predict, my_dict[i], label=f'{i}阶拟合曲线')

    print("训练集的均方误差")
    print(mean_squared_error(Y_train, Y_train_predict))
    print("测试集的均方误差")
    print(mean_squared_error(Y_test, Y_test_predict))
    print("======")

plt.title(f"多项式回归拟合结果 (最高阶数: {max(my_dict.keys())})")
plt.xlabel("特征值 X")
plt.ylabel("目标值 Y")
plt.legend()
plt.show()

# 新增: 绘制检验效果模型的图标
plt.figure(figsize=(12, 6))
for i in my_dict:
    ploy_feature = PolynomialFeatures(degree=i, include_bias=True)
    X_poly_train = ploy_feature.fit_transform(X_train)
    X_poly_test = ploy_feature.fit_transform(X_test)

    lin_reg = LinearRegression(fit_intercept=False)
    lin_reg.fit(X_poly_train, Y_train)

    Y_train_predict = lin_reg.predict(X_poly_train)
    Y_test_predict = lin_reg.predict(X_poly_test)

    # 训练集和测试集的拟合曲线
    plt.subplot(1, 2, 1)
    plt.plot(X_train, Y_train_predict, my_dict[i], label=f'{i}阶训练集拟合曲线')
    plt.scatter(X_train, Y_train, color='blue', s=10, label='训练集数据')

    plt.subplot(1, 2, 2)
    plt.plot(X_test, Y_test_predict, my_dict[i], label=f'{i}阶测试集拟合曲线')
    plt.scatter(X_test, Y_test, color='red', s=10, label='测试集数据')

plt.subplot(1, 2, 1)
plt.title("训练集拟合效果")
plt.xlabel("特征值 X")
plt.ylabel("目标值 Y")
plt.legend()

plt.subplot(1, 2, 2)
plt.title("测试集拟合效果")
plt.xlabel("特征值 X")
plt.ylabel("目标值 Y")
plt.legend()

plt.tight_layout()
plt.show()

在这里插入图片描述

多项式升维优缺点

优点:

  • 拟合非线性关系:让线性模型能够捕捉数据中的非线性模式
  • 灵活性:通过调整degree参数控制模型的复杂度
  • 保持线性模型优势:仍然可以使用正规方程等线性回归的优化方法

缺点:

  • 维度灾难:随着特征数量和degree增加,特征空间会急剧膨胀
  • 过拟合风险:高阶多项式容易过拟合训练数据
  • 外推性能差:多项式模型在训练数据范围外的预测可能不可靠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑

文章目录 前言1. 安装Docker2. Go File使用演示3. 安装cpolar内网穿透4. 配置Go File公网地址5. 配置Go File固定公网地址 前言 在这个信息爆炸的时代,谁不曾遭遇过类似的窘境呢?试想,当你正于办公室中埋首案牍时,手机突然弹出一…

CrewAI Community Version(一)——初步了解以及QuickStart样例

目录 1. CrewAI简介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安装2.1 安装uv2.2 安装CrewAI CLI 3. 官网QuickStart样例3.1 创建CrewAI Crews项目3.2 项目结构3.3 .env3.4 智能体角色及其任务3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试

所需下载地址: 通过网盘分享的文件:rtmp 链接: https://pan.baidu.com/s/1t21J7cOzQR1ASLrsmrYshA?pwd0000 提取码: 0000 window: 解压 win目录下的 nginx-rtmp-module-1.2.2.zip和nginx 1.7.11.3 Gryphon.zip安装包,解压时选…

Lateral 查询详解:概念、适用场景与普通 JOIN 的区别

1. 什么是Lateral查询? Lateral查询(也称为横向关联查询)是一种特殊的子查询,允许子查询中引用外层查询的列(即关联引用),并在执行时逐行对外层查询的每一行数据执行子查询。 语法上通常使用关…

【springsecurity oauth2授权中心】简单案例跑通流程 P1

项目被拆分开,需要一个授权中心使得每个项目都去授权中心登录获取用户权限。而单一项目里权限使用的是spring-security来控制的,每个controller方法上都有 PreAuthorize("hasAuthority(hello)") 注解来控制权限,想以最小的改动来实…

spark—SQL3

连接方式 内嵌Hive: 使用时无需额外操作,但实际生产中很少使用。 外部Hive: 在虚拟机下载相关配置文件,在spark-shell中连接需将hive-site.xml拷贝到conf/目录并修改url、将MySQL驱动copy到jars/目录、把core-site.xml和hdfs-sit…

一文了解相位阵列天线中的真时延

本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板,以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络,而宽带通信系统正在努力满…

linux学习 5 正则表达式及通配符

重心应该放在通配符的使用上 正则表达式 正则表达式是用于 文本匹配和替换 的强大工具 介绍两个交互式的网站来学习正则表达式 regexlearn 支持中文 regexone 还有一个在线测试的网址 regex101 基本规则 符号作用示例.匹配任何字符除了换行a.b -> axb/a,b[abc]匹配字符…

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention 随着人工智能技术的飞速发展,回归预测任务在很多领域得到了广泛的应用。尤其在金融、气象、医疗等领域,精确的回归预测模型能够为决策者提供宝贵的参考信息。为…

Android RK356X TVSettings USB调试开关

Android RK356X TVSettings USB调试开关 平台概述操作-打开USB调试实现源码补充说明 平台 RK3568 Android 11 概述 RK3568 是瑞芯微(Rockchip)推出的一款高性能处理器,支持 USB OTG(On-The-Go)和 USB Host 功能。US…

消息队列知识点详解

消息队列场景 什么是消息队列 可以把消息队列理解一个使用队列来通信的组件,它的本质是交换机队列的模式,实现发送消息,存储消息,消费消息的过程。 我们通常说的消息队列,MQ其实就是消息中间件,业界中比较…

序列号绑定的SD卡坏了怎么办?

在给SD卡烧录程序的时候,大家发现有的卡是无法烧录的,如:复印机的SD卡不能被复制通常涉及以下几个技术原因,可能与序列号绑定、加密保护或硬件限制有关: 一、我们以复印机的系统卡为例来简单讲述一下 序列号或硬件绑定…

使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南

使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 一、SystemWeaver与SOME/IP基础认知 1.1 SystemWe…

Flutter 状态管理 Riverpod

Android Studio版本 Flutter SDK 版本 将依赖项添加到您的应用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…

【HarmonyOS 5】VisionKit人脸活体检测详解

【HarmonyOS 5】VisionKit人脸活体检测详解 一、VisionKit人脸活体检测是什么? VisionKit是HamronyOS提供的场景化视觉服务工具包。 华为将常见的解决方案,通常需要三方应用使用SDK进行集成。华为以Kit的形式集成在HarmoyOS系统中,方便三方…

Pycharm(九)函数的闭包、装饰器

目录 一、函数参数 二、闭包 三、装饰器 一、函数参数 def func01():print("func01 shows as follows") func01() # 函数名存放的是函数所在空间的地址 print(func01)#<function func01 at 0x0000023BA9FC04A0> func02func01 print(func02)#<function f…

【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【深度学习】你真的理解张量了吗&#xff1f;|标量、向量、矩阵、张量的秩|01每日一言&#x1f33c;: “脑袋想不明白的&#xff0c;就用脚想”…

MH2103系列coremark1.0跑分数据和优化,及基于arm2d的优化应用

CoreMark 1.0 介绍 CoreMark 是由 EEMBC&#xff08;Embedded Microprocessor Benchmark Consortium&#xff09;组织于 2009 年推出的一款用于衡量嵌入式系统 CPU 或 MCU 性能的标准基准测试工具。它旨在替代陈旧的 Dhrystone 标准&#xff08;Dhrystone 容易受到各种libc不同…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus&#xff0c;看了几篇测评后&#xff0c;突然在某个时间节点&#xff0c;在特工的文章下&#xff0c;发现了很小众的Flowith。 被这段评论给心动到&#xff0c;于是先去注册了下账号。一翻探索过后&#xff0c;发现比我想象中要有趣的多&…

SpringBoot企业级开发之【文章分类-新增文章分类】

看一下新增文章的需求&#xff1a; 接口文档&#xff1a; 开发思路&#xff1a; 先在controller下去创建add方法&#xff0c;方法内导入Service类获取add的结果&#xff1b;再在Service接口下去创建add的方法&#xff1b;然后在Service实现类下去实现方法的作用&#xff0c;且导…