2016-07-15 2 views
-1

Je voudrais faire un ajustement global d'un ensemble de données. l'équation a 5 paramètres (r1r2dwpopkex). Si je fais un ajustement individuel, je vais avoir ces paramètres pour un fichier d'entrée 1 et c'est ok, je peux le faire. Mais quand j'essaie de faire un ajustement global, j'ai beaucoup de problèmes. En fait, si je veux utiliser 2 fichier d'entrée et je suppose que je veux les partager pop et kex je vais finir avec 8 paramètres (r11r21r12r22dw1dw2popkex) avec 3 Je vais avoir 11 paramètres et ainsi de suite ...Modifier le nombre de paramètres dans une fonction et dans le moindre carré (ajustement global)

J'ai essayé de faire une boucle changer chaque fois que la valeur des paramètres de cette façon

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 

je commence avec le moins carré:

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] 

Le problème est que je voudrais adapter tous les paramètres en même temps mais je ne sais pas comment le faire. De cette façon, je suis raccord r11r21dw1k et pop la première fois, puis r12r22dw2k et pop en même temps ....

Je ne maintenant pas chaud pour résoudre ce .... Toute suggestion ? Merci

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 
+0

Votre code est incomplet, et il est difficile de comprendre votre problème – Elazar

+0

quelles devraient être les arguments de la fonction leastsq? –

+0

devrait être r11 r21 r21 r22 et ainsi de suite ... Je voudrais choisir le nombre de paramètre depuis le début ... –

Répondre

0

Je ne comprends pas votre problème. Peux-tu expliquer?

Je pense qu'il y a quelque chose à faire avec functools.partial.

Renvoyer un nouvel objet partiel qui, lorsqu'il est appelé, se comporte comme func appelé avec les arguments de position args et les mots-clés keywords. Si plus d'arguments sont fournis à l'appel, ils sont ajoutés à args. Si des arguments supplémentaires sont fournis, ils étendent et remplacent les mots-clés.

Ou vous pouvez utiliser un foncteur (objet fonctionnel):

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 
+0

J'essaie de vérifier si différents atomes participent au même événement. Pour ce faire, je fais quelques calcul pour chaque atome. alors j'estrapoler les 5 paramètres individuellement. Pour voir s'ils partagent quelque chose, j'essaie de les assembler en supposant que le paramètre 'pop' 'kex' soit partagé. Pour les adapter je dois utiliser la même fonction bien sûr parce qu'ils suivent la même loi de physique. Mais quand j'essaye de calculer le leastsqaure j'ai un problème. Je ne sais pas chaud pour dire au résidu de s'adapter à r11 r21 dw1 de la première partie de données puis r12 et r22 et dw2 pour la deuxième partie et le kex et pop pour tous –