Pomegranate: рдореЙрдбрд▓ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╕рдВрднрд╛рд╡рдирд╛ ()

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬрдире░ 2020  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jmschrei/pomegranate

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреНрд╡рд╛рд░рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЗрдирдкреБрдЯ 7 рдФрд░ 8 рдкрд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред 0 рдмрджрд▓рд╛рд╡ рдХрд┐рдПред

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

рдкрд┐рдк рд╕реВрдЪреА

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  

рдкрд╛рдпрдерди 3.6

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░рд╛ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ

рдЙрд╕ рдореБрджреНрджреЗ рдХреА рднреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 0.12.0 рд╕реЗ 0.11.2 рддрдХ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ...

рдЙрд╕ рдореБрджреНрджреЗ рдХреА рднреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 0.12.0 рд╕реЗ 0.11.2 рддрдХ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ...

рдбрд╛рдЙрдирдЧреНрд░реЗрдбрд┐рдВрдЧ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдмрдЧ рд╣реИ ...

рдХреЛрдб

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])

рддреНрд░реБрдЯрд┐

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

рдЖрдкрдХреА рддреНрд░реБрдЯрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ (0,1) рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ ('0', '1') рдореЗрдВ рдмрджрд▓ рджреЗрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдЯрдВрдк рдХрд┐рдпрд╛ рдерд╛

рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдХреЛ probability рдФрд░ log_probability рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реЛрдиреЗ рдкрд░ рднреА 2D рд╣реЛред рдореЗрд░реЗ рдкрд╛рд╕ 30 рддрд╛рд░реАрдЦ рдХреЛ рдПрдХ рдкреЗрдкрд░ рдХреА рд╕рдордп рд╕реАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░реВрдВрдЧрд╛ред рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

@SebastianBelkner рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ 0.12 рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА:
model.probability(...) рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ (2d) рд╕рд░рдгреА рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред

V0.11.2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рдВрд░рдЪрдирд╛ рдЬреИрд╕реА рд╕рд░рдгреА рдХреЛ рдкрд╣рд▓реЗ рдПрдХ Numpy рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдлрд┐рд░ 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]

Numpy рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирддреАрдЬрддрди, рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред * model.probability(...) рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ 2d-рд╕рд░рдгреА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ Numpy рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЖрдИрдПрдордПрдЪрдУ рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

  • рдпрд╛ рддреЛ X = numpy.array(X, ndmin=2) рдлрд┐рд░ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, рдпрд╛
  • рдЕрджреНрдпрддрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдгред

рдореИрдВ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдПрдХ numpy array рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЙрд╕ рдореБрджреНрджреЗ рдХреА рднреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 0.12.0 рд╕реЗ 0.11.2 рддрдХ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ...

рдЗрд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рджреАред рдпрджрд┐ рдЖрдк рдХрд╛рдЧрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрд▓ рдореЗрдВ рдЕрдирд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ "! рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдЕрдирд╛рд░ == 0.11.2"

рдПрдХрд▓ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЧреБрдЬрд░рдирд╛ рдЕрдм рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ 2D рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рднрд▓реЗ рд╣реА рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛ)ред v0.12.1 рдореЗрдВ print(model.probability([[0, 'yes', 0, 1]])) 4.95e-5 рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬреЛ рд╕рд╣реА рдЙрддреНрддрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

@jmschrei рд╡рд░реНрддрдорд╛рди рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рди рддреЛ рд╕реВрдЪреА рдФрд░ рди рд╣реА рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реИ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

v0.12.1 рдореЗрдВ рдлрд┐рдХреНрд╕ рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рд░рд┐рд▓реАрдЬ рдХрд░реВрдВрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП, 2D numpy array рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tuxdna picture tuxdna  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

anntzer picture anntzer  ┬╖  20рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jonmmease picture jonmmease  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MetaDev picture MetaDev  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

adamnovak picture adamnovak  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