【问题标题】:Numpy Leastsq fitting returning unchanged inital guess in all casesScipy Leastsq 拟合在所有情况下都返回不变的初始猜测
【发布时间】:2014-02-04 12:02:32
【问题描述】:

我正在尝试使用 Leastsq 拟合函数以拟合 fft 中的一些相关点。手头的问题是,无论拟合的好坏,参数绝对没有变化。换句话说,最小二乘法需要 6 次迭代并且对其中任何一个都不做任何事情,然后返回初始参数值。我无法确定为什么什么都没发生。

guess = [per_guess,thresh_guess,cen_guess] #parameter guesses, all real numbers    
res, stuff = leastsq(fitting, guess)

拟合函数有许多操作来找到正确的索引,为了节省篇幅我不会在这里重复,但它会返回一个复数列表:

M, freq= fft(real_gv, zf)
def fitting(guess):
    gi, trial_gv = gen_pat(size, guess[0], guess[1], guess[2])
    trial_gv = trial_gv*private.han #apply hanning window
    F, freq= fft(trial_gv, zf) 
    #stuff that picks the right indices
    return M[left_fit target:right_fit_target]-F[left_fit target:right_fit_target]

我曾尝试在返回中使用数组强制转换,但我会不断收到有关在复杂浮点数和真实浮点数之间强制转换的错误,即使我没有要求任何错误。即使使用这种方法,我偶尔也会收到 ComplexWarnings。

编辑:

根据要求,我提出了 gen_pat:

def gen_pat(num, period, threshold, pos = 0, step = 1.0, subdivide=10.0, blur = 1.0):
x= np.arange(-num/2,num/2,step) #grid indexes
j=np.zeros((len(x),subdivide))
for i in range(len(x)):
    j[i]=np.linspace(x[i]-0.5*blur,x[i]+0.5*blur,subdivide) #around each discrete point take a subvision. This will be averaged to get the antialiased point. blur allows for underlap (<1) or overlap of pxels
holder = -np.sin(2*np.pi*np.abs(j-pos)/period) #map a sin function for the region
holder = holder < 2.0*threshold-1.0 #map to 1 or 0 based on the fraction of the period that is 0
y = np.sum(holder, axis=1)/float(subdivide) #take the average of the values at the sub-points to get the anti-aliased value at the point i
y= np.array(y)
x= np.array(x)
return x,y

编辑 2:

使用res = fmin_powell(fitting, guess, direc=[[1,0,0],[0,0.1,0],[0,0,1]]) 和修改后的返回值进行了调整。仍然想知道为什么 lestsq 不起作用。

return np.sum((M[fit_start_index:fit_end_index].real-F[fit_start_index:fit_end_index].real)**2+(M[fit_start_index:fit_end_index].imag-F[fit_start_index:fit_end_index].imag)**2)

【问题讨论】:

  • 你的意思是scipy.optimize.leastsq (docs.scipy.org/doc/scipy/reference/generated/…)?
  • 请注意,MF 是复值。您是否尝试过返回 abs(M[left_freq2_index]-F[left_freq2_index]) 以适应 PSD,或者返回两倍的元素,例如 (M[left_freq2_index]-F[left_freq2_index]).real,(M[left_freq2_index]-F[left_freq2_index]).imag 以适应相位?
  • return [(M[left_freq2_index].real-F[left_freq2_index].real),(M[left_freq2_index].imag-F[left_freq2_index].imag)...] 也不起作用。结果相同,参数绝对没有移动。
  • 一个可能的结论是gen_pat() 不会影响目标频率的傅立叶分量。你能发布那个功能吗?

标签: python numpy least-squares data-fitting


【解决方案1】:

提供的函数gen_pat(x1,x2,x3,x4) 为我尝试过的输入(x1,x2,x3,x4) 的几个值返回一条值为1 的水平线。它的傅立叶分量(当然除了第 0 个分量)总是独立于参数为零。然后,leastsq 算法失败,因为 4 个参数的变化不会影响您尝试优化的傅立叶分量。

您在gen_pat() 中做错了,可能是编码错误或概念错误,例如选择了错误的拟合曲线。

【讨论】:

  • Gen_pat 创建一个二进制网格,在中心有一个偏移和一个 pi/2 相移。我确实知道这会提供所需的输出。当然,可以为任何具有阈值的函数选择极差的值,使其完全为 1 或 0,但这是生成此类网格的固有问题。考虑到所需的输出,我不知道有什么方法可以生成这样的网格,而这种方式不可能发生这种情况。我最初的猜测与该区域 (1024,40,0.5,0) 相去甚远,因此它甚至从未尝试过单一变体这一事实是不寻常的。
  • @Elliot,你能提供你最初的猜测吗?
  • 在上一条评论中。 (1024,40,0.5,0)
  • 好的。我现在看到该函数确实围绕该猜测发生了变化(我尝试了其他值)。然而,这并不意味着您提取的特定傅立叶分量也会发生变化。出于好奇,最终的解决方案是否接近这个猜测?
  • 取决于我使用的模式。我可以选择一个接近或不接近的。显然,如果我正在测试收敛性,我会使用一个接近的。此外,您会注意到我围绕目标进行了一定范围的调整,以适应较新的版本(编辑过的开篇文章),而不仅仅是一些特定的版本。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 2016-01-18
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多