Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy Leastsq拟合在所有情况下返回不变的初始猜测_Python_Numpy_Least Squares_Data Fitting - Fatal编程技术网

Python Numpy Leastsq拟合在所有情况下返回不变的初始猜测

Python Numpy Leastsq拟合在所有情况下返回不变的初始猜测,python,numpy,least-squares,data-fitting,Python,Numpy,Least Squares,Data Fitting,我试图使用Leastsq拟合函数,以拟合fft中的几个相关点。目前的问题是,无论拟合的好坏,参数绝对没有变化。换句话说,最小二乘法需要6次迭代,对其中任何一次都不做任何操作,然后返回初始参数值。我无法确定为什么什么都没有发生 guess = [per_guess,thresh_guess,cen_guess] #parameter guesses, all real numbers res, stuff = leastsq(fitting, guess) fitting函数有许多操作来

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

guess = [per_guess,thresh_guess,cen_guess] #parameter guesses, all real numbers    
res, stuff = leastsq(fitting, guess)
fitting函数有许多操作来找到正确的索引,为了节省空间,我不会在这里重复这些操作,但它会返回一个复数列表:

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]
我曾尝试在返回中使用数组强制转换,但我会不断收到关于在复杂浮动和真实浮动之间进行强制转换的错误,即使我没有要求任何错误。即使使用这种方法,我偶尔也会收到ComplexWarning

编辑:

根据要求,我将发布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

提供的函数
gen_pat(x1,x2,x3,x4)
返回值为1的水平线,用于输入的一些值
(x1,x2,x3,x4)
。其傅里叶分量(当然第0分量除外)始终为零,与参数无关。然后leastsq算法失败,因为4个参数的更改不会影响您尝试优化的傅里叶分量


您在
gen_pat()
中做错了什么,要么是编码错误,要么是概念错误,比如选择了错误的拟合曲线。

您的意思是
scipy.optimize.leastsq
()?请注意
M
F
是复数值。您是否尝试过返回
abs(M[left\u freq2\u index]-F[left\u freq2\u index])
以适应PSD,或返回两次元素,如
(M[left\u freq2\u index]-F[left\u freq2\u index]).real,(M[left\u freq2\u index]-F[left\u freq2\u index]).imag
以适应相位?
返回[(M[left\u freq2\u index].real-F[left\u index][left_freq2_index].imag-F[left_freq2_index].imag).]
也不起作用。同样的结果,参数绝对没有移动。一个可能的结论是
gen_pat()
不会影响目标频率处的傅里叶分量。你能发布该函数吗?Gen_pat创建了一个二进制网格,中心有偏移和pi/2相移。我知道这会给出所需的输出。当然,可以选择任何具有阈值的函数的极坏值,使其完整ly 1或0,但这是生成此类网格的固有问题。考虑到所需的输出,我不知道有什么方法可以以不可能发生这种情况的方式生成此类网格。我最初的猜测与该区域相去甚远
(1024,40,0.5,0)
,所以它甚至从未尝试过一个变体这一事实是不寻常的。@Elliot,你能提供你最初的猜测吗?这是在前面的评论中。
(1024,40,0.5,0)
好的。我现在看到函数确实改变了这个猜测(我尝试过其他值)。但是,这并不意味着您提取的特定傅里叶分量也会发生变化。出于好奇,最终的解是否接近此猜测?取决于我使用的模式。我可以选择一个接近或不接近的模式。显然,如果我测试收敛性,我会使用一个接近的模式。此外,您会注意到,我在目标是适应新版本(编辑的开场白),而不仅仅是一些特定的版本。
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)