Analizando la mejor Ecuación de una Recta a partir de algunos Puntos [ Introducción al Machine Learning Parte 2]

in #spanish6 years ago

La_MEJOR_RECTA

Fuente de la imagen Salida del programa que a continuación se hace.

En la entrada anterior de esta serie Introducción al Machine Learning hablamos sobre la ecuación de la Recta e incluso creamos un pequeño Script que pedía 2 puntos para crear una recta, ahora estoy pensando en crear un Script que de forma interactiva nos permita ver si un punto cualquiera se encuentra en la recta o no, y nos grafiqué la recta que mejor se ajuste a los 3 o 4 puntos que vayamos agregando.

¿Para que quiero que analicemos la recta desde esta perspectiva?



Es interesante conocer una recta, por ejemplo en el precio de las criptomonedas para saber o predecir un comportamiento en el tiempo, por ejemplo supongamos estos puntos de una recta: ( 0, 0 ),( 1, 1 ),( 2 , 2 ), esto seria una recta sencilla como esta:



Ya teniendo esta Recta podríamos agregar otro punto y analizar si esta dentro de la recta y si no esta crear una nueva recta y Graficár todos los puntos que la componen claro ya todos los datos no estarían en la Recta, y comenzaríamos a tener perdidas, pero como sabemos que en todo caos hay orden podemos intentar predecir por ejemplo el precio de alguna moneda, claro entendiendo los factores de caos que en nuestro caso seria por ejemplo la frecuencia del cambio en la recta o hacia donde se va moviendo por hora, día o mes.

¿Entonces que vamos a hacer?

Vamos a crear un archivo que va a contener los puntos de nuestra recta y luego vamos a a ir agregando puntos y la recta se va a ir modificando, solo eso haremos en esta entrada ya luego jugaremos con frecuencias de cambio y perdidas de los puntos que están mas alejados, variaciones grandes en la recta las tendremos en cuenta, necesitamos comprender como se mueve este mundo para poder analizarlo y actuar con los números en el.

Ahora vamos a Graficár un ejemplo de  Recta que mejor se ajusta (Método de mínimos cuadrados), a eso me refiero con perdidas cuadradas es decir el mínimo de las perdidas cuadradas, pero en esta ocasión no vamos a revisar las perdidas o a graficarlas en la próxima entrada mejor, la información de arriba es muy didáctica por lo tanto la recomiendo.


Archivos necesarios para que el código corra: recta_mod.txt que es donde guardaremos nuestra recta o los puntos de la recta y el ajustador_recta.py que es el ejecutable.

El archivo recta_mod.txt contiene lo siguiente:

( 8, 3 ),( 2, 10 ) ,( 11, 3 ) ,(  6, 6 ) ,( 5, 8 ),( 4, 12 ) ,(  12, 1 ) ,( 9, 4 ),(  6, 9 ) ,( 1, 14 )

CÓDIGO PYTHON:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import string, re
import statistics as stats
archivo = "recta_mod.txt"
recta_list = open(archivo,'r')    
recta_list = recta_list.read()
recta_list = eval(recta_list)
print recta_list 
#.splitlines(",")
list_X_X = []
list_y_y = []
list_XY_relacion = []
list_XX_cuadrados = []
for point in recta_list:
    print point, point[0], point[1]
    list_X_X.append(point[0])
    list_y_y.append(point[1])
    xy_rel = point[0] * point[1] * 1.00000
    xx_cua = point[0] * point[0] * 1.00000
    list_XY_relacion.append(xy_rel)
    list_XX_cuadrados.append(xx_cua)
