C C++最全最小二乘法,2024年最新吃一堑长一智

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差(真实目标对象与拟合目标对象的差)的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

  • 最小二乘法还可用于曲线拟合。对于平面中的这n个点,可以使用无数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。
    选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小
  • 最小二乘法也是一种优化方法,求得目标函数的最优值。并且也可以用于曲线拟合,来解决回归问题。回归学习最常用的损失函数是平方损失函数,在此情况下,回归问题可以著名的最小二乘法来解决。

简而言之,最小二乘法同梯度下降类似,都是一种求解无约束最优化问题的常用方法,并且也可以用于曲线拟合,来解决回归问题。

监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。

最小二乘法处理的一般模型表达式如下:
在这里插入图片描述
视问题复杂度而定x取几次方。这里可能有人有疑问,最小二乘不是处理线性问题吗?怎么 x^n都出来了?

注意,我们的目的是求取一个非线性方程,但当我们用最小二乘求解时,我们针对的是θ变量,而不是x ,也就是说,机器学习中,这里的x 是输入,是已知量,y 是输出,是预测量, θ 才是我们要学习的变量,所以这还是一个线性问题

2、定义误差

当然是真实值与拟合值的差
在这里插入图片描述
但为啥要平方(2范数)呢?绝对值(1范数)不可以吗?

因为误差是长度,还要取绝对值,计算起来麻烦,就干脆用平方来代表误差。而且平方要比绝对值更能得到最短距离,即使得误差最小化,也就是更能使得拟合函数逼近真实函数。

2.1怎样最小化误差

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 什么情况下能用这矩阵形式求解

从上面的最后一个式子可以看出,只有当矩阵

X

T

X

X^T X

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C++编写的计算迭代最小二乘法的示例代码: ```cpp #include <iostream> #include <cmath> #include <vector> using namespace std; const double EPS = 1e-8; // 精度要求 // 计算向量的模长 double norm(vector<double>& x) { double res = 0; for (int i = 0; i < x.size(); i++) { res += x[i] * x[i]; } return sqrt(res); } // 计算向量的点积 double dot(vector<double>& x, vector<double>& y) { double res = 0; for (int i = 0; i < x.size(); i++) { res += x[i] * y[i]; } return res; } // 计算矩阵的转置 vector<vector<double>> transpose(vector<vector<double>>& A) { int m = A.size(), n = A[0].size(); vector<vector<double>> res(n, vector<double>(m)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { res[j][i] = A[i][j]; } } return res; } // 计算矩阵的乘积 vector<vector<double>> multiply(vector<vector<double>>& A, vector<vector<double>>& B) { int m = A.size(), n = A[0].size(), p = B[0].size(); vector<vector<double>> res(m, vector<double>(p)); for (int i = 0; i < m; i++) { for (int j = 0; j < p; j++) { for (int k = 0; k < n; k++) { res[i][j] += A[i][k] * B[k][j]; } } } return res; } // 计算迭代最小二乘法 vector<double> iterative_least_squares(vector<vector<double>>& A, vector<double>& b, int max_iters) { int m = A.size(), n = A[0].size(); vector<double> x(n), r(m), p(m), Ap(m); vector<vector<double>> AtA = multiply(transpose(A), A); // 初始化x for (int i = 0; i < n; i++) { x[i] = 0; } for (int k = 0; k < max_iters; k++) { // 计算残差r = b - Ax for (int i = 0; i < m; i++) { r[i] = b[i] - dot(A[i], x); } // 判断是否满足精度要求 if (norm(r) < EPS) { break; } // 计算搜索方向p = (AtA)^(-1)r Ap = multiply(AtA, p); for (int i = 0; i < m; i++) { p[i] = r[i] - Ap[i]; } // 计算步长alpha = (r^T)p / (p^T Ap) double alpha = dot(r, p) / dot(p, Ap); // 更新x = x + alpha * p for (int i = 0; i < n; i++) { x[i] += alpha * p[i]; } } return x; } int main() { vector<vector<double>> A = {{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}}; vector<double> b = {2.1, 3.9, 6.0, 8.0, 9.8}; vector<double> x = iterative_least_squares(A, b, 100); // 输出结果 cout << "The solution is: "; for (int i = 0; i < x.size(); i++) { cout << x[i] << " "; } cout << endl; return 0; } ``` 以上代码实现了迭代最小二乘法的计算过程,其中 `iterative_least_squares` 函数接收一个系数矩阵 `A` 和一个常数向量 `b`,并返回最小二乘解向量 `x`。在实现中,使用了共轭梯度法来求解迭代方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值