例如,我的任务是处理以下数据:
(轴不重要,数据也不代表我的问题)。假设我的自由度是如此高,以至于在进行曲线拟合时,我不希望建模比3度多项式更高的模型,通常它们都应该是线性的。
与数据的正确拟合看起来像这样:
但是,我只能设法拟合这两条线,因为我任意地注意到,在我的图形中指示的点上,数据的定性行为似乎从常规(从大致恒定变为大致线性)出现了中断。改变了坡度,选择了任意线性模型
在没有先验知识的情况下是否可以通过某种方式完成此操作?我正在尝试编写一个程序,该程序会自动打开一个数据文件,并选择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)
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数组,以及两个具有斜率的数组在他们之中。
为什么将[-slope,slope]
数组附加到“ slopeA的搜索范围”和“ slopeB的搜索范围”?为什么使用x和y的最大值和最小值构造它?他们猜测是要找到每块正确的坡度吗?
那里的十个人在做什么?为什么要这样做是为了“安全边际”?
differential_evolution
是否不用于查找多元函数的最小值?它到底在做什么?
modelPredictions = func(xData, *fittedParameters)
absError = modelPredictions - yData
xData
和*fittedParameters
为何满足func
所需参数的数量?
最后,这段代码如何找到断点?
答案 0 :(得分:3)
这里是示例代码,将两条不同的直线拟合到数据集,并且还自动拟合了两条直线之间的断点。本示例使用标准的scipydifferential_evolution遗传算法模块,该模块使用Latin Hypercube算法来确保对参数空间进行彻底搜索,并要求在搜索范围内进行搜索。在此示例中,这些界限取自数据的最大值和最小值。
var labelOne = document.getElementById( 'label_1' ),
tipTextOne = document.createTextNode( 'Lorem impus dolor sit amet' ),
tipElOne = document.createElement( 'span' );
tipElOne.appendChild( tipTextOne );
labelOne.appendChild( tipElOne );