C++多项式Lasso回归(多变量函数拟合)

多项式回归和Lasso多项式回归都是用于建模数据关系的方法,但它们在实现方式和目标上有一些重要的区别。以下是它们的主要区别:

1. 基本概念

  • 多项式回归

    • 多项式回归是一种线性回归的扩展,它通过引入多项式特征(如 x^{2},x^{3},…)来捕捉数据中的非线性关系。

    • 其目标是拟合一个多项式方程 y=\beta_{0}+\beta_{1} x+\beta_{2} x^{2}+\cdots+\beta_{n} x^{n},其中 n 是多项式的阶数。

    • 多项式回归的核心是将非线性问题转化为线性问题,通过增加多项式特征来提高模型的拟合能力。

  • Lasso多项式回归

    • Lasso(Least Absolute Shrinkage and Selection Operator)回归是一种正则化的线性回归方法,它在损失函数中引入了 L1 正则化项。

    • 当应用于多项式回归时,Lasso多项式回归不仅考虑多项式特征,还会通过 L1 正则化来约束模型的复杂度,避免过拟合。

    • Lasso回归的损失函数为:

                                   \mathrm{L o s s}=\sum_{i=1}^{N} ( y_{i}-\hat{y}_{i} )^{2}+\lambda\sum_{j=1}^{P} | \beta_{j} |

      其中,\lambda是正则化参数,\beta _{j}是模型系数,L1 正则化会惩罚系数的绝对值。

2. 模型复杂度和过拟合

  • 多项式回归

    • 多项式回归的一个主要问题是容易过拟合,尤其是当多项式的阶数较高时。

    • 高阶多项式会过度拟合训练数据中的噪声,导致模型在新数据上的泛化能力较差。

  • Lasso多项式回归

    • Lasso回归通过 L1 正则化来约束模型的复杂度,能够自动选择重要的特征(即系数不为零的特征),并将不重要的特征系数压缩到零。

    • 这种稀疏性有助于减少模型的复杂度,降低过拟合的风险,同时提高模型的可解释性。

3. 特征选择

  • 多项式回归

    • 多项式回归本身不具有特征选择能力。它会使用所有生成的多项式特征来拟合模型,无论这些特征是否对目标变量有实际影响。

  • Lasso多项式回归

    • Lasso回归具有特征选择的能力。由于 L1 正则化会将一些系数压缩到零,因此可以自动筛选出对目标变量影响较大的特征,同时忽略不重要的特征。

    • 这种特性使得Lasso多项式回归在处理高维数据时更加高效,尤其是在特征数量较多的情况下。

4. 模型的可解释性

  • 多项式回归

    • 多项式回归的可解释性较差,尤其是当多项式的阶数较高时。模型可能包含许多复杂的高阶项,难以直观理解每个特征对目标的影响。

  • Lasso多项式回归

    • Lasso回归通过稀疏性提高了模型的可解释性。由于一些特征的系数被压缩到零,模型中只保留了重要的特征,使得模型更易于解释。

5. 应用场景

  • 多项式回归

    • 适用于数据具有明显非线性关系的场景,且对模型的复杂度和过拟合风险不敏感。

    • 例如,拟合某些物理或化学过程中的非线性关系。

  • Lasso多项式回归

    • 适用于特征数量较多且可能存在冗余的场景,尤其是在需要进行特征选择和提高模型泛化能力的情况下。

    • 例如,在生物医学数据分析或金融数据分析中,数据可能包含大量特征,但只有少数特征对目标变量有显著影响。

总结

  • 多项式回归和Lasso多项式回归的主要区别在于Lasso回归引入了 L1 正则化,从而具备了特征选择能力和对过拟合的抑制能力。

  • 如果数据存在明显的非线性关系且特征数量较少,多项式回归可能是一个不错的选择;但如果数据特征较多且需要进行特征选择和提高模型泛化能力,Lasso多项式回归则更为合适。

一个具体的例子 

       输入一组数据,N行10列,其中前3列为自变量,后7列为因变量。通过多项式Lasso函数拟合,实现任意给定3维自变量,输出7维向量。 

