Foros del Web » Programando para Internet » Python »

Problema con mínimos cuadrados y librerías para cálculo

Estas en el tema de Problema con mínimos cuadrados y librerías para cálculo en el foro de Python en Foros del Web. Hola! Este es mi primer mensaje. Estoy aprendiendo python. Ya sé algo de C y bueno, no me está costando, la verdad. El problema es ...
  #1 (permalink)  
Antiguo 16/12/2008, 15:12
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Problema con mínimos cuadrados y librerías para cálculo

Hola! Este es mi primer mensaje.
Estoy aprendiendo python. Ya sé algo de C y bueno, no me está costando, la verdad.
El problema es que he hecho un programa en C al que se le pasan una serie de puntos del plano bidimensional y calcula la recta de aproximación mediante mínimos cuadrados y he intentado hacer lo mismo en Python, pero no funcona correctamente.

************************************************** **************
i=0
n=0
while n<3:
n = int(raw_input("\n\nCuantos puntos tiene la funcion a lineaizar: "))

horizontal=vertical=range(n)
while (i<n):
print "\n"
horizontal[i]=float(raw_input("x["+str(i)+"]="))
print horizontal[i]
vertical[i]=float(raw_input("y["+str(i)+"]="))
print vertical[i]

i=i+1

print "\n"
i=0
while (i<n):
print horizontal[i], vertical[i], "\n"
i = i + 1


i=0
SUMx=SUMy=SUMxy=SUMxx=a=b=0.0

while (i<n):
print SUMx, SUMy, SUMxy, SUMxy, "\n"
SUMx = SUMx + horizontal[i]
SUMy = SUMy + vertical[i]
SUMxy = SUMxy + (horizontal[i]*vertical[i])
SUMxx = SUMxx + (horizontal[i]*horizontal[i])
i = i + 1

print SUMx, SUMy, SUMxy, SUMxy, "\n"
a = ( (SUMx*SUMy) - (n*SUMxy) ) / ( (SUMx*SUMx) - (n*SUMxx) )
b = ( SUMy - (a*SUMx) ) / n

print a,"x",
if b>=0:
print "+",
print b
************************************************** **************


El problema es que el resultado que muestra es erróneo porque le asigna a x[i] el contenido de y[i].
Alguien sabe cuál donde está el problema?

Otra cosa es que me gustaría saber como funcionan las "librerías" numpy, scipy y demás, cómo se instalan y eso. Porque me interesaba sobre todo que los scripts que hago se puedan utilizar directamente en otros sistemas y ordenadores, pero creo que si utilizo una de estas librerías, el ordenador que la ejecuta tendría que tener estas librerías instaladas.

Muchas gracias.
Un saludo.
  #2 (permalink)  
Antiguo 16/12/2008, 16:53
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con mínimos cuadrados y librerías para cálculo

Cuando publiques código en el foro ponlo entre etiquetas de código como:

[highlight=python]
# aquí tu código
[/highlight]

Así saldrá como:
Código python:
Ver original
  1. # aquí tu código

En el caso de Python esto es particularmente importante porque los espacios importan. Y si no lo metes entre esas etiquetas, los espacios no se van a ver y el código no es igual.
  #3 (permalink)  
Antiguo 16/12/2008, 17:02
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema con mínimos cuadrados y librerías para cálculo

Ouch! Cómo dije antes, era mi primer mensaje, jeje.

Bueno, ahí va:

Código python:
Ver original
  1. i=0
  2. n=0
  3. while n<3:
  4.     n = int(raw_input("\n\nCuantos puntos tiene la funcion a lineaizar: "))
  5.  
  6. horizontal=vertical=range(n)
  7. while (i<n):
  8.     print "\n"
  9.     horizontal[i]=float(raw_input("x["+str(i)+"]="))
  10.     print horizontal[i]
  11.     vertical[i]=float(raw_input("y["+str(i)+"]="))
  12.     print vertical[i]
  13.     i=i+1
  14.  
  15. print "\n"
  16. i=0
  17. while (i<n):
  18.     print horizontal[i], vertical[i], "\n"
  19.     i = i + 1
  20.  
  21. i=0
  22. SUMx=SUMy=SUMxy=SUMxx=a=b=0.0
  23.  
  24. while (i<n):
  25.     print SUMx, SUMy, SUMxy, SUMxy, "\n"
  26.     SUMx = SUMx + horizontal[i]
  27.     SUMy = SUMy + vertical[i]
  28.     SUMxy = SUMxy + (horizontal[i]*vertical[i])
  29.     SUMxx = SUMxx + (horizontal[i]*horizontal[i])
  30.     i = i + 1
  31.  
  32. print SUMx, SUMy, SUMxy, SUMxy, "\n"
  33. a = ( (SUMx*SUMy) - (n*SUMxy) ) / ( (SUMx*SUMx) - (n*SUMxx) )
  34. b = ( SUMy - (a*SUMx) ) / n
  35.  
  36. print a,"x",
  37. if b>=0:
  38.     print "+",
  39. print b
  #4 (permalink)  
