martes, 17 de enero de 2017

Java Regresión Lineal Código


Java Regresión Lineal Código



Encontramos un buen ejemplo Java de la recta de regresión aquí, donde se explica adecuadamente. Vamos a poner el código Java para el cálculo de la regresión lineal dada una nube de puntos. Listo para un copy/paste. Es sencillo.



// funcion y= ax+b
    public static double[] calcRectaRegresionYsobreX(double[] lasX, 
double[] lasY) {
        double[] retVal = new double[3];
        double mediaX = calcMedia(lasX);
        double mediaY = calcMedia(lasY);
        double varianzaX = (calcMediaDeLosCuadrados(lasX) - Math.pow(mediaX, 2));
        double varianzaY = (calcMediaDeLosCuadrados(lasY) - Math.pow(mediaY, 2));
        double covarianza = calcMediaDeLosProductos(lasX, lasY) - (mediaX * mediaY);
        double diviCovaX = covarianza / varianzaX;

        retVal[0] = diviCovaX;                     
// aqui devuelve la pendiente de la recta
        retVal[1] = -(diviCovaX * mediaX) + mediaY;   
// aqui devuelve el parametro independiente
        if ((Math.sqrt(varianzaX) * Math.sqrt(varianzaY))==0){
            retVal[2]=1;
        } else {
            retVal[2] = covarianza / (Math.sqrt(varianzaX) * 
Math.sqrt(varianzaY)); // esto es la correlacion r
        }
        return retVal;
    }

    // funcion x= ay + b
    public static double[] calcRectaRegresionXsobreY(double[] lasX, double[] lasY) {
        double[] retVal = new double[3];
        double mediaX = calcMedia(lasX);
        double mediaY = calcMedia(lasY);
        double varianzaX = (calcMediaDeLosCuadrados(lasX) - Math.pow(mediaX, 2));
        double varianzaY = (calcMediaDeLosCuadrados(lasY) - Math.pow(mediaY, 2));
        double covarianza = calcMediaDeLosProductos(lasX, lasY) - (mediaX * mediaY);
        double diviCovaY = covarianza / varianzaY;

        retVal[0] = diviCovaY;                     
// aqui devuelve la pendiente de la recta
        retVal[1] = -(diviCovaY * mediaY) + mediaX;   
// aqui devuelve el parametro independiente
        retVal[2] = covarianza / (Math.sqrt(varianzaX) * 
Math.sqrt(varianzaY)); // esta es la correlacion r
        return retVal;
    }

    public static double calcMedia(double[] valores) {
        double retVal = 0;
        for (int i = 0; i < valores.length; i++) {
            retVal += valores[i];
        }
        return retVal / valores.length;
    }

    public static double calcMediaDeLosCuadrados(double[] valores) {
        double retVal = 0;
        for (int i = 0; i < valores.length; i++) {
            retVal += Math.pow(valores[i], 2);
        }
        return retVal / valores.length;
    }

    public static double calcMediaDeLosProductos(double[] valores1, 
double[] valores2) {
        double retVal = 0;
        for (int i = 0; i < valores1.length; i++) {
            retVal += valores1[i] * valores2[i];
        }
        return retVal / valores1.length;
    }
    


Simplemente, llamaremos al método calcRectaRegresionYSobreX pasándole un array de valores de X y un array de valores de Y (es decir, en definitiva, una lista de puntos).



Retorno de la función

Para una función y=ax+b , esta función nos devolverá un vector de doubles de la siguiente manera.

posición[0] = pendiente de la recta (a)
posición[1] = término independiente (b)
posición[2] = correlación (grado de unión de -1 a 1)

Así de sencillo. Ya tenemos la función de la recta de regresión de la nube de puntos dada y el índice de correlación.

Si necesitas una explicación más detallada, prueba aquí.

5 comentarios:

  1. Te devuelve la pendiente, el término independiente y la correlacion. Si quieres solo la correlación, muy fácil, coge solo la correlación, es decir, el valor[2]

    posición[0] = pendiente de la recta (a)
    posición[1] = término independiente (b)
    posición[2] = correlación (grado de unión de -1 a 1)

    ResponderEliminar