Python : Nan — Les-mathematiques.net The most powerful custom community solution in the world

Python : Nan

Bonjour à tous,

Voici mon code
import numpy as np
import math
from pylab import cm,imshow,colorbar,title,show

#Paramétrisation
N = 1000                        #pas de discrétisation de l'intervalle [0,1]. N[i] correspond à la coordonnée i.
epsilon = .000001
arret = .01
T = np.linspace(0,1,N, False)   #points de discrétisation de l'intervalle [0,1]

#Calcul de Gamma_Barre
X,Y = np.meshgrid(T,T)
C = (X-Y)**2                    #Matrice contenant les c[i,j]=(xi-yj)²
GammaB = np.exp(-C/epsilon)     #Matrice contenant les GammaB[i,j] = Gamma_Barrei,j

def SinkHorn(mu,nu,arret):
    a2 = np.ones(N)
    b2 = np.ones(N)
    erreur = math.inf
    while (erreur>arret):
        a1 = a2
        b1 = b2
        a2 = mu/(np.dot(GammaB,b1))
        b2 = nu/(np.dot(GammaB.T,a2))
        erreur = np.linalg.norm(a2-a1)+np.linalg.norm(b2-b1)
    return a2,b2

def gamma_star(mu,nu):
    a,b = SinkHorn(mu,nu,arret)
    Gamma = (((GammaB*a).T)*b).T
    return Gamma

#définition de mu
mu = np.ones(N)
print("Quelque valeurs de mu : ")
T = [mu[i] for i in range(10)]
print(T)


#définition de nu
nu = np.exp(-np.arange(N)/100)
print("Quelque valeurs de nu : ")
T = [round(nu[i],3) for i in range(10)]
print(T)

#Calcul de Gamma*
Gamma = gamma_star(mu,nu)
print("Quelque valeur de gamma* : ")
T = [Gamma[i][j] for i in range(3) for j in range(3)]
print(T)

Voici le résultat
Résultat a écrit:
Quelque valeurs de mu :
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
Quelque valeurs de nu :
[1.0, 0.99, 0.98, 0.97, 0.961, 0.951, 0.942, 0.932, 0.923, 0.914]
Quelque valeur de gamma* :
[nan, nan, nan, nan, nan, nan, nan, nan, nan]

Je pense que vous avez compris le problème. Je divise par $0$ et ça me complique un peu la vie. Si vous avez une idée pour éviter ça, c'est avec plaisir !

Réponses

  • Bonjour

    Pour être transparent, je n'ai pas été amené à l'utiliser jusqu'à présent, mais c'est un cas de figure qui a été prévu sous Python avec les exceptions:
    try:
        print 1/0
    except ZeroDivisionError:
        print "You can't divide by zero!"
    

    voir ici par exemple pour plus de détails
  • J'ai modifié le calcul de gamma * c'était trop petit mais ça ne résout pas encore le problème.
    Le problème est que ma suite a^{n} converge vers + \infty.
    #Calcul de Gamma_Barre
    X,Y = np.meshgrid(T,S)
    C = (X-Y)**2                    #Matrice contenant les c[i,j]=(xi-yj)²
    for i in range(N):
        for j in range(N):
            temp = (T[ i]-S[j])**2
            if temp > 10*epsilon :
                C[ i][j] = 10*epsilon
            else :
                C[ i][j] = temp
    GammaB = np.exp(-C/epsilon)     #Matrice contenant les GammaB[ i,j] = Gamma_Barrei,j
    
    [Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]
  • Je me trompe ou:
    • T et S sont des vecteurs
    • donc X et Y le sont aussi pour construire le maillage
    • C est donc un vecteur et non une matrice non ?

    Pourquoi il n'y a aucun indice à T dans les boucles, car je doute que ça soit un scalaire ?
  • j'avais faux dans mon précédent message, $C$ est bien une matrice et du coup je ne comprends pas les indices dans les boucles.

    si l'idée est de rechercher toutes la valeurs supérieures à $10\epsilon$ il est possible de faire avec np.where:
    C = (X-Y)**2
    temp = (T-S)**2
    indices = np.where(temp > 10*epsilon)
    temp[indices] = 10.*epsilon
    
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!