我有。对于到的估计,我使用本文的公式:John非线性回归和非线性最小二乘法 在本文中,通过查看数据来估计。如果我这样做,即使我只有三点,它也能正常工作。由此我可以计算出另外两个。我用R中的nls()和C#中的LevenbergMarquardt测试了我的参数。他们返回的模型令人满意。 β1β3
问题是我不想查看数据来获得的良好估计量,而是希望我的程序对其进行计算。一段时间以来,我使用的值比我的最大值(在\ max * 1.1和\ max * 1.5之间的值)高一点。只要这些点覆盖了函数的大部分,此方法就可以正常工作。数据点位于曲线“顶部”的某个位置,但是当它们全部来自拐点“下方”时,此估计量肯定低于应有的水平,因此我无法拟合模型。绝对高于最高点(通过将其乘以高得离谱的值),模型无法以任何有用的方式拟合。
测量可能如下所示:
x =(40,50,60,70),y =(1000,950,400,200)->易于估计
x =(40,50,60,70),y =(1000,950,800,100)->易于估计
x =(40,50,60,70),y =(500,200,100,50)->估计起来不太容易
我想我可以通过计算给定点的增量并根据其计算上限来找出我在函数中的位置(在“底部”,在“顶部”,在坡度中)。有没有人暗示有更好的解决方案?附加信息:如果无法完成,对我来说,更重要的一点是,可以拟合的测量结果要尽可能地好,并且我接受某些测量结果根本无法拟合的问题。
(尽管我想要在这里发布的C#实现,但我认为问题不取决于语言)
更新(此应用):
x是温度值,y是相应的测量值。从本质上讲,它应该看起来像逻辑曲线,在较低温度下具有较高的y值,反之亦然。熔点等于曲线的拐点,随着模型参数的微小变化,其变化很大。
更新(一些由7个数据点组成的数据,已知拐点为60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
我当前的上限估计方法是y0 * y0 / y1。通过这种方式,我希望考虑到我可能并不总是拥有接近最大值的值。
更新: x和y值永远不会为负。除非丢失数据点,否则x将始终为{40、45、50、55、60、65、70}。
更新: 我对模拟数据进行了很多测试,这些数据应该很容易拟合(我选择了曲线上精确的数据点=没有任何噪声),并且我发现它可以正常工作,除非第一个或第二个数据点(其中x = 40或x = 45)丢失。我想我将不得不放弃这些测量,而用户将不得不接受这些测量。