[PYTHON] Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden

Lassen Sie uns den Vortrag der PyCon JP 2016 entscheiden

(Dies ist nur ein Witz)

Das diesjährige Thema für PyCon lautet "Jeder ist anders, jeder ist gut".

Wählen wir also eine Vorlesung, die alle Elemente enthält. Verwenden Sie das Problem der kollektiven Abdeckung in der Kombinationsoptimierung (http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721).

Erstellen Sie zufällig Vorlesungskandidaten

Die Nationalität des Sprechers, das Niveau der Vorlesung, das Feld der Vorlesung usw. werden zufällig festgelegt. Die Punktzahl ist zum Beispiel die Anzahl der "Likes".

python


import numpy as np, pandas as pd
np.random.seed(1)
n = 20
a = pd.DataFrame({
        'Land': np.random.choice('アメリカ イギリス インド フランス ロシア 中Land'.split(), n),
        'Niveau': np.random.choice('Anfänger Mittelmässiger Fortgeschrittener'.split(), n),
        'Feld': np.random.choice('Datenanalyseoptimierung Maschinelles Lernen Dokument Web'.split(), n),
        'Ergebnis': np.random.randint(1, 10, n),
    })
print(a)
Niveau Feld Land Ergebnis
0 Anfänger Web China
1 Fortgeschrittene Optimierung Frankreich
2 Anfänger Datenanalyse Russland
... ... ... ...
19 Anfänger Datenanalyse Frankreich

Lösen Sie das Problem der kollektiven Deckung

Verwenden Sie ortoolpy.set_covering. Da es sich um eine Minimierung handelt, haben wir die Umkehrung der Punktzahl gewichtet.

python


from ortoolpy import set_covering
n = sum(b.nunique() for b in [a.Niveau, a.Feld, a.Land]) #Insgesamt eindeutige Anzahl
res = set_covering(n, [(1/r.Ergebnis, r[:3].tolist()) for _, r in a.iterrows()])
print(a.ix[res])
Niveau Feld Land Ergebnis
5 Fortgeschrittene Maschinelles Lernen Frankreich
8 Mittlere Dokument Amerika
10 Anfänger Optimierung Russland
13 Mittlere Datenanalyse England
14 Mittlere Optimierung Indien
16 Fortgeschrittene Web China

Sie können sehen, dass alle Elemente angezeigt wurden.

das ist alles

Recommended Posts