#La mejor recta calculos
## Calcular la Pendiente o "m"
parte_1 = ((sum(list_XY_relacion)* 1.00000 )- ((sum(list_X_X)* sum(list_y_y))/len(list_X_X)))
parte_2 =  (1.00000 * ( sum(list_XX_cuadrados)) -((sum(list_X_X)**2)/len(list_X_X)))
pendiente = parte_1 / parte_2
print pendiente ,"PENDIENTE"
## calcular el corte en y o interseccion
### Debemos calcula la media de "X" y la de "Y"
med_y = (sum(list_y_y)*1.0000/len(list_y_y))
med_y_p = stats.mean(list_y_y)
med_x = (sum(list_X_X)*1.0000/len(list_X_X))
med_x_p = stats.mean(list_X_X)
print med_y, med_y_p ## Esto es para probar con el modulo statistics que hemos hecho bien el calculo
print med_x, med_x_p ## Cuando se esta enseñando o comenzando, siempre recomiendo hacer los calculos 1 a 1, sin librerias de ser posible
### Ahora calculamos b de la ecuacion media(y) = m*media(x) + b, despejamos y queda asi: b = media(y) - m*media(x)
corte_en_Y = med_y - ( pendiente * med_x )
## Ahora vamos a dibujar la recta Usando la 'pendiente' y la intercepción en 'y' 
#### para formar la ecuación de la recta que mejor se ajusta. Dando los mismos valores de x de la lista X_X 
##### Recuerda  y = mx +b
### creamos una funcion sencilla
def funcion_recta(list_X_X, pendiente, corte_en_Y ):
    list_y_ajustada = []
    for x in list_X_X:
        y_ajustada = (pendiente * x) + corte_en_Y
        list_y_ajustada.append(y_ajustada)
    return list_y_ajustada
### Ahora Vamos por el Grafico
plt.figure()   #  Añade un nuevo gráfico y lo activa
#Graficamos la mejor recta primero
x = list_X_X   
list_y_ajustada = funcion_recta(list_X_X, pendiente, corte_en_Y)
y = list_y_ajustada
print y, list_X_X, pendiente, corte_en_Y # imprimimos para ir viendo que todo vaya bien
plt.plot(x, y, marker='x', linestyle='-', color='r', label = "Recta Ajustada")
#Graficamos ahora los puntos reales
plt.xlabel("Eje X")   # Inserta el título del eje X
plt.ylabel("Eje Y")   # Inserta el título del eje Y
plt.plot(list_X_X, list_y_y, marker='o', linestyle='', color='g', label = "Linea General")
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.) ## Para ver mejor las leyendas
plt.ioff()   # Desactiva modo interactivo de dibujo
plt.show()

  Ahora te voy a dar un paseo por el código para que en la próxima entrada estemos al día, Lo voy a dividir en varios Bloques.

Bloque 1

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import statistics as stats

Le decimos al archivo que se ejecuta con #!/usr/bin/env python y puede leer -*- coding: utf-8 -*-, importamos las librerías que vamos a usar, breve descripción:

  • matplotlib Necesaria para Graficár desde Python.
  • statistics Esta realmente no es Necesaria pero la voy a usar como ejemplo.

BLOQUE 2

archivo = "recta_mod.txt"
recta_list = open(archivo,'r')    
recta_list = recta_list.read()
recta_list = eval(recta_list)
print recta_list 
list_X_X = []
list_y_y = []
list_XY_relacion = []
list_XX_cuadrados = []

creamos la variable archivo archivo = "recta_mod.txt"  , este es el archivo que va a leer el script para extraer los puntos de nuestra recta, lo abrimos ya que es un documento recta_list = open(archivo,'r')    lo leemos  recta_list = recta_list.read() y luego lo evaluamos para que sea una lista recta_list = eval(recta_list) podríamos hacerlo de otra manera? SI. Luego creamos las listas que vamos a usar.

BLOQUE 3

for point in recta_list:
    print point, point[0], point[1]
    list_X_X.append(point[0])
    list_y_y.append(point[1])
    xy_rel = point[0] * point[1] * 1.00000
    xx_cua = point[0] * point[0] * 1.00000
    list_XY_relacion.append(xy_rel)
    list_XX_cuadrados.append(xx_cua)

Primero leemos la lista del TXT que hemos extraído, agregamos los puntos a su respectiva lista de X y  Y,   list_X_X.append(point[0])   y  list_y_y.append(point[1]) para luego generar el valor relacionado de X y Y y el cuadrado de X que es nuestra referencia, esto lo hacemos para luego buscar la mejor recta para todos los puntos en estudio.

Recuerden el cuadro de la pagina mencionada arriba, esto es lo que queremos con este Bucle:

Fuente 

BLOQUE 4

