TypeError: fmin_() missing 1 required positional argument: 'pp' [Résolu]

Signaler
-
 Meve -
Bonjour,

[Débutante]

J'essaie d'approximer la valeur d'une liste de moyennes centrées sur la première valeur d'une liste de probabilités.

Exemple : probabilités = [0.90, 0.019, 0.077, 1.0902e-04]
moyennes hypothétiques= [0.000, -2.747, -1.985, -4.679]

Pour cela, je souhaite utiliser la fonction scipy.optimize.fmin

Seulement, mon code renvoie un message d'erreur à la ligne d'appel de la fonction (avant dernière ligne du morceau de code copié ici). Le message est: TypeError: minimize() missing 1 required positional argument: 'pp'

initguess_oblique = [0.000, -2.747, -1.985, -4.679]
initguess_centrect= [0.000, -2.820, -2.822, -6.586]
initguess_rhombic= [0.000, 0.000, -1.185, -9.313]
initguess_hexa= [0.000, 0.000,  0.000, -7.996]

#Fit the mus from the probabilities (depending on the alpha value of each participant).
def mu2pr(mu_list):
  '''Gives the probabilities estimated from the found mu'''
  my_mu_lst= [0.0]+ mu_list
  mu_nb=len(my_mu_lst)
  prob_lst= np.zeros((1,4))
  max_inds=[]
 
  for i in range(simul_nb):
    simul_mat= np.array(my_mu_lst)+np.random.randn(mu_nb)
    max_inds.append(np.argmax(simul_mat))
  
  for probindex in range(mu_nb-1):
    prob_lst[0,probindex]= max_inds.count(probindex)/ simul_nb

  return prob_lst

def minimize(real_prob,pp):
    ''' We try to get the minimize the difference between the computed 
    probabilities and the probabilities we get from the estimated mus (mu2pr)'''
    mu2pr(pp)
    errfunc= sum(((real_prob - mu2pr(pp)) **2))
    return errfunc

mus_all_participants= np.zeros((len(alpha_all_participants),nstim,number_orientations))

for index in range(len(probs_all_participants)):
    
     prob_oblique= probs_all_participants[index,0]
     prob_centrect= probs_all_participants[index,1]
     prob_rhombic= probs_all_participants[index,2]
     prob_hexa= probs_all_participants[index,3]

     p1ob= fmin(minimize,initguess_oblique,args=prob_oblique)
     oblique_mus= [0.0]+ p1ob


Je crois que cela vient du fait que la fonction fmin ne comprend pas que l'entrée 'pp' de minimize() est ce qu'elle devait générer et minimiser elle-même. fmin s'attend donc à ce que je passe deux arguments pour minimize(). J'aimerais comprendre pourquoi cela se produit et comment régler cela.


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

Messages postés
16448
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 juillet 2021
880
bonjour,
ton code me donne une erreur en ligne 30:
name 'np' is not defined

ne manque-t-il rien?
Je n'ai pas donné le code en entier, le voilà (il ne pourra tout de même pas être exécuté car je fais appel à des variables et fonctions contenues dans d'autres fichiers):
import numpy as np
import pandas as pd
import seaborn as sn

from math import pi
from math import sqrt
from math import cos

from scipy.stats import norm
from scipy.optimize import fmin

from Fit_Alpha import attraction_function
from Fit_Alpha import perception_probability

from Compute_confidence import alpha_all_participants

#Basic parameters
a=1
bs = [1.5,1.5,1,1];
nstim = len(bs)
number_orientations=4
gammas = [60,70.53,75,60]
gamma_rad =[]
for i in gammas:
gamma_rad.append(i*pi/180)


# To compute f_vectors and p_vectors
array_orientations= np.zeros((nstim,number_orientations))
array_orientations[:,0]=a

