第 36 章 · 综合项目一:最小二乘拟合
把全书知识串起来的第一个实战项目用 Eigen 做最小二乘直线拟合。这是数据科学、机器学习的入门基础也是 Eigen 的典型应用。36.1 问题拟合一条直线假设你有一批实验数据点 (x, y)(0, 1.1), (1, 3.0), (2, 5.2), (3, 6.9), (4, 9.1), (5, 11.0)它们大致落在一条直线上但有点噪声。你想找一条直线y ax b最好地拟合这些点。最小二乘的思想找 a、b使得所有点到直线的误差平方和最小。36.2 数学原理正规方程把问题写成矩阵形式。对每个点 (xᵢ, yᵢ)有a·xᵢ b yᵢn 个点就是 n 个方程写成矩阵[ x₁ 1 ] [ y₁ ] [ x₂ 1 ] [ a ] [ y₂ ] [ ... ] [ b ] [ ...] [ xₙ 1 ] [ yₙ ]即A·c y其中A 是 n×2 矩阵第一列是 x第二列全 1c [a; b] 是待求参数y 是观测值这是方程比未知数多的超定方程一般没有精确解但有最小二乘解c (AᵀA)⁻¹ Aᵀ y ← 正规方程或者直接用 QR 分解求解更稳定。36.3 用 Eigen 实现#includeEigen/Dense#includeiostream#includevectorintmain(){// 原始数据std::vectordoublexs{0,1,2,3,4,5};std::vectordoubleys{1.1,3.0,5.2,6.9,9.1,11.0};intnxs.size();Eigen::MatrixXdA(n,2);// 设计矩阵Eigen::VectorXdy(n);for(inti0;in;i){A(i,0)xs[i];// 第一列是 xA(i,1)1.0;// 第二列是 1对应截距 by(i)ys[i];// 观测值}// 最小二乘求解QR 分解稳健通用Eigen::VectorXd cA.colPivHouseholderQr().solve(y);doubleac(0);// 斜率doublebc(1);// 截距std::cout拟合直线y a * x bstd::endl;return0;}运行结果接近y 1.98571 * x 1.08571真实关系是 y 2x 1 加噪声拟合非常准。编译运行把上面代码存成ch36.cpp然后路径写法见附录 C.3g-stdc17-O2-I你的Eigen目录ch36.cpp-och36.exe ./ch36.exe实际输出拟合直线y 1.98571 * x 1.0857136.4 评估拟合质量用残差真实值与预测值的差评估。在ch36.cpp的std::cout 拟合直线...后面加两行doubleerror(A*c-y).norm();// 残差范数std::cout残差 errorstd::endl;重新编译运行输出变成拟合直线y 1.98571 * x 1.08571 残差 0.226779残差越小拟合越好。这里 6 个点的总偏差约 0.23相对 y 本身 1~11 的量级来说很小说明直线确实贴住了这批数据。36.5 拓展多项式拟合直线拟合是线性拟合。想拟合曲线如二次 y ax² bx c只需扩展设计矩阵——加一列 x²。下面是独立的一份完整程序存成ch36_poly.cpp注意变量名和 36.3 的c无关#includeEigen/Dense#includeiostream#includevectorintmain(){std::vectordoublexs{0,1,2,3,4,5};std::vectordoubleys{1.1,3.0,5.2,6.9,9.1,11.0};Eigen::Index nxs.size();Eigen::MatrixXdA(n,3);// 三列x²、x、1Eigen::VectorXdy(n);for(Eigen::Index i0;in;i){A(i,0)xs[i]*xs[i];// x²A(i,1)xs[i];// xA(i,2)1.0;// 常数项y(i)ys[i];}Eigen::Vector3d cA.colPivHouseholderQr().solve(y);// c [a, b, c]std::cout二次拟合y c(0) * x^2 c(1) * x c(2)std::endl;std::cout残差 (A*c-y).norm()std::endl;return0;}实际输出二次拟合y 0 * x^2 1.98571 * x 1.08571 残差 0.226779这个结果很有意思二次项系数是0残差和直线拟合一模一样0.226779。原因是这批数据本来就是直线你给它更高次的模型它也只会把多余的那项压成 0。把ys改成{0, 1, 4, 9, 16, 25}正好是 y x²再跑一次实测输出二次拟合y 1 * x^2 -5.21706e-15 * x 7.14981e-15 残差 1.39037e-14二次项变成 1一次项和常数项是 1e-15 量级也就是 0残差 1e-14也就是 0——模型正确识别出了真实关系。思路完全一样把特征塞进设计矩阵的列就能拟合任意线性模型。这正是机器学习的核心思路——特征 最小二乘。36.6 为什么这是机器学习基础最小二乘拟合 机器学习里线性回归的 C 实现设计矩阵 A 特征矩阵 X待求参数 c 模型权重 w观测值 y 标签学会这个你就理解了线性回归、岭回归、甚至神经网络最后一层的数学本质。36.7 小结最小二乘让误差平方和最小的拟合。写成矩阵 Ax y用 QR 分解求解。残差范数评估拟合质量。扩展设计矩阵就能做多项式拟合 线性回归。下一章第二个实战项目3D 点云与刚体变换。练习题用上面的代码拟合给定数据打印斜率和截距。自己造一批数据y 3x 2 加随机噪声拟合看能不能还原。把拟合从直线改成二次曲线扩展设计矩阵。计算并打印拟合的残差。说说最小二乘和机器学习线性回归的关系。

