如何为非线性最小二乘拟合选择初始值


13

上面的问题说明了一切。基本上,我的问题是针对一个通用的拟合函数(可能会任意复杂),该函数在我尝试估算的参数中是非线性的,如何选择初始值来初始化拟合?我正在尝试做非线性最小二乘法。有什么策略或方法吗?已经研究过了吗?有参考吗?除了临时猜测之外,还有什么吗?具体来说,现在正在使用的一种拟合形式是具有我要估计的五个参数的高斯加线性形式,例如

y=Ae(xBC)2+Dx+E

其中(横坐标数据)和y = log 10(纵坐标数据)意味着在对数对数空间中,我的数据看起来像一条直线加一个高斯近似的凸点。我没有任何理论,关于如何初始化非线性拟合的任何指导,除了可能像线的斜率和凹凸的中心/宽度之类的图形和眼球之外,都没有指导我。但是我有一百多种适合的方法,而不是图形和猜测,我更喜欢一些可以自动化的方法。x=log10y=log10

我在图书馆或在线找不到任何参考。我唯一能想到的就是随机选择初始值。MATLAB提供了从[0,1]均匀分布的值中随机选择值的功能。因此,对于每个数据集,我都会运行随机初始化的拟合一千次,然后选择最高的那个。还有其他(更好的)想法吗?r2


附录1

首先,这是数据集的一些直观表示,目的是向大家展示我在谈论哪种数据。我要以原始形式发布数据,而无需进行任何形式的转换,然后将其以可视化的形式记录在日志-日志空间中,因为它阐明了某些数据的功能,同时扭曲了其他功能。我同时发布了好坏数据的样本。

好数据 记录好数据 不良数据 记录错误数据

每个图中的六个面板中的每个面板都显示四个数据集,它们分别绘制为红色,绿色,蓝色和青色,每个数据集恰好具有20个数据点。由于数据中出现的颠簸,我试图用直线加高斯拟合它们中的每一个。

第一个数字是一些好的数据。第二个图是与图一相同的好数据的对数-对数图。第三个数字是一些不良数据。第四个图是图三的对数-对数图。数据更多,这只是两个子集。大部分数据(大约3/4)都是好数据,类似于我在此处显示的好数据。

现在发表一些评论,请耐心等待,因为这可能会花费很长时间,但是我认为所有这些细节都是必要的。我会尽量简洁。

我原本期望一个简单的幂定律(意思是对数-对数空间中的直线)。当我在对数-对数空间中绘制所有图形时,我看到了4.8 mHz附近的意外凸起。对颠簸进行了彻底的调查,并在其他工作中也发现了颠簸,因此并不是我们搞砸了。它实际上在那儿,其他出版的作品也提到了这一点。因此,我只是在线性形式中添加了一个高斯项。请注意,此拟合将在对数-对数空间中完成(因此,我的两个问题包括此问题)。

现在,在阅读了Stumpy Joe Pete对我的另一个问题(根本与这些数据无关)的答案并阅读了这个这个以及其中的引用(由Clauset逐句填充)之后,我意识到我不应该适合log-log空间。所以现在我想在预先转换的空间中做所有事情。

问题1:从好的数据来看,我仍然认为在预变换空间中线性加高斯仍然是一种好形式。我很想听听其他有更多数据经验的人的想法。高斯+线性合理吗?我应该只做高斯吗?还是完全不同的形式?

问题2:无论问题1的答案是什么,我仍然需要(最有可能)非线性最小二乘拟合,因此仍需要初始化方面的帮助。

在看到两组数据的情况下,我们非常希望捕获4-5 mHz附近的第一个凸起。因此,我不想添加更多的高斯项,而我们的高斯项应以第一个颠簸为中心,这几乎总是更大的颠簸。我们希望在0.8mHz至5mHz之间的“更高的精度”。我们不太关心较高的频率,但也不想完全忽略它们。那么也许是某种权衡?还是B总是可以在4.8mHz附近初始化?

fL

L=Ae(fBC)2+Df+E.
  • f
  • L
  • AA>0A
  • B
  • CCC
  • D
  • ELELf=0

Ae(B/C)2+E.

EEf=0

L