Antiguo 16/12/2008, 18:18
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
De acuerdo Respuesta: Problema con mínimos cuadrados y librerías para cálculo

Cita:
Iniciado por huevofritopamojarpan Ver Mensaje

Otra cosa es que me gustaría saber como funcionan las "librerías" numpy, scipy y demás, cómo se instalan y eso. Porque me interesaba sobre todo que los scripts que hago se puedan utilizar directamente en otros sistemas y ordenadores, pero creo que si utilizo una de estas librerías, el ordenador que la ejecuta tendría que tener estas librerías instaladas.

Muchas gracias.
Un saludo.
Primero debes descargar la libreria y cuando lo instales selecciona la misma carpeta donde esta tu python y listo.
Una vez q estes en el GUI (consola) scribes
import tulibreria

Antes de practicar con la libreria busca documentacion sobre ella para poder usarla.

Te recomiendo la libreria matplotlib
http://matplotlib.sourceforge.net/

te la puedes descargar desde aqui:
http://sourceforge.net/project/showfiles.php?group_id=80706

y Si, tienes razon si quieres ejecutar tu programita esa pc tmb debe tener esa libreria, pero es rapido de instalar..


Aver si te pones un ejemplo correcto de la operacion de tu codigo para intentar hacerlo, aunq sea hecho a mano.. ;)
suerte...

Última edición por yuo2; 16/12/2008 a las 18:25
  #5 (permalink)  
Antiguo 16/12/2008, 20:56
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema con mínimos cuadrados y librerías para cálculo

Hola! Muchas gracias por contestar. He visto (muy por encima) la de la librería matplotlib y me parece interesante, pero cuando intente hacer las gráficas utilizaré algo parecido al popen de c para interactuar con gnuplot, que es lo que uso normalmente.

Lo que pretendo hacer con este miniprogramilla es obtener la recta que mejor interpola a una serie de puntos.
Ejermplo:

x y
1 2
2 3
3 4

Si estos son los puntos la recta y=x+1 pasa por todos ellos. El objetivo del programa es obtener esta recta. Si no existiese una recta que pasa por todos ellos se obtendría la que está más cerca de todos ellos. Ese es el fin.
Pero el problema no viene de un mal algoritmo, ya que lo he implementado en C y funciona perfectamente. El problema tiene que estar en la toma de datos, ya que si los imprimo obtengo que x[i] es igual a y[i], cuando al introducir los valores por teclado yo no he puesto eso.

Muchas gracias por el interés.
Un saludo!
  #6 (permalink)  
Antiguo 17/12/2008, 02:43
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con mínimos cuadrados y librerías para cálculo

El problema de tu programa está claro. Es la línea 6. Cuando haces esto:

Código python:
Ver original
  1. horizontal=vertical=range(n)

Más concretamente, cuando haces:

Código python:
Ver original
  1. horizontal=vertical

No estás haciendo 2 listas distintas sino que lo que haces es que tanto vertical como horizontal apunten a la misma lista; por eso cuando cambias una cambias la otra (porque son la misma) y te salen los valores iguales. La solución es fácil: crear dos listas diferentes:

Código python:
Ver original
  1. horizontal=range(n)
  2. vertical=range(n)
  #7 (permalink)  
Antiguo 17/12/2008, 06:30
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema con mínimos cuadrados y librerías para cálculo

Ajá! Joer, qué estupidez! No lo había pensado. Con esto de los tipos dinámicos me olvidé completamente de fijarme en eso.
Muchísimas gracias!!
Agur!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:28.