相关新闻

基于YOLOv8的景区古树名木保护监测系统:从数据集到部署的完整实战

基于YOLOv8的景区古树名木保护监测系统:从数据集到部署的完整实战

简介:这份资源面向计算机、人工智能、通信工程等专业的在校学生与教师,提供一套基于YOLOv8的景区古树名木保护监测系统完整实现,可用于毕业设计、课程设计或大作业,也适合作为目标检测入门与进阶的实战案例。压缩包共8个文件&…

2026/10/9 15:15:50 阅读更多 →
第 35 章 · Eigen 进阶技巧

第 35 章 · Eigen 进阶技巧

最后一章 Eigen,讲实战中常用的技巧和模式:与 STL 结合、自定义函数、常用工具函数、用 Eigen::Map 接管外部数据、内存对齐,以及几个容易被忽略的坑。35.1 用 vector 管理一批矩阵 实战中经常要存一批矩阵/向量,用 std::vector&a…

2026/10/9 15:15:50 阅读更多 →
TeamCenter ITK二次开发入门:从官方Demo到环境配置与避坑指南

TeamCenter ITK二次开发入门:从官方Demo到环境配置与避坑指南

简介:面向西门子Teamcenter平台从事ITK二次开发的工程师,这份官方Demo包聚焦集成工具包扩展场景,适合希望快速掌握定制开发流程的初、中级开发者。包内共225个文件,涵盖C/C与Java示例源码、XML与XSD配置定义、bat批处理编译链接脚…

2026/10/9 15:15:50 阅读更多 →

最新新闻

如何降低大模型 Token 调用成本?2026 年模型分级、缓存、路由和提示词优化清单(TaoToken 统一 Key 实践版)

如何降低大模型 Token 调用成本?2026 年模型分级、缓存、路由和提示词优化清单(TaoToken 统一 Key 实践版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
【Bug已解决】codex: 沙箱阻止操作 — CodeX CLI 无法在沙箱中执行命令解决方案(TaoToken 统一 Key 通道版)

【Bug已解决】codex: 沙箱阻止操作 — CodeX CLI 无法在沙箱中执行命令解决方案(TaoToken 统一 Key 通道版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
通过定制SimpleCursorAdapter来实现ListView:把Cursor字段映射改到TaoToken统一Key通道的配置与验证

通过定制SimpleCursorAdapter来实现ListView:把Cursor字段映射改到TaoToken统一Key通道的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
Linux进程状态详解:从R/S/D/T/Z到线上故障排查实战

Linux进程状态详解:从R/S/D/T/Z到线上故障排查实战

做运维这些年,几乎每次面试都会拿“Linux进程状态有哪些”当开场题,而每次都能筛掉一批人。上周我带的一个徒弟出去面试,倒是把R、S、D、T、Z、X背得滚瓜烂熟,结果被追问“D状态到底意味着什么、线上遇到怎么处理”就卡壳了。其实…

2026/10/9 15:52:43 阅读更多 →
英特尔 oneAPI 工具包:用 DPC++ 打开异构计算新纪元

英特尔 oneAPI 工具包:用 DPC++ 打开异构计算新纪元

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
STGCN时空图卷积网络详解:从原理到PyTorch交通流量预测实践

STGCN时空图卷积网络详解:从原理到PyTorch交通流量预测实践

简介:这套PyTorch框架下的STGCN时空图卷积网络实现,源自IJCAI 2018论文官方代码,面向从事人体行为分析、智能监控与动作识别研究的开发者和学习者。模型通过图卷积模块提取骨骼关节点拓扑特征,结合时序卷积层捕捉动作序列动态变化…

2026/10/9 15:51:41 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →