Изменить количество параметров в функции и наименьших квадратах (глобальная подгонка)
Я хотел бы сделать глобальную подборку набора данных. уравнение имеет 5 параметров (r1
r2
dw
pop
kex
). Если я сделаю индивидуальную подгонку, у меня будут эти параметры для 1 входного файла, и это нормально, я могу это сделать. Но когда я пытаюсь сделать глобальный пример, у меня возникает много проблем. На самом деле, если я хочу использовать 2 входных файла, и я предполагаю, что я хочу их поделиться pop
а также kex
Я в конечном итоге с 8 параметрами (r11
r21
r12
r22
dw1
dw2
pop
kex
) с 3 у меня будет 11 параметров и тд...
Я пытался сделать цикл, изменяющий каждый раз значение параметров таким образом
def fit_function( r1[i], r2[i], kex, pop, dw[i]):
return (complicated function)
def residuals(p, x, y, z, err):
r1, r2, kex, pop, dw = p
return (y - fit_function( r1, r2, kex, pop, dw))/err
тогда я начну с наименьшего квадрата:
kex = 1311
pop = 0.025
dw = [-300,500,700,650]
while i < len(r1):
p0 = [r1[i], r2[i], kex, pop, dw[i]]
plsq = leastsq(residuals, p0, args=( x, y, z, err),
full_output = True,
xtol = 1e-15,
ftol = 1e-15,
factor = 1 ) #check in function
pres, cov_x, infodict, mesg, ier = plsq
print pres[0], pres[1], pres[2], pres[3], pres[4]
Проблема в том, что я хотел бы подогнать все параметры одновременно, но я не знаю, как это сделать. Таким образом, я примеряю r11
r21
dw1
k
а также pop
тогда первый раз r12
r22
dw2
k
а также pop
в то же время....
Мне правда сейчас не жарко, чтобы решить это.... Есть предложения? Спасибо
import numpy as np
import scipy
from scipy.optimize import leastsq, fmin_tnc
from numpy import sin, cos, arctan, pi, sqrt
from numpy.random import standard_normal
import sys
import scipy.stats
import os
import time
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
n=(input('how many residues?'))
pathInput='/Users/luca/Desktop/GLOBAL FITTING/global fitting/input'
pathOutput='/Users/luca/Desktop/GLOBAL FITTING/global fitting/output'
l=os.listdir(pathInput)
finalInput=pathOutput+"/mergedInput.txt"
out=open(finalInput,'w')
out1=open(pathOutput+"/inputFilenames.txt",'w')
r1 = [2.25 ,3, 2, 4]
r2 = [ 24.62, 30, 20, 25]
EF = 1
data = np.genfromtxt(datafile_name)
x = data[:,0]
y = data[:,1]
err = data[:,2]*EF
z = data[:,3]
kex = 1311
pop = 0.025
dw = [-300,500,700,650]
i=0
while i < len(r1):
p0 = [r1[i], r2[i], kex, pop, dw[i]]
plsq = leastsq(residuals, p0, args=( x, y, z, err),
full_output = True,
xtol = 1e-15,
ftol = 1e-15,
factor = 1 )
pres, cov_x, infodict, mesg, ier = plsq
print pres[0], pres[1], pres[2], pres[3], pres[4]
i=i+1
1 ответ
Я не понимаю твою проблему. Вы можете объяснить?
Я думаю, что есть что-то связанное с functools.partial.
Вернуть новый частичный объект, который при вызове будет вести себя как func, вызываемый с помощью аргументов позиционных аргументов и ключевых слов. Если для вызова передается больше аргументов, они добавляются к аргументам. Если предоставляются дополнительные аргументы ключевых слов, они расширяют и переопределяют ключевые слова.
Или вы можете использовать функтор (функциональный объект):
class MyFunctor(collections.Callable):
def __init__(self, param1, param2):
self.param1 = param1
self.param2 = param2
def __call__(self, *args, **kwargs):
pass # do your calculation here