Вычисление коэффициента корреляции Пирсона на C

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

Введение

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

Практикум предоставляет пошаговое руководство, начиная с реализации функциональности ввода данных, далее следует вычисление сумм, необходимых для формулы корреляции, и, наконец, вывод коэффициента корреляции.

Чтение парных данных (x, y)

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

Сначала создадим файл исходного кода C для функциональности ввода данных:

cd ~/project
nano correlation_input.c

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

#include <stdio.h>
#define MAX_POINTS 100

int main() {
    double x[MAX_POINTS], y[MAX_POINTS];
    int n, i;

    printf("Enter the number of data points (max %d): ", MAX_POINTS);
    scanf("%d", &n);

    printf("Enter x and y coordinates:\n");
    for (i = 0; i < n; i++) {
        printf("Point %d (x y): ", i + 1);
        scanf("%lf %lf", &x[i], &y[i]);
    }

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

    return 0;
}

Компилируем программу:

gcc -o correlation_input correlation_input.c

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

./correlation_input

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

Enter the number of data points (max 100): 5
Enter x and y coordinates:
Point 1 (x y): 1 2
Point 2 (x y): 2 4
Point 3 (x y): 3 5
Point 4 (x y): 4 4
Point 5 (x y): 5 5

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. Мы определяем максимальное количество точек данных (MAX_POINTS), чтобы предотвратить переполнение памяти.
  2. Программа запрашивает у пользователя количество точек данных.
  3. Затем она позволяет пользователю ввести координаты x и y для каждой точки.
  4. Наконец, она выводит введенные точки данных, чтобы подтвердить ввод.

Вычисление сумм и использование формулы для корреляции

На этом шаге мы расширим предыдущую программу, чтобы вычислить необходимые суммы для расчета коэффициента корреляции Пирсона. Мы изменим файл correlation_input.c, чтобы включить вычисления по формуле корреляции.

Откройте предыдущий файл:

cd ~/project
nano correlation_input.c

Обновите код следующим реализацией:

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

double calculatePearsonCorrelation(double x[], double y[], int n) {
    double sum_x = 0, sum_y = 0, sum_xy = 0;
    double sum_x_squared = 0, sum_y_squared = 0;

    // Вычисление необходимых сумм
    for (int i = 0; i < n; i++) {
        sum_x += x[i];
        sum_y += y[i];
        sum_xy += x[i] * y[i];
        sum_x_squared += x[i] * x[i];
        sum_y_squared += y[i] * y[i];
    }

    // Формула коэффициента корреляции Пирсона
    double numerator = n * sum_xy - sum_x * sum_y;
    double denominator = sqrt((n * sum_x_squared - sum_x * sum_x) *
                               (n * sum_y_squared - sum_y * sum_y));

    return numerator / denominator;
}

int main() {
    double x[MAX_POINTS], y[MAX_POINTS];
    int n, i;

    printf("Enter the number of data points (max %d): ", MAX_POINTS);
    scanf("%d", &n);

    printf("Enter x and y coordinates:\n");
    for (i = 0; i < n; i++) {
        printf("Point %d (x y): ", i + 1);
        scanf("%lf %lf", &x[i], &y[i]);
    }

    double correlation = calculatePearsonCorrelation(x, y, n);

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

    printf("\nКоэффициент корреляции Пирсона: %.4f\n", correlation);

    return 0;
}

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

gcc -o correlation_input correlation_input.c -lm

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

./correlation_input

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

Enter the number of data points (max 100): 5
Enter x and y coordinates:
... (остальной вывод)

Ключевые моменты расчета коэффициента корреляции Пирсона:

  1. Мы вычисляем необходимые суммы: x, y, xy, x², y²
  2. Применяем формулу коэффициента корреляции Пирсона
  3. Используем sqrt() из math.h для вычислений
  4. Возвращаем коэффициент корреляции в диапазоне от -1 до 1

Вывод коэффициента корреляции

На этом заключительном шаге мы улучшим нашу программу, чтобы обеспечить всестороннее толкование коэффициента корреляции Пирсона и создать более удобный для пользователя вывод.

Откройте предыдущий файл:

cd ~/project
nano correlation_input.c

Обновите код следующим реализацией:

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

double calculatePearsonCorrelation(double x[], double y[], int n) {
    double sum_x = 0, sum_y = 0, sum_xy = 0;
    double sum_x_squared = 0, sum_y_squared = 0;

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

    double numerator = n * sum_xy - sum_x * sum_y;
    double denominator = sqrt((n * sum_x_squared - sum_x * sum_x) *
                               (n * sum_y_squared - sum_y * sum_y));

    return numerator / denominator;
}

void interpretCorrelation(double correlation) {
    printf("\nИнтерпретация коэффициента корреляции:\n");
    printf("Значение корреляции: %.4f\n", correlation);

    if (correlation > 0.8) {
        printf("Сильная положительная корреляция\n");
    } else if (correlation > 0.5) {
        printf("Умеренная положительная корреляция\n");
    } else if (correlation > 0.3) {
        printf("Слабая положительная корреляция\n");
    } else if (correlation > -0.3) {
        printf("Отсутствие линейной корреляции\n");
    } else if (correlation > -0.5) {
        printf("Слабая отрицательная корреляция\n");
    } else if (correlation > -0.8) {
        printf("Умеренная отрицательная корреляция\n");
    } else {
        printf("Сильная отрицательная корреляция\n");
    }
}

int main() {
    double x[MAX_POINTS], y[MAX_POINTS];
    int n, i;

    printf("Калькулятор коэффициента корреляции Пирсона\n");
    printf("----------------------------------------\n");
    printf("Введите количество точек данных (макс. %d): ", MAX_POINTS);
    scanf("%d", &n);

    printf("Введите координаты x и y:\n");
    for (i = 0; i < n; i++) {
        printf("Точка %d (x y): ", i + 1);
        scanf("%lf %lf", &x[i], &y[i]);
    }

    double correlation = calculatePearsonCorrelation(x, y, n);

    printf("\nВведенные точки данных:\n");
    for (i = 0; i < n; i++) {
        printf("Точка %d: (%.2f, %.2f)\n", i + 1, x[i], y[i]);
    }

    interpretCorrelation(correlation);

    return 0;
}

Компилируем программу:

gcc -o correlation_calculator correlation_input.c -lm

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

./correlation_calculator

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

... (остальной вывод)

Основные улучшения:

  1. Добавлена функция interpretCorrelation()
  2. Предоставлено подробное объяснение силы корреляции
  3. Корреляция классифицируется по различным уровням
  4. Улучшен пользовательский интерфейс с заголовком и понятным выводом.

Резюме

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

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