拟合多项式曲线

  • 前提
  • 基本流程设计
  • 评估样本偏离程度
  • 确定多项式项数
  • 扩展样本点
  • 采样模块
  • 计算模型
  • 总结


前提

  1. 现有指标项,以及指标多项式公式。指标项代入公式计算指标项分数
  2. 指标项分数会人为修改
  3. 每月都有指标分数,积累样本
  4. 根据样本更新迭代多项式公式

基本流程设计

我们的目标就是使用最小二乘法,根据样本拟合多项式曲线(模型)。
在前期设计时产生了以下几个主要的问题:

  1. 首先样本的来源不同,样本集里可能参杂着一些残缺的样本,以及偏离较大的样本,这些样本参与计算会影响拟合曲线的准确性。所以在拟合曲线前要对样本进行处理
  2. 最小二乘法拟合曲线需要知道多项式的项数,项数过大会造成过拟合,怎么确定这个项数
  3. 样本存在点过于集中的情况,x值都相等或极其接近

考虑到这些问题我们设计处理流程

python 多项式图像曲线斜率_概率论

评估样本偏离程度

要评估样本偏离程度,首先要有一个标准。对于我们的目标来说这个标准就是一条多项式曲线,由于我们是迭代升级公式,我们可以使用原公式作为评估标准。
根据原公式我们计算样本的 z分数 来评估样本(x,y):

python 多项式图像曲线斜率_拟合_02
z分数在[-3,3]上一般可以当作合理样本使用。如果想提高精度可以适当缩小范围。
假如没有原公式,就假设所有样本都不偏离去拟合一个公式作为标准。

确定多项式项数

这个问题应该是最麻烦的,使用最小二乘法计算多项式时,项数越接近样本数量,它的误差值越小,直到无误差(曲线过所有样本点),出现过拟合现象。
为了寻找最合适的项数,我们把样本随机分成两部分,一部分用于拟合曲线的训练集,一部分用于验证曲线的校验集,分别计算训练集和校验集相对于曲线的误差。
随着曲线的项数增加,曲线一定是越来越接近训练集的点,所以训练集误差越来越小;
而对于校验集而言,曲线因该是先越来越接近校验集的点,在发生过拟合后开始远离校验集的点,所以校验集误差是先变小后增大。
所以我们去寻找在校验集误差拐点处点的曲线。

扩展样本点

在样本数量比较少,或样本过于集中时,比如所有样本都是(5,y),这样一拟合曲线就变成了x=5的一条竖线来,我们需要增加一些样本来约束拟合点曲线。
这里我们根据原公式计算若干分散的点补充样本。

采样模块

解决了几个大问题后我们细致设计一下采样流程,采样模块根据需要随机选取数据作为样本,我这里使用了所有数据作为样本。综合扩展样本后,计算样本偏离程度并做好标记。最后输出样本集。

python 多项式图像曲线斜率_机器学习_03

计算模型

我们使用k折交叉验证的方法,k折校验就是将样本分为k份,每次取一份作为测试集,剩余的作为校验集,重复k次后计算误差的平均值。这样做是为了减小分配样本产生的偶然误差。

python 多项式图像曲线斜率_拟合_04


曲线项数判断规则其实比较难定,抛开误差因素的影响,理论上在校验集误差拐点附近的曲线都有可能是最优解。定下一个规则就取误差拐点前的那条曲线。

总结

确定曲线项数时,出现误差上下波动的情况。这是样本数量太少太集中导致的,扩展样本数量太多又会导致拟合曲线与样本之间的关系拉大。这种情况理应不拟合新曲线。
自己写了一个最小二乘法求曲线的方法,结果一会儿结果溢出,一会儿死循环。最后找的apache的计算包来算。以后自己写的玩玩就好,没经过检验还是不要拿出来了。