Как рассчитать дисперсию с помощью C ++? - PullRequest
1 голос
/ 01 августа 2020

Это то, что у меня есть. Я не могу получить правильную дисперсию.

variance += ((numbers[i] - (double)mean) * (numbers[i] - (double)mean));
variance /= (double)size;
cout << "The variance is: " << variance << endl;

Ответы [ 2 ]

5 голосов
/ 01 августа 2020

В вашем коде есть несколько проблем, каждая из которых способствует неправильной дисперсии.

  1. Вы вычисляете дисперсию в l oop, обновляя среднее значение каждые итерация (прежде чем у вас будет правильное среднее значение). Хотя это приведет к сохранению правильного среднего значения в переменной mean в конце l oop, дисперсия будет вычислена с неправильным средним значением во всех, кроме последней итерации. Вам нужно среднее значение всех чисел перед тем, как вы начнете вычитать его из массива для вычисления дисперсии. Решением будет еще один l oop для вычисления дисперсии после исходного l oop, в этот момент у вас уже есть правильное среднее значение.

  2. Индексы массива начинаются с 0, но вы начинаете с 1, что означает, что первое число в вашем массиве всегда будет 0, и вы вычисляете среднее значение и дисперсию 9 чисел вместо 10, но делите их на 10.

  3. Среднее является целым числом, но предназначено для хранения числа с плавающей запятой (или числа двойной точности). Кроме того, total / size будет округляться в меньшую сторону, поскольку оба они являются целыми числами, поэтому вы должны преобразовать одно из них в двойное.

2 голосов
/ 01 августа 2020

Поместите

    variance += ((numbers[i] - (double)mean) * (numbers[i] - (double)mean));

вне первого для l oop в другое для l oop. И код будет таким:

#include <iostream>
using namespace std;

int main()
{
 int arraySize = 10;
 int numbers[10];
 int input, total = 0, size = 0, mean = 0;
 double variance = 0;
 for (int i = 1; i < arraySize; i++) {
    cout << "Enter number " << i << " (-1 to end): ";
    cin >> input;
    if (input == -1) {
        break;
    }
    else {
        numbers[i] = input;
    }
    total += numbers[i];
    size++;
    
    mean = total / size;
    
       
}
for(int i=1; i<=size;i++)
variance += ((numbers[i] - (double)mean) * (numbers[i] - (double)mean));

variance /= (double)size;
cout << "The mean is: " << mean << endl;
cout << "The variance is: " << variance << endl;
}

При вычислении дисперсии вам нужно среднее значение всех чисел в массиве, а не среднее значение после каждого ввода.

...