问题3:在这种情况下,你们认为用这种方法推断什么?任何利弊?还有其他推论吗?再一次,我们只关心较低的频率,所以在0到1mHz之间外推...有时非常小的频率,接近于零。我知道这个帖子已经收拾好了。我在这里问这个问题是因为答案可能是相关的,但是如果你们愿意,我可以分开这个问题,以后再问另一个。

最后,这里是应要求提供的两个样本数据集。

0.813010000000000   0.091178000000000   0.012728000000000
1.626000000000000   0.103120000000000   0.019204000000000
2.439000000000000   0.114060000000000   0.063494000000000
3.252000000000000   0.123130000000000   0.071107000000000
4.065000000000000   0.128540000000000   0.073293000000000
4.878000000000000   0.137040000000000   0.074329000000000
5.691100000000000   0.124660000000000   0.071992000000000
6.504099999999999   0.104480000000000   0.071463000000000
7.317100000000000   0.088040000000000   0.070336000000000
8.130099999999999   0.080532000000000   0.036453000000000
8.943100000000001   0.070902000000000   0.024649000000000
9.756100000000000   0.061444000000000   0.024397000000000
10.569000000000001   0.056583000000000   0.025222000000000
11.382000000000000   0.052836000000000   0.024576000000000
12.194999999999999   0.048727000000000   0.026598000000000
13.008000000000001   0.045870000000000   0.029321000000000
13.821000000000000   0.041454000000000   0.067300000000000
14.633999999999999   0.039596000000000   0.081800000000000
15.447000000000001   0.038365000000000   0.076443000000000
16.260000000000002   0.036425000000000   0.075912000000000

第一列是以兆赫为单位的频率,在每个数据集中都相同。第二列是一个良好的数据集(第一个和第二个数据良好,图5,红色标记),第三列是一个不好的数据集(三个和四个不良数据,图5,红色标记)。

希望这足以激发更多开明的讨论。谢谢大家


+1以获取更多信息,但是现在看来这是一个新问题。顺便说一句,如果您现在想删除上一个信息,我认为可以,您现在已经覆盖了它的其他信息。
Glen_b-恢复莫妮卡

@Glen_b为什么会这样?为什么看起来像一个新问题?至于老问题,我们大家都在争分;-D和老问题有两个投票,通过任何方式将其合并,这样我也可以保留这两个投票吗?
定点

对于初学者来说,您现在要问的是应该适合什么,而不是像以前那样指定适合的东西。还有许多其他差异,我认为其中一些相当重要。我将考虑更改答案,但我认为这可以作为原始的问题和答案,而您要求其他内容的新部分可能是新的问题。现在,请您自行判断。
Glen_b-恢复莫妮卡

@Glen_b很公平,我删除了多余的问题。所以问题仍然存在,我有一些要使用线性+高斯形式拟合的数据,我能比随机初始化好吗?
定点

我认为我的当前答案表明,至少在某些情况下,您可以做得更好,而@whuber提出的建议甚至比我的流程还要简单。我可以回头看看我对您的数据的表现如何,但是就目前情况来看,它确实为如何设置此类起点提供了一些思路。
Glen_b-恢复莫妮卡

Answers:


10

如果有一种既通用的策略(始终有效),那么它会在每个非线性最小二乘法程序中都已实施,并且起始值将不是问题。

对于许多特定的问题或一系列问题,存在一些非常好的开始价值的方法。有些软件包提供了针对特定非线性模型的良好初始值计算功能,或者提供了通常可以使用的更通用方法,但可能必须通过提供更多特定功能或直接输入初始值来获得帮助。

在某些情况下,有必要探索该空间,但是我认为您的情况可能会使得更具体的策略可能会值得-但设计一个好的策略几乎需要很多我们不具备的领域知识。

x

yx

A

如果可能的话,一些示例数据会有所帮助-典型案例和困难案例。


编辑:这是一个示例,说明如果问题不太嘈杂,您将如何做得很好:

这是从模型中生成的一些数据(人口值是A = 1.9947,B = 10,C = 2.828,D = 0.09,E = 5):

nls数据

我能够估计的起始值为
(As = 1.658,Bs = 10.001,Cs = 3.053,Ds = 0.0881,Es = 5.026)

