Ошибка в алгоритме нахождения коэффициента корреляции Пирсона

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2023

Написал следующий код на c++ для нахождения коэффициента корреляции между двумя численными векторами с любым типом чисел. В результате выполнения для идентичных последовательностей получаю 1. Для теста, приведенного в коде получил значение, превышающее 1, хотя коэф. должен находиться в диапазоне от -1 до 1.

#include <iostream>
#include <vector>
#include <cmath>
#include <exception>

using namespace std;

template<typename num>
float corrcoef(vector<num> arr1, vector<num> arr2)
{
    if (arr1.size() != arr2.size()) {
        throw invalid_argument("Vectors must have simular length");
    }
    int size = arr1.size();
    int sum1 = 0, sum2 = 0, sum12 = 0;
    int pow2sum1 = 0, pow2sum2 = 0;

    for (int i = 0; i < size; i++) {
        sum1 += arr1[i]; sum2 += arr2[i];
        sum12 += arr1[i] * arr2[i];
        pow2sum1 += pow(arr1[i], 2);
        pow2sum2 += pow(arr2[i], 2);
    }

    return (size * sum12 - sum1 * sum2) / sqrt((size * pow2sum1 - pow(sum1, 2)) * (size * pow2sum2 - pow(sum2, 2)));
}

int main()
{
    vector<float> a = { 0.5, 1, 1.5 };
    vector<float> b = { 1, 3, 5 };
    cout << corrcoef(a, b);
}

В чем моя ошибка?

Ответы

▲ 3Принят

Ваша ошибка в использовании типа int там, где нужен тип с плавающей точкой.

double sum1 = 0, sum2 = 0, sum12 = 0;
double pow2sum1 = 0, pow2sum2 = 0;