Seite 1 von 1

Entropie-Berechnung gibt math domain error

Verfasst: Montag 22. August 2011, 19:44
von Jochen1980
Servus,

wo kommt der Fehler her? Kann ich eigentlich auch den range so setzen, dass ich im Bereich 0 bis 1 in 0.001-er Schritte gehe?

Traceback (most recent call last):
File "calculate.py", line 11, in <module>
s2 = (1-p) * math.log( (1-p), 2 )
ValueError: math domain error

Code: Alles auswählen

#!/usr/bin/python3
import math
print("Entropie für Wahrscheinlichkeitsbereich berechnen")
list_of_results = []
for p in range( 1, 1000, 1):
    # H = -( p * log_2 p + ( 1 - p ) * log_2( 1 - p ) )
    s1 = p * math.log(p,2)
    s2 = (1-p) * math.log( (1-p), 2 )
    cur_res = -1 * ( s1 + s2 )
    print("Key-Val: ", str(p), str(cur_res/1000))
    cur_res_pair = [ str(p), str(cur_res) ]
    list_of_results.append( cur_res_pair )

Re: Entropie-Berechnung gibt math domain error

Verfasst: Montag 22. August 2011, 19:53
von BlackJack
@Jochen1980:

Code: Alles auswählen

In [3]: math.log(-1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

ValueError: math domain error

In [4]: math.log(0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

ValueError: math domain error
`math.log` funktioniert nur mit Zahlen >0. Gerade negative Wahrscheinlichkeiten machen ja auch nicht so viel Sinn. Ausserdem liegt der Wert für die Wahrscheinlichkeit zwischen 0 und 1.

Du kannst mit `range()` nicht direkt Gleitkommazahlen erzeugen, aber natürlich aus den ganzen Zahlen welche durch Division.

Re: Entropie-Berechnung gibt math domain error

Verfasst: Dienstag 23. August 2011, 07:11
von CM
Wenn ich numpy in den Raum werfen darf?

Code: Alles auswählen

import numpy as np
ents = [-(p * np.log2(p) + (1 - p) * np.log2(1 - p)) for p in np.linspace(0.0001, 0.9999, 1000)]
Kann man natürlich auch, z. B. via np.fromfunction, in einem Schritt als numpy-array halten, was wohl oft gegenüber Listen einen Vorteil hat (vermeidbares hin- und her-Konvertieren).

HTH
Christian

PS Die Grenzen sind natürlich ziemlich willkürlich gelegt.

Re: Entropie-Berechnung gibt math domain error

Verfasst: Dienstag 23. August 2011, 07:41
von BlackJack
Man könnte es mit `numpy` auch komplett „innerhalb” von `numpy` lösen:

Code: Alles auswählen

import numpy as np
ps = np.linspace(0.0001, 0.9999, 1000)
ps2 = 1 - ps
es = -(ps * np.log2(ps) + ps2 * np.log2(ps2))

Re: Entropie-Berechnung gibt math domain error

Verfasst: Dienstag 23. August 2011, 08:16
von CM
Ok, aber das war zu einfach für den frühen Morgen ... ;-)

Danke.