Entropie-Berechnung gibt math domain error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

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 )
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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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.
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))
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ok, aber das war zu einfach für den frühen Morgen ... ;-)

Danke.
Antworten