Seite 1 von 1

Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 12:11
von davinadavina
Hallo zusammen
Ich schreibe ein Programm zur Berechnung einer Verteilung.
Bei dem Teil von Liste4 funktioniert etwas nicht, es werden die falschen Zahlen berechnet. Kann mir jemand weiterhelfen? ist ziemlich wichtig. Danke im voraus!

Code: Alles auswählen

N = {1,2,3,4,5,6}
n = len(N)

Liste1=[]
for item in powerset(N):
    Liste1.append(Summe(item))

Liste1 = sorted(Liste1)
unique_values = list(set(Liste1))

Liste2 = []
for values in unique_values:
     Liste2.append(Liste1.count(values))

Liste3 = []
for i in range(0, len(Liste2), 1):
    Liste3.append((unique_values[i], Liste2[i]))

Liste4 = []
W = 2**n
for i in Liste2:
    Liste4.append((Liste1[i])/W)



Liste1
[0, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 5, 6, 7, 8, 7, 8, 9, 9, 10, 11, 6, 7, 8, 9, 8, 9, 10, 10, 11, 12, 9, 10, 11, 11, 12, 13, 12, 13, 14, 15, 10, 11, 12, 12, 13, 14, 13, 14, 15, 16, 14, 15, 16, 17, 18, 15, 16, 17, 18, 19, 20, 21]
unique_values
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
Liste2
[1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 1, 1, 1]
Liste3
[(0, 1), (1, 1), (2, 1), (3, 2), (4, 2), (5, 3), (6, 4), (7, 4), (8, 4), (9, 5), (10, 5), (11, 5), (12, 5), (13, 4), (14, 4), (15, 4), (16, 3), (17, 2), (18, 2), (19, 1), (20, 1), (21, 1)]
Liste4
[0.015625, 0.015625, 0.015625, 0.03125, 0.03125, 0.046875, 0.046875, 0.046875, 0.046875, 0.0625, 0.0625, 0.0625, 0.0625, 0.046875, 0.046875, 0.046875, 0.046875, 0.03125, 0.03125, 0.015625, 0.015625, 0.015625]

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 12:17
von BlackJack
@davinadavina: Was sind denn `powerset()` und `Summe()`? Und was wären denn die richtigen Ergebnisse?

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 12:25
von davinadavina

Code: Alles auswählen

def powerset(iterable):
    """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3).
    Zurückgegeben wird ein sogenannter Konstruktor."""
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def Summe(N):
    """N ist ein iterierbares Objekt."""
    zwischen_total=0
    for e in N:
        zwischen_total+=e
    return zwischen_total
das sind powerset und summe.
die richtigen Verteilungen wären
0.015625, 0.015625, 0.015625, 0.03125, 0.03125, 0.046875, 0.0625, 0.0625, 0.0625, 0.078125, 0.078125, 0.078125, 0.0625, 0.0625, 0.0625, 0.046875, 0.03125, 0.03125, 0.015625, 0.015625, 0.015625

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 12:56
von BlackJack
@davinadavina: `Summe()` scheint mir überflüssig zu sein, das macht ja das gleiche wie die `sum()`-Funktion.

Benenne vielleicht mal die ganze `Liste*`\n um und auch die Laufvariablen in den Schleifen, so das die Namen verraten was die Werte bedeuten. Ich finde es zum Beispiel verdächtig das die Zeilen 15 bis 17 ersatzlos gestrichen werden könnten, ohne das sich am Ergebnis etwas ändert.

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 13:46
von davinadavina

Code: Alles auswählen

Liste2 = []
for i in unique_values:
     Liste2.append(Liste1.count(i))

c = []
for i in Liste2:
    c.append(Liste2[i])

print (c)
Liste2
[1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 1, 1, 1]
c
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1]

Danke. Mir ist nun folgendes aufgefallen. Die Liste2 wird geändert. Gebe ich sie als neue Liste c heraus sind die Werte anders. Weshalb ist das so?

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 14:13
von BlackJack
@davinadavina: Was heisst Liste2 wird geändert? Wird sie nicht! Und natürlich ist `c` nicht gleich `Liste2`, das wäre recht unwahrscheinlich. Kannst ja mal überlegen wie die Liste beschaffen sein müsste damit das der Fall wäre.

Ein Unterschied zwischen Ist und Soll ist übrigens auch die Anzahl der Elemente. Du bekommst 22 Elemente, das nach Deiner Aussage richtige Ergebnis hat aber nur 21.

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 2. Juli 2017, 14:55
von Sirius3
@davinadavina: ich vermute mal, dass Deine „richtige“ Verteilung auch falsch ist. powerset liefert keinen Konstruktor zurück sondern einen Iterator. Du verwendest die Elemente der Liste als Index der Liste. Soweit ich Dein Problem verstanden habe, ist das nicht das was Du möchtest.

Code: Alles auswählen

from collections import Counter
from itertools import chain, combinations

def powerset(iterable):
    """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3).
   Zurückgegeben wird ein sogenannter Iterator."""
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

N = {1,2,3,4,5,6}
numbers = [sum(item) for item in powerset(N)]
counts = sorted(Counter(numbers).items())
probabilities = [n/len(numbers) for _, n in counts]

Re: Verteilung berechnen funktioniert nicht

Verfasst: Sonntag 17. September 2017, 10:02
von davinadavina
lll