[Python-es] Exactitud con números de punto flotante.

Kiko kikocorreoso en gmail.com
Vie Ago 31 19:30:45 CEST 2012


El 31 de agosto de 2012 19:28, Kiko <kikocorreoso en gmail.com> escribió:

>
>
> El 31 de agosto de 2012 19:13, gmail <manuelcortez00 en gmail.com> escribió:
>
>  ola lista. Sucede que para una materia donde se toca el tema de cálculo
>> diferencial y análisis de datos, hice una sencilla aplicación que toma
>> datos y saca la media, desviación estándar y algunas otras cosillas más,
>> pero me topo con un problema de exactitud de los resultados, que se ve
>> sobretodo al momento de sacar la desviación estándar.
>>
>> Pongo aquí el extracto del código de la función que uso para obtenerlas,
>> ignoro si hay una forma más cómoda:
>>
>> import math
>> def desviacion_standar(lists, media):
>>     total = 0
>>     for i in range(0,len(lists)):
>>         value = lists[i]
>>         value = value - media
>>         value = value**2
>>         total = total + value
>>     total = total/float(len(lists))
>>     return math.sqrt(total)
>>
>> Los argumentos de la función son una lista de datos, que se obtienen de
>> una cadena en gtk que se parte con split, y el valor de la media, para la
>> cual tengo una función en otra parte del programa que sí la hace.
>>
>> Pongo un ejemplo: con los datos 31, 32, 32, 33, 35, 37, 40, 43, 44 y 45;
>> el valor de la media es de 37.2 y Python lo saca bien, pero el valor de la
>> desviación estándar debe ser de 5.4, y Python me devuelve un 5.132...
>>
>> Hola, ese valor de 5.4 para la desviación estándar de donde sale?
>
> Hay veces que la fórmula para la desviación estándar usa en el denominador
> N y otras N-1. En el caso de tu cálculo usas N, en el caso de 5.4 parece
> que está usando N-1. Si en total divides por N-1 te saldrá más cercano a
> 5.4.
>
>
> import math
> def desviacion_standar(lists, media):
>     total = 0
>     for i in range(0,len(lists)):
>         value = lists[i]
>         value = value - media
>         value = value**2
>         total = total + value
>     *total = total/(float(len(lists)) - 1)*
>     return math.sqrt(total)
>
> Lo importante aquí es que definas las desviación estándar como quieres, si
> tu muestra es muy grande no importa mucho la diferencia entre N o N-1, pero
> si es pequeña si que es importante.
>
> Una forma alternativa es usando numpy, que te permite hacerlo en una línea:
>
> import numpy as np
> resultado = np.std(lists)  # Para el caso en el que el denominador ser N
> resultado = np.std(lists, ddof = 1) # Para el caso en el que en el
> denominador tengas N - 1
>
> Saludos.
>

Por completar un poco más. Si necesitas mucha precisión puedes mirar el
módulo *decimal* de la librería estándar.

Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120831/3f70fc5a/attachment.html>


Más información sobre la lista de distribución Python-es