八、过拟合问题

本文详细介绍了过拟合的概念及其解决方案,并重点探讨了通过归一化处理过拟合问题的方法,包括线性回归和逻辑回归中的应用。

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

1、过拟合-overfitting定义

\qquad 如果我们设置过多的特征,通过机器学习获得的假设函数将会和实验数据高度重合(成本函数的值将会十分接近于0),但是这样会使得获得的模型不能较好地预测新的样本数据值,这种问题叫做过拟合问题。通俗地说,就是学习出来的模型不具有良好的“推广”性(generalize),实用性很差。
在这里插入图片描述
在这里插入图片描述

2、怎样处理过拟合问题

方法一:
\qquad 减少特征数量,可以通过手动选择保留哪些特征,或者通过“模型选择”算法来实现特征筛选。
方法二:
\qquad 归一化-Regularization,这种方法不需要减少特征数量,但是需要减少特征项的大小;归一化对于特征值很多时会取得较好的效果,尤其是各个特征对于结果值都有所贡献的时候。

3、归一化

\qquad 为了应对过拟合问题,可以通过增加特征项在成本函数中的成本值来克服过拟合问题。例如,假如我们想使得下面的函数更加偏向二次函数:
θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 \theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4 θ0+θ1x+θ2x2+θ3x3+θ4x4 \qquad 我们想要减少三次方项 θ 3 x 3 \theta_3x^3 θ3x3和四次方项 θ 4 x 4 \theta_4x^4 θ4x4的影响,同时不将这两项从假设函数中删除,我们可以在成本函数中针对三次方项 θ 3 x 3 \theta_3x^3 θ3x3和四次方项 θ 4 x 4 \theta_4x^4 θ4x4增加两项惩罚项:
m i n θ 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + 1000 θ 3 2 + 1000 θ 4 2 min_\theta\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2+1000\theta_3^2+1000\theta_4^2 minθ2m1i=1m(hθ(x(i))y(i))2+1000θ32+1000θ42 \qquad 在成本函数中增加了两项罚项之后,为了使得最终成本函数最小化,最终参数 θ 3 \theta_3 θ3 θ 4 \theta_4 θ4的值必定比较小,从而减小了高次方项的影响,可以缓解过拟合问题。
\qquad 上述方式的问题在于,给予哪些特征项参数惩罚很难确定,因为很难判断哪些特征项之间有较强的相关性,同时惩罚项的系数确定也是一个问题,系数的选择既不能太大也不能太小。所以有下述通用归一化成本函数:
m i n θ 1 2 m ( ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ) min_\theta\frac{1}{2m}(\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2) minθ2m1(i=1m(hθ(x(i))y(i))2+λj=1nθj2) \qquad 其中, λ \lambda λ是归一化参数,当 λ \lambda λ取值过大时,会造成欠拟合问题,如除了参数 θ 0 \theta_0 θ0之外,其他参数均取值为0;若 λ \lambda λ取值过小,则不能起到消除过拟合的作用,还是可能出现过拟合问题。

3.1 线性回归归一化

\qquad 对归一化之后的成本函数使用梯度下降法的流程如下所示:
在这里插入图片描述
\qquad 将归一化项提出来之后可以变为以下的形式:
在这里插入图片描述
\qquad 其中, 1 − α λ m 1-\alpha\frac{\lambda}{m} 1αmλ项小于1,所以相对于不归一化处理的梯度下降更新式来说,只是将 θ \theta θ项进行了缩小处理。
\qquad 使用了归一化的正规方程的形式如下所示:
在这里插入图片描述
\qquad 使用归一化还可以解决矩阵 X T X X^TX XTX不可逆的问题,可以证明在 λ \lambda λ大于0的情况下, X T X + λ ⋅ L X^TX+\lambda ·L XTX+λL是可逆的。

3.2 逻辑回归归一化

\qquad 对归一化之后的成本函数使用梯度下降法的流程如下所示:
在这里插入图片描述
\qquad 成本函数的表示形式如下所示:
在这里插入图片描述
\qquad 相对于原本的逻辑回归成本函数,上述成本函数多出了最后的归一化项。

THE END

在C++中,如果你想要通过点拟合曲线,通常可以使用贝塞尔曲线(Bézier curve)来实现。贝塞尔曲线是一种数学模型,它可以通过控制点来描绘平滑的曲线,非常适合近似数据点。对于8个点的情况,这通常是通过构建一个二次贝塞尔曲线(Quadratic Bézier),由三个控制点定义两个线段组成的。 以下是一个简单的步骤概述: 1. **确定控制点**:你需要三个控制点 P0、P1 和 P2 来定义一个从第一个点到第二个点的曲线。如果只有8个数据点,则可能会需要进一步处理,比如将它们分为两组(每组4个)并分别计算两个部分的贝塞尔曲线。 2. **贝塞尔函数**:C++ 中可以使用公式来计算任意时间 t 下的贝塞尔曲线坐标: - 对于t介于0和1之间的值,点B(t) = (1-t)^2 * P0 + 2*(1-t)*t * P1 + t^2 * P2 3. **遍历数据点**:为了得到整个曲线,你可以循环遍历每个数据点对应的时间 t,并应用上述贝塞尔函数。 ```cpp // 示例代码 #include <cmath> struct Point { double x; double y; }; double bezier(Point p0, Point p1, Point p2, double t) { return (1 - t) * (1 - t) * p0.x + 2 * (1 - t) * t * p1.x + t * t * p2.x; } void fitCurve(const std::vector<Point>& data, Point& curve[3]) { // 简化假设,这里只是一个基本示例,实际可能需要优化算法 curve[0] = data[0]; curve[1] = (data[1] + data[2]) / 2.0; // 中间点作为P1 curve[2] = data[3]; // 最后一点作为P2 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dragon Fly

多谢老板赏钱[抱拳抱拳抱拳]

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值