У меня есть задание в моем классе программирования C, чтобы написать программу для получения коэффициента корреляции 2 наборов действительных чисел. Мне дали уравнения, и они ссылались на Википедию, поэтому я дважды проверил уравнения там. Вот ссылка на уравнение, которое кажется довольно стандартным из моих исследований:
Я написал программу, но когда я запускал ее, я получал числа больше 1 для моих результатов, что, как я знал, было неверным. Я просмотрел свой код несколько раз, но не смог найти ничего неуместного, поэтому я попытался разделить на n в конце вместо n-1, это дало мне значения с ожидаемым диапазоном от -1 до 1, поэтому я протестировал это зависит от значений данных, которые я нашел в Интернете, а также от калькулятора коэффициента корреляции (http://easycalculation.com/statistics/correlation.php), и теперь я получаю правильные результаты для всех чисел, которые я ввел. Я не могу понять, почему это так, поэтому подумал, что я мог бы получить небольшую помощь с этим здесь. Вот мой код для программы: если есть что-то еще, что выделяет меня, я бы хотел услышать несколько советов, но в основном я пытаюсь понять, почему я получаю правильные результаты с тем, что появляется быть неправильным уравнением.
Затем он прочитает значения для обоих массивов (x и y), а затем вычислит
коэффициент корреляции между двумя наборами чисел.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
int n; /* value to determine array length */
/* declare variables to hold results for each equation for x and y
initialize all to zero to prepare for summation */
float r = 0.0, xbar = 0.0, ybar = 0.0, sx = 0.0, sy = 0.0;
/*get number n input from user */
printf("Please enter a number n: ");
scanf("%d", &n);
if( n < 1) {
printf("n must be a positive number.\nPlease enter a new value: ");
scanf("%d", &n);
if( n < 1) {
printf("Invalid input, exiting...\n");
return 0;
}
}
/*initialize arrays x and y with length of n */
float x[n], y[n];
/*use for loop to read in values of x*/
int i;
for(i = 0; i < n; ++i) {
printf("Please enter a number for x: ");
scanf("%f", &x[i]);
}
/*use for loop to read in values of y*/
for(i = 0; i < n; ++i) {
printf("Please enter a number for y: ");
scanf("%f", &y[i]);
}
/*compute xbar */
for(i = 0; i < n; ++i) {
xbar += x[i];
}
xbar /= n;
/*compute ybar*/
for(i = 0; i < n; ++i) {
ybar += y[i];
}
ybar /= n;
/* compute standard deviation of x*/
for(i = 0; i < n; ++i) {
sx += (x[i] - xbar) * (x[i] - xbar);
}
sx = sqrt((sx / n));
/* compute standard deviation of y */
for(i = 0; i < n; ++i) {
sy += (y[i] - ybar) * (y[i] - ybar);
}
sy = sqrt((sy / n));
/*compute r, the correlation coefficient between the two arrays */
for( i = 0; i < n; ++i ) {
r += (((x[i] - xbar)/sx) * ((y[i] - ybar)/sy));
}
r /= (n); /* originally divided by n-1, but gave incorrect results
dividing by n instead produces the desired output */
/* print results */
printf("The correlation coefficient of the entered lists is: %6.4f\n", r);
return 0;
}
(похоже, что мое форматирование кода не работает, очень сожалею об этом. Пробовал использовать теги и кнопку, но не могу понять. Похоже, что я получил его несколько лучше, чем раньше.)