自动发现数据中的分段回归断点

时间:2019-06-04 20:27:21

标签: python machine-learning linear-regression

例如,我的任务是处理以下数据:

enter image description here

(轴不重要,数据也不代表我的问题)。假设我的自由度是如此高,以至于在进行曲线拟合时,我不希望建模比3度多项式更高的模型,通常它们都应该是线性的。

与数据的正确拟合看起来像这样:

enter image description here

但是,我只能设法拟合这两条线,因为我任意地注意到,在我的图形中指示的点上,数据的定性行为似乎从常规(从大致恒定变为大致线性)出现了中断。改变了坡度,选择了任意线性模型

在没有先验知识的情况下是否可以通过某种方式完成此操作?我正在尝试编写一个程序,该程序会自动打开一个数据文件,并选择2条曲线拟合之间的点。我正在寻找指导或解释或类似的内容,这些将使我了解如何在2个不同的曲线拟合或模型之间找到点,然后为数据的每个部分选择合适的模型(具有合适的多项式次数)

我认为我的问题本质上是在问我如何学习分段回归。

附录

詹姆斯·飞利浦(James Philips)的答案似乎是我想要的,但是我现在需要了解的是代码的工作方式。现在,我会对此感到困惑,因为现在对这些问题的回答将取决于如何理解代码的工作原理。

def sumOfSquaredError(parameterTuple):
    warnings.filterwarnings("ignore") # do not print warnings by genetic algorithm
    val = func(xData, *parameterTuple)
    return numpy.sum((yData - val) ** 2.0)
  1. val到底是什么?为什么我们使用平方误差之和而不是平均值?

def generate_Initial_Parameters(): # min and max used for bounds

    maxX = max(xData)
    minX = min(xData)
    maxY = max(yData)
    minY = min(yData)
    slope = 10.0 * (maxY - minY) / (maxX - minX) # times 10 for safety margin

    parameterBounds = []
    parameterBounds.append([minX, maxX]) # search bounds for breakpoint
    parameterBounds.append([-slope, slope]) # search bounds for slopeA
    parameterBounds.append([minY, maxY]) # search bounds for offsetA
    parameterBounds.append([-slope, slope]) # search bounds for slopeB
    parameterBounds.append([minY, maxY]) # search bounds for offsetB


    result = differential_evolution(sumOfSquaredError, parameterBounds, seed=3)
    return result.x

这不只是索要x和y数据,然后创建一个名为parameterBounds的数组,它仅向其中添加了分别编码x和y的最小值和最大值的1x2数组,以及两个具有斜率的数组在他们之中。

  1. 为什么将[-slope,slope]数组附加到“ slopeA的搜索范围”和“ slopeB的搜索范围”?为什么使用x和y的最大值和最小值构造它?他们猜测是要找到每块正确的坡度吗?

  2. 那里的十个人在做什么?为什么要这样做是为了“安全边际”?

  3. differential_evolution是否不用于查找多元函数的最小值?它到底在做什么?

    modelPredictions = func(xData, *fittedParameters)

    absError = modelPredictions - yData

  4. xData*fittedParameters为何满足func所需参数的数量?

最后,这段代码如何找到断点?

1 个答案:

答案 0 :(得分:3)

这里是示例代码,将两条不同的直线拟合到数据集,并且还自动拟合了两条直线之间的断点。本示例使用标准的scipydifferential_evolution遗传算法模块,该模块使用Latin Hypercube算法来确保对参数空间进行彻底搜索,并要求在搜索范围内进行搜索。在此示例中,这些界限取自数据的最大值和最小值。

plot

var labelOne = document.getElementById( 'label_1' ),
tipTextOne = document.createTextNode( 'Lorem impus dolor sit amet' ),
tipElOne = document.createElement( 'span' );

tipElOne.appendChild( tipTextOne );
labelOne.appendChild( tipElOne );