2013-02-12 3 views
4

Эй, ребята, мне трудно понять, как рассчитать стандартное предсказание массива в Java. Как вы видите, я уже вычислил среднее значение, и я знаю, что в конце мне придется разделить на размер выборки минус 1 (n-1) и набрать это число. Проблема, с которой я сталкиваюсь, заключается в том, как принимать каждое число и рассчитать, насколько далеко он находится от среднего, а затем квадрат этого числа. Я знаю, что я мог бы делать каждый номер из набора данных отдельно, но должен быть более простой способ. Любая помощь будет оценена, вот мой код.стандартное отклонение любого размера массива java

public class CalculateArray 
{ 

    public static void main(String[] args) 
    { 
     int [] numbers = new int[]{1,2,3,4,5,6,7,8,9}; 

     int sum = 0; 
     int max = 0; 
     int min = numbers[0]; 
     double sd = 0; 

     for(int i=0; i<numbers.length; i++) 
     { 
      sum = sum + numbers[i]; 
     } 

     double average = sum/numbers.length; 

     System.out.println("Average value is : " + average); 

     for(int i=0; i<numbers.length; i++) 
     { 
      if(numbers[i] > max) 
      { 
       max = numbers[i]; 
      } 
     } 

     System.out.println("max number is : " + max); 

     for(int i=0; i<numbers.length; i++) 
     { 
      if(numbers[i] < min) 
      { 
       min = numbers[i]; 
      } 
     } 

     System.out.println("min number is : " + min); 

     for (int i=0; i<numbers.length;i++) 
     { 
      //this is where im having problems 
      sd = ??? 
     } 

     double standardDeviation = math.sqrt(sd/(numbers.length-1)); 

     System.out.println("The standard deviation is : " + standardDeviation); 
    } 
} 
+0

Как насчет 'std + = pow (средний - числа [i], 2);'? – imreal

ответ

7

Чтобы вычислить, как далеко число от среднего вы используете оператор -. Для расчета площади вы можете использовать Math.pow. Таким образом, учитывая, что вы уже вычислили average ранее в программе:

for (int i=0; i<numbers.length;i++) 
{ 
    sd = sd + Math.pow(numbers[i] - average, 2); 
} 

Кстати, как вы вычислить среднее в настоящее время не работает. Вы должны определить sum как двойной, а не как int.

+0

Вы должны использовать 'Math.abs (числа [i] - average)', в противном случае он генерирует незаживающее число, когда 'number [i]

+0

@Quoi, вам не нужно вычислять абсолютное значение. a² = | a | ². – Joni

+0

И в конце вы захотите разделить сумму квадратов отклонений на число точек данных. Я думаю, что это средний квадрат корня; в терминах выше, rms = sd/numbers.length – criticalfix

1

В дополнение к алгоритму с двумя проходами, описанному другими (вычисление среднего значения в первом проходе и в std dev в следующем), см. this link для примера того, как это можно сделать за один проход. Алгоритм выглядит следующим образом:

double std_dev2(double a[], int n) { 
    if(n == 0) 
     return 0.0; 
    double sum = 0; 
    double sq_sum = 0; 
    for(int i = 0; i < n; ++i) { 
     sum += a[i]; 
     sq_sum += a[i] * a[i]; 
    } 
    double mean = sum/n; 
    double variance = sq_sum/n - mean * mean; 
    return sqrt(variance); 
} 

UPDATE
Не делайте этого. Как объясняет Джони в своем comment ниже, существует высокая вероятность ошибки при реализации этой программы. Для стабильного онлайн-алгоритма Джони направляет нам статью this Wikipedia, которая, как уже упоминалось, была тщательно проанализирована.

+2

Ужасный алгоритм никогда не должен использоваться. Почему это плохо и какие альтернативы существуют, см. Http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ – Joni

+0

@Joni благодарит за ввод. Это в основном ошибка переполнения? –

+0

Проблема в основном связана с 'sq_sum/n - mean * mean': она вычисляет разницу двух больших почти равных чисел.Отмена цифр означает, что относительная ошибка поднимается на крышу - вы можете даже отрицательно отклоняться. Википедия имеет довольно приличную страницу об этом типе числовой проблемы: http://en.wikipedia.org/wiki/Loss_of_significance – Joni

0
k + k = 2k 

Чтобы получить среднее значение, разделите 2k на количество терминов, которые у вас есть. Таким образом, среднее значение термина равно k. : D

Смежные вопросы