1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| from __future__ import division
n = 20000 # nombre de cuts
m = 1200 # taille de obs et de pred
#obs = [0, 0, 1, 1, 0, 1]
#pred = [0.9874562164, 0.23565464, 0.756586787, 0.894542311, 0.1212121, 0.9953121234]
# pour simuler des inputs
import random
random.seed(0)
obs = [random.randint(0,1) for _ in xrange(m)]
pred = [random.random() for _ in xrange(m)]
# précalculer le nombre de 0 et de 1 dans obs
fnvp = sum(obs)
fpvn = len(obs) - fnvp
# partitionner pred en 2 morceaux:
# pred0 qui contient les valeur de pred pour lesquelles obs=0
# pred1 qui contient les valeur de pred pour lesquelles obs=1
pred = zip(obs, pred) # decorate
pred.sort() # sort
pred = [p for _,p in pred] # undecorate
pred0, pred1 = pred[:fpvn], pred[fpvn:] # partitionnement
cuts = [u/n for u in xrange(n+1)]
# calcul de res
pred0s = []
i = 0
l = len(pred0)
for u in cuts:
while i < l and pred0[i] < u:
i += 1
pred0s.append(i)
pred1.reverse() # on veut pred1 décroissant
cuts.reverse() # et cuts décroissant
pred1s = []
i = 0
l = len(pred1)
for u in cuts:
while i < l and pred1[i] >= u:
i += 1
pred1s.append(i)
pred1s.reverse() # mettre pred1s en ordre décroissant
res = [p1 / fnvp + p0 / fpvn for p0, p1 in zip(pred0s, pred1s)]
m1 = max(res)
u = res.index(m1)
print m1, u |
Partager