使用MSE将二次函数拟合到数据

问题描述

所以我的想法是(从神经网络专家那里借来的)如果我有数据集D,我可以通过首先计算相对于参数(a,b和c的误差的导数)来拟合二次曲线。 ),然后进行小的更新以最大程度地减少错误。我的问题是,以下代码实际上无法管理曲线。对于线性的东西,类似的方法是可行的,但是由于某种原因,二次方似乎失败了。您能看到我做错了什么(假设还是执行错误

编辑:这个问题不够具体:以下代码不能很好地处理数据偏差。由于某种原因,它以某种方式更新了a和b参数,从而使c落后了。这种方法类似于机器人技术(使用Jacobian查找路径)和神经网络(基于错误查找参数),因此它不是不合理的算法,现在的问题是,为什么这种特定的实现方式不会产生我期望的结果。

在下面的Python代码中,我将math用作m,MSE是一个函数,用于计算两个数组之间的均方误差。除此之外,代码是自包含的

代码

@Component({
  selector: 'app-service',templateUrl: './sample.component.html',styleUrls: ['./sample.component.scss']
})
export class SampleComponent {

  constructor(private viewportScroller: ViewportScroller) {}

  public scrolltoElementId(elementId: string): void {
    this.viewportScroller.scrollToAnchor(elementId);
  }

}

解决方法

对我来说,您的代码似乎完全正确!至少算法是正确的。我已将您的代码更改为使用numpy而非纯Python进行快速计算。另外,我还配置了一些参数,例如改变了动量和学习速度,也实现了MSE

然后我用matplotlib绘制情节动画。最后,在动画上,看起来您的回归实际上试图使曲线适合数据。尽管在将sin(x)中的x拟合到[0; 2 * pi]中的sin(x)的最后一次迭代中,它看起来像是线性逼近,但是对于二次曲线而言,它仍然尽可能地靠近数据点。但是对于x[0; pi]12-th的{​​{1}}来说,它似乎是理想的近似值(它从i-th迭代开始拟合)。

dErr = 0.7 ** (i + 15)动画帧只对save进行回归。

我的动画只运行脚本有点慢,但是如果您像这样python script.py save添加参数line.gif,它将渲染/保存到python -m pip install numpy matplotlib绘图动画中。如果运行不带参数的脚本,它将在PC屏幕上实时动画显示/拟合。

完整的代码紧随图形之后,代码需要通过运行一次sin(x)安装一些python模块。

接下来是x(0,pi)的{​​{1}}:

sin(x) on x in (0,pi)

接下来是sin(x)x的{​​{1}}:

sin(x) on x in (0,2 pi)

接下来是(0,2 * pi)abs(x)的{​​{1}}:

abs(x) on x in (-1,1)

x