Pomegranate: Impossible de calculer model.probability()

Créé le 7 janv. 2020  ·  11Commentaires  ·  Source: jmschrei/pomegranate

Déplacement par le tutoriel . Sur les entrées 7 et 8, une erreur s'est produite. 0 modifications apportées.

TypeError                                 Traceback (most recent call last)
<ipython-input-43-c1e53d06d14d> in <module>
----> 1 model.probability(['A', 'B', 'C'])

~/Documents/GitHub/py-bolit/venv/lib/python3.6/site-packages/pomegranate/base.pyx in pomegranate.base.Model.probability()

~/Documents/GitHub/py-bolit/venv/lib/python3.6/site-packages/pomegranate/BayesianNetwork.pyx in pomegranate.BayesianNetwork.BayesianNetwork.log_probability()

TypeError: list indices must be integers or slices, not tuple

liste de points

Package            Version
------------------ -------
attrs              19.3.0 
backcall           0.1.0  
bleach             3.1.0  
cycler             0.10.0 
decorator          4.4.1  
defusedxml         0.6.0  
entrypoints        0.3    
importlib-metadata 1.3.0  
ipykernel          5.1.3  
ipython            7.11.1 
ipython-genutils   0.2.0  
jedi               0.15.2 
Jinja2             2.10.3 
joblib             0.14.1 
json5              0.8.5  
jsonschema         3.2.0  
jupyter-client     5.3.4  
jupyter-core       4.6.1  
jupyterlab         1.2.4  
jupyterlab-server  1.0.6  
kiwisolver         1.1.0  
MarkupSafe         1.1.1  
matplotlib         3.1.2  
mistune            0.8.4  
more-itertools     8.0.2  
nbconvert          5.6.1  
nbformat           5.0.3  
networkx           2.4    
notebook           6.0.2  
numpy              1.18.1 
pandas             0.25.3 
pandocfilters      1.4.2  
parso              0.5.2  
pexpect            4.7.0  
pickleshare        0.7.5  
Pillow             7.0.0  
pip                9.0.1  
pkg-resources      0.0.0  
pomegranate        0.12.0 
prometheus-client  0.7.1  
prompt-toolkit     3.0.2  
ptyprocess         0.6.0  
Pygments           2.5.2  
pygraphviz         1.5    
pyparsing          2.4.6  
pyrsistent         0.15.6 
python-dateutil    2.8.1  
pytz               2019.3 
PyYAML             5.3    
pyzmq              18.1.1 
scipy              1.4.1  
seaborn            0.9.0  
Send2Trash         1.5.0  
setuptools         39.0.1 
six                1.13.0 
terminado          0.8.3  
testpath           0.4.4  
tornado            6.0.3  
traitlets          4.3.3  
watermark          2.0.2  
wcwidth            0.1.8  
webencodings       0.5.1  
wheel              0.33.6 
zipp               0.6.0  

Python 3.6

Tous les 11 commentaires

Pareil ici

Peut également confirmer ce problème. Passer de la version 0.12.0 à la version 0.11.2 résout ce problème...

Peut également confirmer ce problème. Passer de la version 0.12.0 à la version 0.11.2 résout ce problème...

La rétrogradation résout cela, mais il y a un autre bug...

CODE

from pomegranate import BayesianNetwork, DiscreteDistribution, ConditionalProbabilityTable, Node, State
import matplotlib.pyplot as plt

angina_pectoris = DiscreteDistribution({0: 0.99, 1: 0.01})
heart_attack = DiscreteDistribution({0: 0.99, 1: 0.01})

pain_syndrome = ConditionalProbabilityTable([

    [0, 0, 1, 0.01],
    [0, 0, 0, 0.99],

    [0, 1, 1, 0.9],
    [0, 1, 0, 0.1],

    [1, 0, 1, 0.9],
    [1, 0, 0, 0.1],

    [1, 1, 1, 1],
    [1, 1, 0, 0],

], [angina_pectoris, heart_attack])

relief_of_pain = ConditionalProbabilityTable([

    [0, 0, 'yes', 0.1],
    [0, 0, 'not_completely', 0.1],
    [0, 0, 'no', 0.1],

    [0, 1, 'yes', 0.05],
    [0, 1, 'not_completely', 0.35],
    [0, 1, 'no', 0.6],

    [1, 0, 'yes', 0.9],
    [1, 0, 'not_completely', 0.05],
    [1, 0, 'no', 0.05],

    [1, 1, 'yes', 0.33],
    [1, 1, 'not_completely', 0.33],
    [1, 1, 'no', 0.33],

], [angina_pectoris, heart_attack])

