analytics

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