该初始模型的拟合如下所示:

nlstart

这些步骤是:

  1. 拟合Theil回归以获得D和E的粗略估计
  2. 减去Theil回归的拟合
  3. 使用LOESS拟合平滑曲线
  4. 找到峰以得到A的粗略估计,并找到与峰对应的x值以得到B的粗略估计。
  5. 将y值大于A的估计值的60%的LOESS拟合作为观察值,并拟合二次方
  6. 使用二次方来更新B的估计值并估计C
  7. 从原始数据中减去高斯估计
  8. 将另一个Theil回归拟合到调整后的数据以更新D和E的估计

在这种情况下,这些值非常适合启动非线性拟合。

我将其编写为R代码,但可以在MATLAB中完成相同的操作。

我认为比这更好的事情是可能的。

如果数据非常嘈杂,则根本无法正常工作。


Edit2:如果有人感兴趣,这是我在R中使用的代码:

gausslin.start <- function(x,y) {

  theilreg <- function(x,y){
    yy <- outer(y, y, "-")
    xx <- outer(x, x, "-")
    z  <- yy / xx
    slope     <- median(z[lower.tri(z)])
    intercept <- median(y - slope * x)
    cbind(intercept=intercept,slope=slope)
  }

  tr <- theilreg(x,y1)
  abline(tr,col=4)
  Ds = tr[2]
  Es = tr[1]
  yf  <- y1-Ds*x-Es
  yfl <- loess(yf~x,span=.5)

  # assumes there are enough points that the maximum there is 'close enough' to 
  #  the true maximum

  yflf   <- yfl$fitted    
  locmax <- yflf==max(yflf)
  Bs     <- x[locmax]
  As     <- yflf[locmax]

  qs     <- yflf>.6*As
  ys     <- yfl$fitted[qs]
  xs     <- x[qs]-Bs
  lf     <- lm(ys~xs+I(xs^2))
  bets   <- lf$coefficients
  Bso    <- Bs
  Bs     <-  Bso-bets[2]/bets[3]/2
  Cs     <- sqrt(-1/bets[3])
  ystart <- As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es

  y1a <- y1-As*exp(-((x-Bs)/Cs)^2)
  tr  <- theilreg(x,y1a)
  Ds  <- tr[2]
  Es  <- tr[1]
  res <- data.frame(As=As, Bs=Bs, Cs=Cs, Ds=Ds, Es=Es)
  res
}

# population parameters: A = 1.9947 , B = 10, C = 2.828, D = 0.09, E = 5
# generate some data
set.seed(seed=3424921)
x  <- runif(50,1,30)
y  <- dnorm(x,10,2)*10+rnorm(50,0,.2)
y1 <- y+5+x*.09 # This is the data
xo <- order(x)

starts <- gausslin.start(x,y1)
ystart <- with(starts, As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es)
plot(x,y1)
lines(x[xo],ystart[xo],col=2)

3
+1。重复拟合一千次并选择最佳拟合(如果我正确理解的话)听起来很奇怪:如果模型对于数据合理且具有良好的初始值,则非线性最小二乘应收敛。自然,第二个就是您要问的问题。但是似乎暗示您可能需要为每个拟合选择不同的起始值,这似乎是悲观的。
Nick Cox

1
@NickCox归结为遇到的问题的范围-如果我记得较早的帖子,OP会遇到大量此类问题,但是我不记得之前看到过足够的细节来提出好的建议,尽管我投入了一些时间去寻找潜在的方法(没有产生足够明确的东西来发布)。OP可能具有某种领域知识,可以产生良好的开始价值,几乎总是可以解决他或她的问题。
Glen_b-恢复莫妮卡


3
|A|BA>0CA1/4A>0A<0

2
BB

6

有一种通用的方法可以拟合这类非线性模型。它涉及用在第一个,最后一个频率值处的因变量值和在中间的第6个点处的好点重新设置线性参数的参数。那么您可以固定这些参数,并在最小化的第一阶段求解非线性参数,然后最小化总体5个参数。

Schnute和我在1982年左右拟合出鱼的生长模型时发现了这一点。

http://www.nrcresearchpress.com/doi/abs/10.1139/f80-172

