Calcular Parâmetros de Regressão Linear em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a calcular os parâmetros da regressão linear, incluindo a inclinação (m) e o intercepto (b), usando a linguagem C. O laboratório cobre o processo passo a passo de leitura de pontos de dados (x,y), cálculo da inclinação e intercepto, e impressão da equação de regressão linear no formato y = mx + b. Este laboratório fornece uma abordagem prática para análise e modelagem de dados estatísticos usando C, uma linguagem de programação amplamente utilizada.

Leitura de Pontos de Dados (x,y)

Neste passo, você aprenderá a ler pontos de dados (x,y) para análise de regressão linear em C. Criaremos um programa que permite a entrada de múltiplos pontos de dados e os armazena para cálculos posteriores.

Primeiro, vamos criar um arquivo C para implementar a leitura dos pontos de dados:

cd ~/project
nano linear_regression.c

Agora, adicione o seguinte código ao arquivo:

#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("Digite as coordenadas x e y (digite -1 -1 para finalizar):\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("\nPontos de Dados Digitados:\n");
    for (int i = 0; i < num_points; i++) {
        printf("Ponto %d: (%.2f, %.2f)\n", i+1, points[i].x, points[i].y);
    }

    return 0;
}

Compile o programa:

gcc -o linear_regression linear_regression.c

Execute o programa e digite alguns pontos de dados de exemplo:

./linear_regression

Saída de exemplo:

Digite as coordenadas x e y (digite -1 -1 para finalizar):
1 2
2 4
3 5
4 4
5 5
-1 -1

Pontos de Dados Digitados:
Ponto 1: (1.00, 2.00)
Ponto 2: (2.00, 4.00)
Ponto 3: (3.00, 5.00)
Ponto 4: (4.00, 4.00)
Ponto 5: (5.00, 5.00)

Vamos analisar os componentes-chave deste código:

  1. Definimos uma estrutura DataPoint para armazenar as coordenadas x e y.
  2. MAX_POINTS limita o número de pontos de dados para evitar estouro.
  3. O programa usa um loop while para ler as coordenadas.
  4. Os usuários podem inserir pontos de dados e terminar a entrada digitando -1 -1.
  5. O programa imprime todos os pontos de dados inseridos para verificação.

Cálculo da Inclinação (m) e Intercepto (b)

Neste passo, você aprenderá a calcular a inclinação (m) e o intercepto (b) para regressão linear usando o método dos mínimos quadrados.

Primeiro, atualize o arquivo linear_regression.c anterior:

cd ~/project
nano linear_regression.c

Substitua o código anterior pela seguinte implementação:

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

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

// Função para calcular os parâmetros da regressão linear
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;

    // Cálculo da inclinação (m)
    *m = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x * sum_x);

    // Cálculo do intercepto (b)
    *b = (sum_y - (*m) * sum_x) / n;
}

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

    printf("Digite as coordenadas x e y (digite -1 -1 para finalizar):\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("\nResultados da Regressão Linear:\n");
    printf("Número de pontos: %d\n", num_points);
    printf("Inclinação (m): %.4f\n", slope);
    printf("Intercepto (b): %.4f\n", intercept);
    printf("Equação: y = %.4fx + %.4f\n", slope, intercept);

    return 0;
}

Compile o programa com a biblioteca matemática:

gcc -o linear_regression linear_regression.c -lm

Execute o programa com pontos de dados de exemplo:

./linear_regression

Saída de exemplo:

Digite as coordenadas x e y (digite -1 -1 para finalizar):
1 2
2 4
3 5
4 4
5 5
-1 -1

Resultados da Regressão Linear:
Número de pontos: 5
Inclinação (m): 0.6000
Intercepto (b): 2.2000
Equação: y = 0.6000x + 2.2000

Pontos-chave sobre o cálculo da regressão linear:

  1. Usamos o método dos mínimos quadrados para calcular a inclinação e o intercepto.
  2. A fórmula para a inclinação é: m = (n _ Σ(xy) - Σx _ Σy) / (n * Σ(x²) - (Σx)²)
  3. A fórmula para o intercepto é: b = (Σy - m * Σx) / n
  4. A função computeLinearRegression() calcula esses parâmetros.
  5. A função principal imprime a equação de regressão.

Imprimir a Equação y = mx + b

Neste passo, você aprenderá a imprimir a equação de regressão linear e prever valores de y usando a inclinação e o intercepto calculados.

Atualize o arquivo linear_regression.c para adicionar a funcionalidade de previsão:

cd ~/project
nano linear_regression.c

Substitua o código anterior pela seguinte implementação:

#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;
}

// Função para prever o valor de y
double predictY(double m, double b, double x) {
    return m * x + b;
}

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

    printf("Digite as coordenadas x e y (digite -1 -1 para finalizar):\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("\nEquação de Regressão Linear:\n");
    printf("y = %.4fx + %.4f\n", slope, intercept);

    // Imprimir previsões para valores de x de amostra
    printf("\nValores de y previstos:\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("Quando x = %.2f, y = %.4f\n", test_x_values[i], predicted_y);
    }

    return 0;
}

Compile o programa:

gcc -o linear_regression linear_regression.c -lm

Execute o programa com pontos de dados de exemplo:

./linear_regression

Saída de exemplo:

Digite as coordenadas x e y (digite -1 -1 para finalizar):
1 2
2 4
3 5
4 4
5 5
-1 -1

Equação de Regressão Linear:
y = 0.6000x + 2.2000

Valores de y previstos:
Quando x = 0.00, y = 2.2000
Quando x = 2.50, y = 3.7000
Quando x = 6.00, y = 5.8000
Quando x = 10.00, y = 8.2000

Pontos-chave sobre a impressão da equação de regressão:

  1. Adicionamos uma função predictY() para calcular y para qualquer x dado.
  2. A função principal imprime a equação completa: y = mx + b.
  3. Demonstramos a previsão mostrando valores de y para diferentes entradas de x.
  4. A saída fornece uma visualização clara do modelo de regressão linear.

Resumo

Neste laboratório, você aprendeu como ler pontos de dados (x, y) para análise de regressão linear em C. Você criou um programa que permite a entrada de múltiplos pontos de dados e os armazena para cálculos posteriores. Também aprendeu como imprimir os pontos de dados inseridos para verificação.

Em seguida, você aprenderá como calcular a inclinação (m) e o intercepto (b) da linha de regressão linear e, em seguida, imprimir a equação na forma de y = mx + b.