Я пытаюсь подогнать функцию, используя 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]
В какой-то момент я попытался использовать приведение массива в возврате, но я постоянно получал ошибки о приведении между сложными и реальными числами с плавающей запятой, хотя я ничего не просил. Даже при использовании этого метода я иногда получаю комплексные предупреждения.
РЕДАКТИРОВАТЬ:
По просьбе выкладываю 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/)? - person Warren Weckesser   schedule 16.01.2014M
иF
имеют комплексное значение. Пробовали ли вы возвращать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
, чтобы он соответствовал фазе? - person gg349   schedule 16.01.2014return [(M[left_freq2_index].real-F[left_freq2_index].real),(M[left_freq2_index].imag-F[left_freq2_index].imag)...]
Тоже не работает. Тот же результат, абсолютно никакого движения параметров. - person Elliot   schedule 16.01.2014gen_pat()
не влияет на компоненты Фурье на целевых частотах. Не могли бы вы опубликовать эту функцию? - person gg349   schedule 16.01.2014