#include <iostream>
#include <Eigen/Dense>
//#include <unsupported/Eigen/NonLinearOptimization>
#include <cmath>// 软阈值函数
double softThreshold(double x, double lambda) {if (x > lambda) {return x - lambda;}else if (x < -lambda) {return x + lambda;}return 0.0;
}// 多项式特征扩展函数
Eigen::MatrixXd polynomialFeatures(const Eigen::MatrixXd& X, int degree) {int n_samples = X.rows();int n_features = X.cols();Eigen::MatrixXd polyFeatures(n_samples, (degree + 1) * n_features);for (int i = 0; i < n_samples; ++i) {for (int j = 0; j < n_features; ++j) {for (int d = 0; d <= degree; ++d) {polyFeatures(i, j * (degree + 1) + d) = std::pow(X(i, j), d);}}}return polyFeatures;
}// Lasso回归函数
Eigen::VectorXd lassoRegression(const Eigen::MatrixXd& X, const Eigen::VectorXd& y, double alpha, int max_iter = 2000, double tol = 1e-6) {int n_samples = X.rows();int n_features = X.cols();Eigen::VectorXd w = Eigen::VectorXd::Zero(n_features);Eigen::VectorXd w_old = Eigen::VectorXd::Zero(n_features);for (int iter = 0; iter < max_iter; ++iter) {for (int j = 0; j < n_features; ++j) {Eigen::VectorXd r = y - X * w + X.col(j) * w(j);double rho = X.col(j).dot(r);w(j) = (rho < -alpha / 2) ? (rho + alpha / 2) / X.col(j).squaredNorm() :(rho > alpha / 2) ? (rho - alpha / 2) / X.col(j).squaredNorm() : 0;}if ((w - w_old).norm() < tol) {break;}w_old = w;}return w;
}int main() {int numSamples = 17;int numFeatures = 3;int degree = 6;double lambda = 0.1;Eigen::MatrixXd data(numSamples, 10);data << 10, 50, 3, 29, 28, 30, 22, 21, 3.9, 3.39,10, 50, 5, 35, 34, 34, 26, 25, 4.54, 4.05,10, 60, 3, 34, 34, 31, 23, 23, 4.11, 4.15,15, 50, 3, 24, 27, 35, 19, 20, 1.51, 3.25,15, 50, 5, 31, 33, 38, 23, 24, 2.9, 3.34,15, 50, 8, 38, 38, 40, 26, 26, 3.49, 3.58,15, 50, 10, 41, 41, 42, 29, 29, 3.99, 3.76,15, 60, 3, 30, 33, 36, 20, 22, 1.77, 3.31,15, 60, 5, 37, 38, 40, 26, 26, 3.32, 3.79,15, 60, 8, 40, 41, 41, 27, 27, 3.64, 3.78,20, 50, 3, 17, 27, 40, 13, 20, -2, 2.81,20, 50, 5, 26, 32, 43, 19, 23, -0.35, 2.96,20, 50, 8, 33, 38, 45, 22, 25, 0.71, 3.42,20, 50, 10, 36, 40, 47, 25, 27, 1.63, 3.43,20, 60, 3, 22, 31, 41, 15, 21, -1.7, 2.95,20, 60, 5, 31, 37, 45, 22, 26, 0.78, 3.24,20, 60, 8, 35, 40, 46, 24, 27, 0.98, 3.1;// 生成示例数据Eigen::MatrixXd X = Eigen::MatrixXd::Zero(numSamples, numFeatures);Eigen::VectorXd y = Eigen::VectorXd::Zero(numSamples);for (int colId = 3; colId <= 9; colId++){for (int i = 0; i < numSamples; i++){X(i, 0) = data(i, 0);X(i, 1) = data(i, 1);X(i, 2) = data(i, 2);y(i, 0) = data(i, colId);}// 构造多项式特征Eigen::MatrixXd polyX = polynomialFeatures(X, degree);//cout << "polyX = " << polyX << endl;// 进行Lasso回归Eigen::VectorXd coefficients = lassoRegression(polyX, y, lambda);//std::cout << "Fitted coefficients: " << coefficients.transpose() << std::endl;// 计算预测值Eigen::VectorXd y_pred = polyX * coefficients;Eigen::VectorXd residuals = y - y_pred;// 输出残差std::cout << "Residuals: " << residuals.transpose() << std::endl;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年股指期货和股指期权合约交割的通知!

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 2025年股指期货和股指期权合约交割的通知&#xff01; 根据中国金融期货交易所规则及相关规定&#xff0c;以下股指期货和股指期权合约于指定日期进行交割&#xff0c;现将各合…

通俗易懂的DOM事件模型指南

前言 在前端开发中&#xff0c;DOM事件是我们与用户交互的核心。无论是点击按钮、滚动页面&#xff0c;还是输入文字&#xff0c;背后都离不开DOM事件的支持。今天&#xff0c;我们就来聊聊DOM事件模型&#xff0c;用最简单的方式带你理解它的工作原理。 一、什么是DOM事件&a…

【YOLOv8】损失函数

学习视频&#xff1a; yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失&#xff1a;BCE Loss 定位损失…

1.14作业

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

【工具篇】【深度解析 DeepAI 工具:开启 AI 应用新体验】

一、DeepAI 基本信息 嘿,咱先来说说 DeepAI 这工具到底是啥。DeepAI 是一个综合性的人工智能平台,就像是一个装满各种 AI 魔法的百宝箱。它把好多先进的人工智能技术整合到一起,让咱们普通人也能轻松用上这些高大上的 AI 功能。 这个平台背后有一群超厉害的技术人员,他们…

Java八股文(下)

Java八股文下篇 八、JVM高级篇1、JVM的内存模型以及分区介绍一下&#xff1f;2、四种引用方式有什么&#xff1f;3、判断是否为垃圾算法&#xff1f;4、垃圾回收算法介绍一下&#xff1f;5、类的生命周期以及类加载过程6、加载器种类有什么&#xff1f;7、什么是双亲委派模型以…

OpenGL开发杂谈

Renderdoc 调试 OpenGL 前言 在做 OpenGL 练习时常常苦恼于无法调试shader&#xff0c;故在网上查询方法。得知 renderdoc 这一东西&#xff0c;所以在这里做一下记录&#xff0c;如何使用 renderdoc 来调试 OpenGL 程序。 配置 下载比较简单&#xff0c;不必多说&#xff…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

我的AI工具箱Tauri版-CustomCardLayoutforH2Panel自定义描述Q版卡通大头照

本教程基于自研的AI工具箱Tauri版进行ComfyUI工作流CustomCardLayoutforH2Panel自定义描述Q版卡通大头照。 CustomCardLayoutforH2Panel 自定义描述Q版卡通大头照 特别面向需要生成个性化卡通大头照的用户需求。基于先进的Stable Diffusion&#xff08;SD&#xff09;模型技术…

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

MySQL数据库(7)—— 内置函数

目录 一&#xff0c;时间函数 二&#xff0c;字符串函数 三&#xff0c;数学函数 四&#xff0c;其它函数 一&#xff0c;时间函数 函数名功能current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时间date(datetime…

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…

【数据库系统概论】第第12章 并发控制

12.1 并发控制概述 并发控制是指数据库管理系统&#xff08;DBMS&#xff09;通过控制多个事务同时执行&#xff0c;保证数据的一致性和隔离性&#xff0c;避免事务间的相互干扰。 事务串行执行不能充分利用系统资源 并发执行的优点&#xff1a;能够减少处理机的空闲 时间&a…

滚珠花键在使用时需注意什么?

滚珠花键是一种直线运动系统&#xff0c;当花键套利用其中的钢球在经过精密磨削的花键轴上直线运动时&#xff0c;可以传递扭矩。在使用滚珠花键时&#xff0c;需要注意以下几个重要的事项&#xff1a; 1、不要擅自拆卸滚珠花键的各部分&#xff0c;因为这样可能会导致异物进入…

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号&#xff0c;都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】

文章目录 四.Sentinel限流熔断4.1 sentinel介绍4.2 Sentinel 的历史4.3 Sentinel 基本概念资源规则 4.4 Sentinel 功能和设计理念4.4.1 流量控制4.4.2熔断降级什么是熔断降级熔断降级设计理念系统负载保护 4.5 Sentinel 是如何工作的4.6 Sentinel使用4.7 Sentinel 控制台4.8 Sp…

webmin配置终端显示样式,模仿UbuntuDesktop终端

webmin配置终端显示样式&#xff0c;模仿UbuntuDesktop终端 在webmin中&#xff0c;默认情况下是没有图形化桌面的&#xff0c;因此终端界面也不会像 Ubuntu Desktop 那样有预设的紫色背景和颜色主题。不过&#xff0c;你可以通过修改 ~/.bashrc 文件&#xff0c;并结合安装和…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…