python probability

Normalizando una lista de números en Python



probability (7)

¿Cuánto dura la lista que vas a normalizar?

def psum(it): "This function makes explicit how many calls to sum() are done." print "Another call!" return sum(it) raw = [0.07,0.14,0.07] print "How many calls to sum()?" print [ r/psum(raw) for r in raw] print "/nAnd now?" s = psum(raw) print [ r/s for r in raw] # if one doesn''t want auxiliary variables, it can be done inside # a list comprehension, but in my opinion it''s quite Baroque print "/nAnd now?" print [ r/s for s in [psum(raw)] for r in raw]

Salida

# How many calls to sum()? # Another call! # Another call! # Another call! # [0.25, 0.5, 0.25] # # And now? # Another call! # [0.25, 0.5, 0.25] # # And now? # Another call! # [0.25, 0.5, 0.25]

Necesito normalizar una lista de valores para encajar en una distribución de probabilidad, es decir, entre 0.0 y 1.0.

Entiendo cómo normalizar, pero tenía curiosidad si Python tenía una función para automatizar esto.

Me gustaría ir desde

raw = [0.07, 0.14, 0.07]

a

normed = [0.25, 0.50, 0.25]


No hay ninguna función en la biblioteca estándar (que yo sepa) que lo hará, pero hay absolutamente módulos por ahí que tienen tales funciones. Sin embargo, es bastante fácil que solo puedas escribir tu propia función:

def normalize(lst): s = sum(lst) return map(lambda x: float(x)/s, lst)

Salida de muestra:

>>> normed = normalize(raw) >>> normed [0.25, 0.5, 0.25]


Si considera usar numpy , puede obtener una solución más rápida.

import random, time import numpy as np a = random.sample(range(1, 20000), 10000) since = time.time(); b = [i/sum(a) for i in a]; print(time.time()-since) # 0.7956490516662598 since = time.time(); c=np.array(a);d=c/sum(a); print(time.time()-since) # 0.001413106918334961


Si tu lista tiene números negativos, así es como lo normalizarías.

a = range(-30,31,5) norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]


Utilizar :

norm = [float(i)/sum(raw) for i in raw]

normalizar contra la suma para garantizar que la suma sea siempre 1.0 (o lo más cerca posible).

utilizar

norm = [float(i)/max(raw) for i in raw]

normalizar contra el máximo


tratar:

normed = [i/sum(raw) for i in raw] normed [0.25, 0.5, 0.25]


Prueba esto :

from __future__ import division raw = [0.07, 0.14, 0.07] def norm(input_list): norm_list = list() if isinstance(input_list, list): sum_list = sum(input_list) for value in input_list: tmp = value /sum_list norm_list.append(tmp) return norm_list print norm(raw)

Esto hará lo que pediste. Pero sugeriré probar la normalización de Min-Max.

normalización min-max:

def min_max_norm(dataset): if isinstance(dataset, list): norm_list = list() min_value = min(dataset) max_value = max(dataset) for value in dataset: tmp = (value - min_value) / (max_value - min_value) norm_list.append(tmp) return norm_list