NumPy有一个
polyfit function,通过一组点很容易找到最合适的线:
coefs = npoly.polyfit(xi, yi, 1)
所以真的唯一的困难就是找到断点.对于给定的一组
断点通过给定的数据找到最合适的线条是微不足道的.
因此,而不是试图找到断点和系数的位置
一次性线性部分,足以使参数空间最小化
断点.
由于断点可以通过它们的整数索引值指定到x数组中,
参数空间可以被认为是N维的整数网格上的点,其中
N是断点的数量.
optimize.curve_fit不是这个问题的最小化器的好选择
因为参数空间是整数值.如果你要使用curve_fit,
算法会调整参数以确定在哪个方向上
移动.如果调整小于1个单位,则断点的x值不会
更改,因此错误不会更改,因此算法不会获得任何信息
关于移动参数的正确方向.因此curve_fit
当参数空间基本上是整数值时,往往会失败.
一个更好但不是非常快的最小化器将是一个强力网格搜索.如果
断点的数量很小(x值的参数空间是
小)这可能就足够了.如果断点的数量很大和/或
参数空间很大,那么也许设置一个多级粗/细
(蛮力)网格搜索.或者,也许有人会建议一个比蛮力更聪明的最小化器……
import numpy as np
import numpy.polynomial.polynomial as npoly
from scipy import optimize
import matplotlib.pyplot as plt
np.random.seed(2017)
def f(breakpoints, x, y, fcache):