ps = State(pain_syndrome, name='pain_syndrome')
rp = State(relief_of_pain, name='relief_of_pain')
ap = State(angina_pectoris, name='angina_pectoris')
ha = State(heart_attack, name='heart_attack')

model = BayesianNetwork('Medical decision support system')

model.add_states(ps, rp, ap, ha)

model.add_edge(ap, ps)
model.add_edge(ap, rp)

model.add_edge(ha, ps)
model.add_edge(ha, rp)

model.bake()

model.probability([0, 'yes', 0, 1])

ERREUR

KeyError                                  Traceback (most recent call last)

<ipython-input-19-cfc278c8d52f> in <module>
----> 1 model.probability([0, 'yes', 0, 1])
      2 

~/Documents/GitHub/py-bolit/venv/lib/python3.6/site-packages/pomegranate/base.pyx in pomegranate.base.Model.probability()

~/Documents/GitHub/py-bolit/venv/lib/python3.6/site-packages/pomegranate/BayesianNetwork.pyx in pomegranate.BayesianNetwork.BayesianNetwork.log_probability()

~/Documents/GitHub/py-bolit/venv/lib/python3.6/site-packages/pomegranate/distributions/ConditionalProbabilityTable.pyx in pomegranate.distributions.ConditionalProbabilityTable.ConditionalProbabilityTable.log_probability()

KeyError: ('0', '1', '0')

@sviperm

Votre erreur semble provenir de vos différents types de données pour les affectations. Je vous suggère de transformer tous les entiers (0,1) en chaînes ('0','1')

Ainsi, c'est un problème différent de celui sur lequel vous êtes tombé initialement

Je recommanderais de faire en sorte que l'entrée de probability et log_probability soit toujours en 2D, même lorsqu'il n'y a qu'un seul exemple. J'ai une date limite pour le papier le 30, mais je vais examiner cela peu de temps après. Désolé pour le dérangement.

Grâce à @SebastianBelkner , nous avons eu le problème de l'incompatibilité 0.12 :
La documentation et les exemples model.probability(...) nécessitent une structure de type tableau (2d).

En regardant l'implémentation v0.11.2, la structure de type tableau a d'abord été convertie en un tableau Numpy, puis accessible via numpyarr[i,j] :

def log_probability(self, X, n_jobs=1):
            <...>
        X = numpy.array(X, ndmin=2)
        <...>
        for i in range(n):
            for j, state in enumerate(self.states):
                logp[i] += state.distribution.log_probability(X[i, self.idxs[j]])

        return logp if n > 1 else logp[0]

La conversion en Numpy a été supprimée ultérieurement. Par conséquent, la manière d'accéder aux valeurs ne fonctionne pas de cette façon. * La conversion préalable du tableau 2d en un tableau Numpy comme argument pour model.probability(...) résout le problème.

A mon humble avis, il existe deux solutions:

  • incluez à nouveau X = numpy.array(X, ndmin=2) , ou
  • mettre à jour la documentation et les exemples.

J'ajouterai le casting en tant que tableau numpy dans la prochaine version. Merci d'avoir compris cela et d'avoir posté une solution temporaire.

Peut également confirmer ce problème. Passer de la version 0.12.0 à la version 0.11.2 résout ce problème...

Cela a vraiment résolu mon problème. Si vous utilisez Kaggle, installez grenade dans la première cellule en utilisant la commande suivante "!pip install grenade==0.11.2"

Passer dans un seul vecteur génère maintenant une erreur. Vous devez passer une matrice 2D ou une liste de listes (même s'il n'y a qu'un seul exemple). Dans la v0.12.1, print(model.probability([[0, 'yes', 0, 1]])) renverra 4.95e-5 , ce qui ressemble à la bonne réponse.

@jmschrei Pour la version actuelle, ni la liste ni la liste des listes ne fonctionnent. Y a-t-il déjà des changements dans le code source ou l'exemple sera-t-il mis à jour ?

v0.12.1 aura le correctif. Je publierai ça bientôt. Pour l'instant, passez un tableau numpy 2D et cela devrait fonctionner.

Cette page vous a été utile?
0 / 5 - 0 notes