Calcular parámetros de regresión lineal en C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo calcular los parámetros de regresión lineal, incluyendo la pendiente (m) y la intersección (b), utilizando el lenguaje de programación C. El laboratorio cubre el proceso paso a paso de leer los puntos de datos (x,y), calcular la pendiente y la intersección, e imprimir la ecuación de regresión lineal en el formato y = mx + b. Este laboratorio ofrece un enfoque práctico para el análisis y modelado de datos estadísticos utilizando C, un lenguaje de programación muy utilizado.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/data_types("Data Types") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/data_types -.-> lab-435150{{"Calcular parámetros de regresión lineal en C"}} c/arrays -.-> lab-435150{{"Calcular parámetros de regresión lineal en C"}} c/math_functions -.-> lab-435150{{"Calcular parámetros de regresión lineal en C"}} c/user_input -.-> lab-435150{{"Calcular parámetros de regresión lineal en C"}} c/output -.-> lab-435150{{"Calcular parámetros de regresión lineal en C"}} end

Leer puntos de datos (x,y)

En este paso, aprenderás cómo leer puntos de datos (x,y) para el análisis de regresión lineal en C. Crearemos un programa que permita la entrada de múltiples puntos de datos y los almacene para cálculos posteriores.

Primero, creemos un archivo C para implementar la lectura de puntos de datos:

cd ~/project
nano linear_regression.c

Ahora, agreguemos el siguiente código al archivo:

#include <stdio.h>
#define MAX_POINTS 100

typedef struct {
    double x;
    double y;
} DataPoint;

int main() {
    DataPoint points[MAX_POINTS];
    int num_points = 0;

    printf("Enter x and y coordinates (enter -1 -1 to finish):\n");

    while (num_points < MAX_POINTS) {
        double x, y;
        scanf("%lf %lf", &x, &y);

        if (x == -1 && y == -1) {
            break;
        }

        points[num_points].x = x;
        points[num_points].y = y;
        num_points++;
    }

    printf("\nData Points Entered:\n");
    for (int i = 0; i < num_points; i++) {
        printf("Point %d: (%.2f, %.2f)\n", i+1, points[i].x, points[i].y);
    }

    return 0;
}

Compilamos el programa:

gcc -o linear_regression linear_regression.c

Ejecutamos el programa y ingresamos algunos puntos de datos de muestra:

./linear_regression

Salida de ejemplo:

Enter x and y coordinates (enter -1 -1 to finish):
1 2
2 4
3 5
4 4
5 5
-1 -1

Data Points Entered:
Point 1: (1.00, 2.00)
Point 2: (2.00, 4.00)
Point 3: (3.00, 5.00)
Point 4: (4.00, 4.00)
Point 5: (5.00, 5.00)

Analicemos los componentes clave de este código:

  1. Definimos una estructura DataPoint para almacenar las coordenadas x e y.
  2. MAX_POINTS limita el número de puntos de datos para evitar desbordamiento.
  3. El programa utiliza un bucle while para leer las coordenadas.
  4. Los usuarios pueden ingresar puntos de datos y terminar la entrada ingresando -1 -1.
  5. El programa imprime todos los puntos de datos ingresados para verificación.

Calcular la pendiente (m) y la intersección (b)

En este paso, aprenderás cómo calcular la pendiente (m) y la intersección (b) para la regresión lineal utilizando el método de mínimos cuadrados.

Primero, actualiza el archivo linear_regression.c anterior:

cd ~/project
nano linear_regression.c

Reemplaza el código anterior con la siguiente implementación:

#include <stdio.h>
#include <math.h>
#define MAX_POINTS 100

typedef struct {
    double x;
    double y;
} DataPoint;

// Function to compute linear regression parameters
void computeLinearRegression(DataPoint points[], int num_points, double *m, double *b) {
    double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x_squared = 0;

    for (int i = 0; i < num_points; i++) {
        sum_x += points[i].x;
        sum_y += points[i].y;
        sum_xy += points[i].x * points[i].y;
        sum_x_squared += points[i].x * points[i].x;
    }

    double n = num_points;

    // Compute slope (m)
    *m = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x * sum_x);

    // Compute y-intercept (b)
    *b = (sum_y - (*m) * sum_x) / n;
}

int main() {
    DataPoint points[MAX_POINTS];
    int num_points = 0;

    printf("Enter x and y coordinates (enter -1 -1 to finish):\n");

    while (num_points < MAX_POINTS) {
        double x, y;
        scanf("%lf %lf", &x, &y);

        if (x == -1 && y == -1) {
            break;
        }

        points[num_points].x = x;
        points[num_points].y = y;
        num_points++;
    }

    double slope, intercept;
    computeLinearRegression(points, num_points, &slope, &intercept);

    printf("\nLinear Regression Results:\n");
    printf("Number of points: %d\n", num_points);
    printf("Slope (m): %.4f\n", slope);
    printf("Y-Intercept (b): %.4f\n", intercept);
    printf("Equation: y = %.4fx + %.4f\n", slope, intercept);

    return 0;
}

