Вычисление параметров линейной регрессии на языке C

CBeginner
Практиковаться сейчас

Введение

В этом практическом занятии (лабораторной работе) вы научитесь вычислять параметры линейной регрессии, включая наклон (m) и пересечение с осью y (b), используя язык программирования C. В рамках практического занятия рассматривается пошаговый процесс чтения точек данных (x,y), вычисления наклона и пересечения с осью y, а также вывода уравнения линейной регрессии в формате y = mx + b. Это практическое занятие предоставляет практический подход к статистическому анализу данных и моделированию с использованием языка C, который является широко используемым языком программирования.

Чтение точек данных (x,y)

На этом этапе вы научитесь считывать точки данных (x,y) для анализа линейной регрессии на языке C. Мы создадим программу, которая позволит вводить несколько точек данных и сохранять их для дальнейших вычислений.

Сначала создадим файл на языке C для реализации чтения точек данных:

cd ~/project
nano linear_regression.c

Теперь добавьте следующий код в файл:

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

Скомпилируйте программу:

gcc -o linear_regression linear_regression.c

Запустите программу и введите несколько примеров точек данных:

./linear_regression

Пример вывода:

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)

Разберем основные компоненты этого кода:

  1. Мы определяем структуру DataPoint для хранения координат x и y.
  2. MAX_POINTS ограничивает количество точек данных, чтобы избежать переполнения.
  3. Программа использует цикл while для чтения координат.
  4. Пользователи могут вводить точки данных и завершить ввод, введя -1 -1.
  5. Программа выводит все введенные точки данных для проверки.

Вычисление наклона (m) и пересечения с осью y (b)

На этом этапе вы научитесь вычислять наклон (m) и пересечение с осью y (b) для линейной регрессии с использованием метода наименьших квадратов.

Сначала обновите предыдущий файл linear_regression.c:

cd ~/project
nano linear_regression.c

Замените предыдущий код следующей реализацией:

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

Скомпилируйте программу с библиотекой математических функций:

gcc -o linear_regression linear_regression.c -lm

Запустите программу с примерами точек данных:

./linear_regression

Пример вывода:

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

Основные моменты вычисления линейной регрессии:

  1. Мы используем метод наименьших квадратов для вычисления наклона и пересечения с осью y.
  2. Формула для наклона: m = (n _ Σ(xy) - Σx _ Σy) / (n * Σ(x²) - (Σx)²)
  3. Формула для пересечения с осью y: b = (Σy - m * Σx) / n
  4. Функция computeLinearRegression() вычисляет эти параметры.
  5. Главная функция выводит уравнение регрессии.

Вывод уравнения y = mx + b

На этом этапе вы научитесь выводить уравнение линейной регрессии и предсказывать значения y с использованием вычисленного наклона и пересечения с осью y.

Обновите файл linear_regression.c, чтобы добавить функциональность предсказания:

cd ~/project
nano linear_regression.c

Замените предыдущий код следующей реализацией:

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

Скомпилируйте программу:

gcc -o linear_regression linear_regression.c -lm

Запустите программу с примерами точек данных:

./linear_regression

Пример вывода:

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

Основные моменты вывода уравнения регрессии:

  1. Мы добавили функцию predictY(), чтобы вычислить значение y для любого заданного x.
  2. Главная функция выводит полное уравнение: y = mx + b.
  3. Мы демонстрируем предсказание, показывая значения y для различных входных значений x.
  4. Вывод обеспечивает ясное представление о модели линейной регрессии.

Резюме

В этом практическом занятии (лабораторной работе) вы научились считывать точки данных (x,y) для анализа линейной регрессии на языке C. Вы создали программу, которая позволяет вводить несколько точек данных и сохранять их для дальнейших вычислений. Вы также научились выводить введенные точки данных для проверки.

Далее вы научитесь вычислять наклон (m) и пересечение с осью y (b) линии линейной регрессии, а затем выводить уравнение в виде y = mx + b.