1

我想要适合以下功能:将信噪比enter image description here降到我的数据中。 C1,C2和h是我需要从leastsq方法获得的参数。 C1和C2很简单,但问题是我的h(t)实际上是:Function based on B-Splines。我想获得的是函数内部的系数hj(在我的例子中有35个不同的hj)。该函数是不同基底B样条的总和,每个样条加权不同,系数数量等于B样条的结点数量。正如我想获得C1,C2和h1..35我执行以下操作:leastsq麻烦传递参数Python

funcLine = lambda tpl, eix_x: (tpl[0]*np.sin((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1) + tpl[1]*np.cos((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1))*np.exp(-4*np.power(k, 2)*lambda_big*np.power(eix_x, 2)) 
func = funcLine 
ErrorFunc = lambda tpl, eix_x, ydata: np.power(func(tpl, eix_x) - ydata,2) 
tplFinal1, success = leastsq(ErrorFunc, [2, -2, 8.2*np.ones(35)], args=(eix_x, ydata)) 

TPL(0)= C1,TPL(1)= C2和TPL(2..35)=我的系数。 bsplines_evaluades是一个矩阵[35,86000],其中每行是每个基b样条的时间函数,所以我用每个行的各个系数加权,86000是eix_x的长度。 ydata(eix_x)是我想要近似的函数。 lambda1 = 0.1903; lambda_big = 2; K = 2 * PI/lambda1。输出是与逻辑不同的初始参数。 任何人都可以帮助我吗?我也尝试过curvefit,但它不起作用。 数据位于:http://www.filedropper.com/data_5>http://www.filedropper.com/download_button.png width = 127 height = 145 border = 0 />
http://www.filedropper。 COM>在线备份存储

编辑 代码现在的问题是:

lambda1 = 0.1903 
k = 2 * math.pi/lambda1 
lambda_big = 2 
def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl(1), tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) # weight each 
    theta = 4 * np.pi * np.array(hsum) * np.array(eix_x)/lambda1 
    return (C1*np.sin(theta)+C2*np.cos(theta))*np.exp(-4*lambda_big*(k*eix_x)**2) # lambda_big = 2 
if len(eix_x) != 0: 
    ErrorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
    param_values = 7.5 * np.ones(37) 
    param_values[0] = 2 
    param_values(1) = -2 
    tplFinal2, success = leastsq(ErrorFunc, param_values, args=(eix_x, ydata)) 

的问题是,输出参数不相对于最初的那些改变。数据(X_AXIS,YDATA,bsplines_evaluades): gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7 gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96af gist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71

回答

0

它总是有帮助的(对自己以及我们)提供可读的例子足够完整,可以运行。您的lambda s和很长的行的例子绝对不可读,因此您很容易错过简单的错误。使用Python的一个要点是使代码更易于阅读。

可以将样条系数作为拟合变量,但您希望将变量的np.ndarray精确为一维。所以你的参数数组应该是

param_values = 8.2 * np.ones(37) 
param_values[0] = 2 
param_values[1] = -2. 
result_params, success = leastsq(errorFunc, param_values, ....) 

也应该可以使用curve_fit()了。除此之外,很难提供很多帮助,因为既没有给出完整的可运行程序(留下很多未定义的术语),也没有运行代码的输出或错误消息。

+0

非常感谢您的评论,下次我将尝试更好地解释(我将在本文中进行编辑以阐明它)。现在的问题是,在最少次数之后输出参数没有改变的参数的初始值并不重要。你知道我该如何发布我拥有的数据(表格),以便人们可以尝试吗? –

+0

你的代码仍然使用lambda,并且有很多未定义的变量(k,lambda1,lambda_big,bsplines_evaluades)。它不能由其他人运行。您仍然没有发布输出或错误消息。对于发布数据,许多人使用github gists或其他类似的服务。 –

+0

但是,现在我可以对你的代码进行排序了:如果bsplines_evaluades是一个数组(看起来像是),那么你的拟合不会取决于你的35个参数的个别值,而只取决于总和他们给。也就是说,你实际上并不使用'h',只使用'hsum'。那是故意的吗?它肯定会使适合的结果对大多数这些值不太敏感。 –

0

有几件事情可能是错在这里:我m不确定你是否正确索引tpl阵列(如果它有37个条目,索引应该是0:36)。你的errorFunc可能应该返回残差而不是残差。

最后,我认为你的h-sum可能不正确:你想总结$ N $轴而不是$ x $轴,对吧?

如下你可能会整理你的代码,看看是否有帮助(没有一些数据很难测试自己):

def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl[1], tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) 
    theta = 4 * np.pi * hsum * eix_x/lambda1 
    return (C1 * np.sin(theta) + C2 * np.cos(theta)) * np.exp(-4 *lambda_big * 
       (k * eix_x)**2) 

errorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
tplFinal2, success = leastsq(errorFunc, [2, -2, 8.2*np.ones(35)], 
          args=(eix_x, ydata)) 
+0

你是对的0:36左右。我忘了在我的问题中改变它。一旦我有所有的基本样条,并且每一个样本都被它乘以它的权重,我想添加所有的基础贡献,每次我有一个86000的数组。我会尝试你所说的,但提供数据很难提供很多数据,但我会尝试 –

+0

Data:gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7 gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96af gist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71 –