Compila el programa con la biblioteca matemática:

gcc -o linear_regression linear_regression.c -lm

Ejecuta el programa con puntos de datos de muestra:

./linear_regression

Salida de ejemplo:

Enter x and y coordinates (enter -1 -1 to finish):
1 2
2 4
3 5
4 4
5 5
-1 -1

Linear Regression Results:
Number of points: 5
Slope (m): 0.6000
Y-Intercept (b): 2.2000
Equation: y = 0.6000x + 2.2000

Puntos clave sobre el cálculo de la regresión lineal:

  1. Utilizamos el método de mínimos cuadrados para calcular la pendiente y la intersección.
  2. La fórmula para la pendiente es: m = (n _ Σ(xy) - Σx _ Σy) / (n * Σ(x²) - (Σx)²)
  3. La fórmula para la intersección en y es: b = (Σy - m * Σx) / n
  4. La función computeLinearRegression() calcula estos parámetros
  5. La función principal imprime la ecuación de regresión

Imprimir y = mx + b

En este paso, aprenderás cómo imprimir la ecuación de regresión lineal y predecir valores de y utilizando la pendiente e intersección calculadas.

Actualiza el archivo linear_regression.c para agregar la funcionalidad de predicción:

cd ~/project
nano linear_regression.c

Reemplaza el código anterior con la siguiente implementación:

#include <stdio.h>
#include <math.h>
#define MAX_POINTS 100

typedef struct {
    double x;
    double y;
} DataPoint;

void computeLinearRegression(DataPoint points[], int num_points, double *m, double *b) {
    double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x_squared = 0;

    for (int i = 0; i < num_points; i++) {
        sum_x += points[i].x;
        sum_y += points[i].y;
        sum_xy += points[i].x * points[i].y;
        sum_x_squared += points[i].x * points[i].x;
    }

    double n = num_points;

    *m = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x * sum_x);
    *b = (sum_y - (*m) * sum_x) / n;
}

// Function to predict y value
double predictY(double m, double b, double x) {
    return m * x + b;
}

int main() {
    DataPoint points[MAX_POINTS];
    int num_points = 0;

    printf("Enter x and y coordinates (enter -1 -1 to finish):\n");

    while (num_points < MAX_POINTS) {
        double x, y;
        scanf("%lf %lf", &x, &y);

        if (x == -1 && y == -1) {
            break;
        }

        points[num_points].x = x;
        points[num_points].y = y;
        num_points++;
    }

    double slope, intercept;
    computeLinearRegression(points, num_points, &slope, &intercept);

    printf("\nLinear Regression Equation:\n");
    printf("y = %.4fx + %.4f\n", slope, intercept);

    // Print prediction for sample x values
    printf("\nPredicted y values:\n");
    double test_x_values[] = {0, 2.5, 6, 10};
    for (int i = 0; i < 4; i++) {
        double predicted_y = predictY(slope, intercept, test_x_values[i]);
        printf("When x = %.2f, y = %.4f\n", test_x_values[i], predicted_y);
    }

    return 0;
}

Compila el programa:

gcc -o linear_regression linear_regression.c -lm

Ejecuta el programa con puntos de datos de muestra:

./linear_regression

Salida de ejemplo:

Enter x and y coordinates (enter -1 -1 to finish):
1 2
2 4
3 5
4 4
5 5
-1 -1

Linear Regression Equation:
y = 0.6000x + 2.2000

Predicted y values:
When x = 0.00, y = 2.2000
When x = 2.50, y = 3.7000
When x = 6.00, y = 5.8000
When x = 10.00, y = 8.2000

Puntos clave sobre la impresión de la ecuación de regresión:

  1. Agregamos una función predictY() para calcular y para cualquier x dado.
  2. La función principal imprime la ecuación completa: y = mx + b.
  3. Demostramos la predicción mostrando valores de y para diferentes entradas de x.
  4. La salida proporciona una visualización clara del modelo de regresión lineal.

Resumen

En este laboratorio, aprendiste cómo leer puntos de datos (x,y) para el análisis de regresión lineal en C. Creaste un programa que permite la entrada de múltiples puntos de datos y los almacena para cálculos posteriores. También aprendiste cómo imprimir los puntos de datos ingresados para verificación.

A continuación, aprenderás cómo calcular la pendiente (m) y la intersección (b) de la línea de regresión lineal, y luego imprimir la ecuación en la forma y = mx + b.