Изменить количество параметров в функции и наименьших квадратах (глобальная подгонка)

Я хотел бы сделать глобальную подборку набора данных. уравнение имеет 5 параметров (r1r2dwpopkex). Если я сделаю индивидуальную подгонку, у меня будут эти параметры для 1 входного файла, и это нормально, я могу это сделать. Но когда я пытаюсь сделать глобальный пример, у меня возникает много проблем. На самом деле, если я хочу использовать 2 входных файла, и я предполагаю, что я хочу их поделиться pop а также kex Я в конечном итоге с 8 параметрами (r11r21r12r22dw1dw2popkex) с 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]

Проблема в том, что я хотел бы подогнать все параметры одновременно, но я не знаю, как это сделать. Таким образом, я примеряю r11r21dw1k а также pop тогда первый раз r12r22dw2k а также 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
Другие вопросы по тегам