Mögliche Kombination 2er Gruppen von Features

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
cellat
User
Beiträge: 2
Registriert: Donnerstag 26. März 2020, 09:40

Donnerstag 26. März 2020, 10:18

Hallo zusammen,
ich hänge seit gestern an einem Problem fest und bitte um Hilfe.
Es geht um folgendes Problem. Ich habe ein Dataset mit 16 Bundesländer als Features und möchte die 16 Features als alle möglichen 2er Gruppen Kombinationen haben, also alle möglichen 15x1 ,14x2,13x3, ..., 8x8. Fürs erste habe ich folgendes gebastelt.

Code: Alles auswählen

from itertools import combinations
features = ['Bayern', 'NRW', 'BB', 'BaWü','Berlin','Bremen','HH','Hessen','MV','NSN','RLP','SH','SL','SN','SNA','TH']

a=list(combinations(features,15))
print(a)
b=list(combinations(features,1))
print('')
print(b)
print('')

result = zip(a, b)
result_set = set(result)
print(result_set)
out:

Code: Alles auswählen

[('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'BaWü', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BB', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'NRW', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('Bayern', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), 
('NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH')]

[('Bayern',), ('NRW',), ('BB',), ('BaWü',), ('Berlin',), ('Bremen',), ('HH',), ('Hessen',), ('MV',), ('NSN',), ('RLP',), ('SH',), ('SL',), ('SN',), ('SNA',), ('TH',)]

{(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SN', 'SNA', 'TH'), ('BaWü',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SNA', 'TH'), ('BB',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA'), ('Bayern',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('SH',)), 
(('NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('TH',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('Bremen',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('RLP',)), 
(('Bayern', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('SNA',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('HH',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'TH'), ('NRW',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('NSN',)), 
(('Bayern', 'NRW', 'BB', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('SL',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('Hessen',)), 
(('Bayern', 'NRW', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('SN',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SL', 'SN', 'SNA', 'TH'), ('Berlin',)), 
(('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'MV', 'NSN', 'RLP', 'SH', 'SL', 'SN', 'SNA', 'TH'), ('MV',))}
Das Problem ist wenn ich zip benutze, dann wird einfach willkürlich miteinander verbunden. Ich würde es gerne so haben dass ein Element in a so mit einem Element in b gezipt wird, welches in a nicht vorkommt. Nehemen wir das erste Element

('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SN', 'SNA', 'TH'), ('BaWü',))

Hier kommt ja BaWü in der Linken Liste vor. Eigentlich sollte es so sein
('Bayern', 'NRW', 'BB', 'BaWü', 'Berlin', 'Bremen', 'HH', 'Hessen', 'MV', 'NSN', 'RLP', 'SH', 'SN', 'SNA', 'TH'), ('SL',))
weil links 'SL' nicht drine ist.

Das gleiche dann mit 14x1,13x3, ... , 8x8.
Ich bin noch ein Python noob und kenne mich da nicht so richtig aus. Es gibt bestimmt effiziente Methode dies zu berechnen.
Ich bin für jede Hilfe dankbar,

Gruß
cellat
Sirius3
User
Beiträge: 11566
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 26. März 2020, 11:15

Du willst set-Operationen benutzen:

Code: Alles auswählen

from itertools import combinations

features = {'Bayern', 'NRW', 'BB', 'BaWü','Berlin','Bremen','HH','Hessen','MV','NSN','RLP','SH','SL','SN','SNA','TH'}
ab = [(set(a), features - set(a)) for a in combinations(features,15)]
cellat
User
Beiträge: 2
Registriert: Donnerstag 26. März 2020, 09:40

Donnerstag 26. März 2020, 11:52

Sirius3 hat geschrieben:
Donnerstag 26. März 2020, 11:15
Du willst set-Operationen benutzen:

Code: Alles auswählen

from itertools import combinations

features = {'Bayern', 'NRW', 'BB', 'BaWü','Berlin','Bremen','HH','Hessen','MV','NSN','RLP','SH','SL','SN','SNA','TH'}
ab = [(set(a), features - set(a)) for a in combinations(features,15)]
Danke :D . Echt guter trick mit "ab = [(set(a), features - set(a)) for a in combinations(features,15)]". Und ich hatte mir etwas mit if Bedingungen vorgestellt. Gut danke dir!
Antworten