#La mejor recta calculos
## Calcular la Pendiente o "m"
parte_1 = ((sum(list_XY_relacion)* 1.00000 )- ((sum(list_X_X)* sum(list_y_y))/len(list_X_X)))
parte_2 =  (1.00000 * ( sum(list_XX_cuadrados)) -((sum(list_X_X)**2)/len(list_X_X)))
pendiente = parte_1 / parte_2
print pendiente ,"PENDIENTE"
## calcular el corte en y o interseccion
### Debemos calcula la media de "X" y la de "Y"
med_y = (sum(list_y_y)*1.0000/len(list_y_y))
med_y_p = stats.mean(list_y_y)
med_x = (sum(list_X_X)*1.0000/len(list_X_X))
med_x_p = stats.mean(list_X_X)
print med_y, med_y_p ## Esto es para probar con el modulo statistics que hemos hecho bien el calculo
print med_x, med_x_p ## Cuando se esta enseñando o comenzando, siempre recomiendo hacer los calculos 1 a 1, sin librerias de ser posible
### Ahora calculamos b de la ecuacion media(y) = m*media(x) + b, despejamos y queda asi: b = media(y) - m*media(x)
corte_en_Y = med_y - ( pendiente * med_x )

Aqui es donde queria llegar me he apoyado en la pagina antes mencionada. Primero que nada vamos a revisar que tengamos estos puntos en nuestro archivo recta_mod.txt:

( 8, 3 ),( 2, 10 ) ,( 11, 3 ) ,(  6, 6 ) ,( 5, 8 ),( 4, 12 ) ,(  12, 1 ) ,( 9, 4 ),(  6, 9 ) ,( 1, 14 )

Ahora la linea que dice parte_1 y parte_2 son parte de la siguiente ecuación:

Fuente

La parte 1 es el Dividendo y la parte 2 el Divisor. Luego se calcula la media de 'X' y de 'Y' para meter estos valores en la ecuación de la recta y encontrar el corte en 'Y' o 'b'.

Fuente

Si te fijas he creado dos medias para X  y Y pero son las mismas esto con el fin de verificar resultados una la cree a mano con la ecuación respectiva y la otra con la librería statistic de Python pero recomiendo siempre usar las ecuaciones y las librerías solo usarlas para cosas complejas que ya entendemos.

Por motivos Didácticos no voy a entrar en como generar una gráfica en Python dejare algunos enlaces para que se diviertan, solo decir que si se fijan bien una recta es creada con los puntos y otra es creada con la pendiente y el corte en Y, esta es la recta que necesitamos y es la que menos perdida tiene, es decir es la que se acerca mas a todos los puntos.

En la próxima entrada espero Graficár las antiguas rectas para ello deberíamos hacer algunas funciones para no repetir tanto código e ir implementando programación orientada a objetos.

Esto es lo que me genera a mi el código, es decir a sido probado y verificado:


Dios te Bendiga y que Dios Bendiga a Venezuela. 

Sígueme y veras mas Programación y API STEEMIT :D

Sort:  

Una publicación muy útil, gracias

Gracias amigo por tu comentario me alegra que te sea de utilidad...
Saludos

"**** posting Anda sangat bagus, saya suka dan mengikuti Anda, saya harap Anda membantu memperbaiki reputasi saya, terima kasih.****
****your posts are very good, I like and follow you, I hope you help improve my reputation, thanks.***

Entiendo que lo que estás haciendo es una recta de regresión, ¿no?

Si es una recta de regresión pero estoy programando las diferentes rectas posibles para llegar a la mejor, por ejemplo si graficamos solo 8 de los 10 puntos tendríamos otra recta pero muy parecida estoy interesado en la frecuencia de cambio y en la frecuencia de cambio de la perdida mas que en la regresión como método de predicción...

Espero verte por aquí veo que entiendes del tema, pero lo quiero plantear de manera diferente...
Gracias por comentar :D

Contra más puntos, más fiabilidad de la recta en la predicción. Llegará un momento en que la frecuencia de cambio que dices no existirá pues habrá una gran densidad de puntos, donde un par de puntos más o menos no será decisivo para que la recta cambie.
Creo que si lo que quieres hacer es predecir el siguiente punto respecto a las diferentes desviaciones de las rectas respecto a la anterior, solo te valdrá cuando la densidad de puntos sea muy baja.

Bueno si y no, por que si metemos mas variables como cambios de otras monedas y poco a poco vamos analizando 3 o 5 gráficas en conjunto y teniendo en cuenta la recta general de por ejemplo todos los años, el ultimo año, el ultimo mes y las ultimas 24 horas podríamos ver muchos cambios en las rectas que nos podrían interesar para hacer mas predicciones reales :D
Bueno es lo que pienso y creo que ya tengo casi todo listo para probarlo :D
Saludos

Coin Marketplace

STEEM 0.16
TRX 0.13
JST 0.027
BTC 59329.35
ETH 2613.53
USDT 1.00
SBD 2.44