for i in range(nstim):
b = bs[i]
gam = gamma_rad[i]
c = sqrt((a**2)+(b**2)-(2*a*b*cos(gam)))
d = sqrt((a**2)+(b**2)+(2*a*b*cos(gam)))
array_orientations[i,1]=b
array_orientations[i,2]=c
array_orientations[i,3]=d


#Get the probabilities to see each vector for each participant's alpha and store this into an array.

probs_all_participants= np.zeros((len(alpha_all_participants),nstim,number_orientations))

index= 0

for alpha in alpha_all_participants:

f_vectors = np.zeros((nstim,4))
p_vectors = np.zeros((nstim,4))

for i in range(nstim):
for j in range(number_orientations):
f_vectors[i,j]=attraction_function(array_orientations[i,j],a,alpha)

for i in range(nstim):
for j in range(number_orientations):
p_vectors[i,j]= perception_probability(f_vectors[i,j],
f_vectors[i,0],
f_vectors[i,1],
f_vectors[i,2],
f_vectors[i,3])

probs_all_participants[index]=p_vectors
index+=1


simul_nb= 1000

#Initial guess of the mus for the b, c and d vectors
initguess_oblique = [0.000, -2.747, -1.985, -4.679]
initguess_centrect= [0.000, -2.820, -2.822, -6.586]
initguess_rhombic= [0.000, 0.000, -1.185, -9.313]
initguess_hexa= [0.000, 0.000, 0.000, -7.996]

#Fit the mus from the probabilities (depending on the alpha value of each participant).
def mu2pr(mu_list):
'''Gives the probabilities estimated from the found mu'''
my_mu_lst= [0.0]+ mu_list
mu_nb=len(my_mu_lst)
prob_lst= np.zeros((1,4))
max_inds=[]

for i in range(simul_nb):
simul_mat= np.array(my_mu_lst)+np.random.randn(mu_nb)
max_inds.append(np.argmax(simul_mat))

for probindex in range(mu_nb-1):
prob_lst[0,probindex]= max_inds.count(probindex)/ simul_nb

return prob_lst

def minimize(real_prob,pp):
''' We try to get the minimize the difference between the computed
probabilities and the probabilities we get from the estimated mus (mu2pr)'''
mu2pr(pp)
errfunc= sum(((real_prob - mu2pr(pp)) **2))
return errfunc

mus_all_participants= np.zeros((len(alpha_all_participants),nstim,number_orientations))

for index in range(len(probs_all_participants)):

prob_oblique= probs_all_participants[index,0]
prob_centrect= probs_all_participants[index,1]
prob_rhombic= probs_all_participants[index,2]
prob_hexa= probs_all_participants[index,3]

p1ob= fmin(minimize,initguess_oblique,args=prob_oblique)
oblique_mus= [0.0]+ p1ob

p1cent= fmin(minimize,initguess_centrect,args=prob_centrect)
centrect_mus= [0.0]+ p1cent

p1rho= fmin(minimize,initguess_rhombic,args=prob_rhombic)
rhombic_mus= [0.0]+ p1rho

p1hex= fmin(minimize,initguess_hexa,args=prob_hexa)
hexa_mus= [0.0]+ p1hex
Messages postés
16448
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 juillet 2021
880
il serait alors préférable de fournir un programme testable.
un exemple d'appel de fmin, avec passage d'un second paramètre:
import scipy.optimize
def f(x,y):
    return abs(x-2*y)
trois=3
r=scipy.optimize.fmin(f,123,args=(trois,))
print("r:",r)

c'est le premier paramètre pour lequel fmin cherche une valeur minimisant la fonction. tu devrais donc probablement inverser les paramètres dans la déclaration de minimize().
Merci pour ton aide!
Après avoir modifié ce que tu as suggéré, il m'a aussi fallu aussi aplatir la sortie de la fonction mu2pr: https://stackoverflow.com/questions/9779946/scipy-optimize-fmin-valueerror-setting-an-array-element-with-a-sequence

Le code fonctionne bien maintenant.