但是,没有必要阅读本文。由于参数是线性的,因此仅需建立并求解一个3x3线性方程组,即可使用模型的稳定参数化。

对于您的模型,线性部分由矩阵确定M

M=(exp(((x(1)B)/C)2)x(1)1exp(((x(6)B)/C)2)x(6)1exp(((x(n)B)/C)2)x(n)1)
n=20
DATA_SECTION
  init_int n
  int mid
 !! mid=6;
  init_matrix data(1,n,1,3)
  vector x(1,n)
  vector y(1,n)
 !! x=column(data,1);
 !! y=column(data,3);   //use column 3
PARAMETER_SECTION
  init_number L1(3)     //(3) means estimate in phase 3
  init_number Lmid(3)
  init_number Ln(3)

  vector L(1,3)
  init_number log_B       // estimate in phase 1
  init_number log_C(2)    // estimate in phase 2 
  matrix M(1,3,1,3);
  objective_function_value f
  sdreport_vector P(1,3)
  sdreport_number B
  sdreport_number C
  vector pred(1,n);
PROCEDURE_SECTION
  L(1)=L1;
  L(2)=Lmid;
  L(3)=Ln;
  B=exp(log_B);
  C=exp(log_C);
  M(1,1)=exp(-square((x(1)-B)/C));
  M(1,2)=x(1);
  M(1,3)=1;
  M(2,1)=exp(-square((x(mid)-B)/C));
  M(2,2)=x(mid);
  M(2,3)=1;
  M(3,1)=exp(-square((x(n)-B)/C));
  M(3,2)=x(n);
  M(3,3)=1;

  P=solve(M,L);  // solve for standard parameters 
                 // P is vector corresponding to A,D,E

  pred=P(1)*exp(-square((x-B)/C))+P(2)*x+P(3);
  if (current_phase()<4)
    f+=norm2(y-pred);
  else
    f+=0.5*n*log(norm2(y-pred))  //concentrated likelihood

BCBBC

在此处输入图片说明

对于您的数据不良的情况,它很容易拟合,并且(通常)参数估计为:

         estimate    std dev
A      2.0053e-01 5.8723e-02
D      1.6537e-02 4.7684e-03
E     -1.8197e-01 7.3355e-02
B      3.0609e+00 5.0197e-01
C      5.6154e+00 9.4564e-01]

戴夫,这很有趣,但是引起了一些问题。确切地说,“这类非线性模型”是什么意思?问题首先涉及“通用拟合函数”,但您的描述仅涉及“全部5个参数”。
ub

我的意思是像vonbertalanffy或logistic或double指数模型。在所有情况下,模型的某些参数都是线性的,而其他参数则是非线性的。人们通常试图通过集中于非线性参数来对其进行变换,以获得更稳定的参数设置。但是,这是错误的方法。是应该修改的线性参数,因此,例如对于4参数逻辑模型,模型在上下渐近线处是线性的,但应该使用最小和最大ind的预测值,而不是使用这些参数。变种
dave fournier

@davefournier感谢您回答并指出您的论文。您的论文似乎很难理解,但这项技术听起来很有趣,所以迫不及待想阅读它。
定点

2

如果您必须多次执行此操作,那么我建议您在SSE函数上使用演化算法作为前端,以提供初始值。

另一方面,您可以使用GEOGEBRA使用参数的滑块创建函数,并使用它们来获取初始值。

数据的起始值可以通过观察来估计。

  1. D和E来自数据的斜率和截距(忽略高斯)
  2. A是距Dx + E线估计的高斯最大值的垂直距离。
  3. B是高斯最大值的x值
  4. C是高斯表观宽度的一半

1

对于初始值,您可以进行普通的最小二乘拟合。它的斜率和截距将是D和E的起始值。最大残差将是A的起始值。最大残差的位置将是B的起始值。也许有人可以建议sigma的起始值。

但是,没有从主题知识中得出任何机械方程式的非线性最小二乘是有风险的,并且做很多单独的拟合会使事情变得更成问题。您提出的方程式背后是否有任何主题知识?是否还有其他独立变量与100个左右拟合之间的差异相关?如果您可以将这些差异合并到一个方程式中,一次适合所有数据,则可能会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.