标准差计算未返回预期值

时间:2013-07-29 02:01:45

标签: java

我以为我有这个数字,我非常有信心它会起作用。不幸的是,它没有。

下面的代码应该返回平均值,输入的值的数量,然后计算std Var。我得到它返回平均值和计数,但std var结果是关闭的。使用值5,6,8和9我应该得到std var 1.83的结果,我得到的东西离7.17。

我知道我的错误是我计算std Dev的方式,但我很确定我做得对。

这是我的代码:

/**
This class is used to calculate the average and standard deviation
of a data set.
*/

public class DataSet{

    private double sum;
    private double sumSquare;
    private int counter;

    /**Constructs a DataSet object to hold the
     * total number of inputs, sum and square
     */

    public DataSet(){

        sum = 0;
        sumSquare = 0;
        counter = 0;
    }

    /**Adds a value to this data set
     * @param x the input value
     */

    public void add(double x){

        sum = sum + x;
        sumSquare = sumSquare + x * x;
        counter++;

    }

    /**Calculate average of dataset
     * @return average, the average of the set
     */

    public double getAverage(){

        double avg = sum / counter;

        return avg;

    }

    /**Get the total inputs values
     * @return n, the total number of inputs
     */

    public int getCount(){

        return counter;

    }


    public double getStandardDeviation(){

        double sqr = sumSquare / counter;
        double stdDev = Math.sqrt(sqr);


        return stdDev;


    }
}

这是我的跑步者计划:

import java.util.Scanner;

class DataSetRunner 

{

    public static void main(String[] args)

    {

        Scanner input = new Scanner(System.in);
        DataSet data = new DataSet();

        boolean done = false;
        while (!done)

        {

            System.out.println("Enter value, Q to quit: ");
            String userInput = input.next();
            if (userInput.equalsIgnoreCase("Q"))
             done = true;

             else

             {

                 double x = Double.parseDouble(userInput);
                 data.add(x);

             }

        }

        System.out.println("Average = " + data.getAverage());
        System.out.println("Count = " + data.getCount());
        System.out.println("The Standard Deviation is = " + data.getStandardDeviation());



    }

1 个答案:

答案 0 :(得分:4)

您的计算不正确。

Standard deviation基于差异与平均值的平方和。

您只是对数据值的方块进行求和。

一旦您知道可以使用此值计算标准偏差,您必须首先计算平均值(即平均值),然后

正确的程序是(引自wikipedia):

  

要计算总体标准偏差,首先计算每个数据点与均值的差值,然后将每个数据点的结果平方:

     

接下来,计算这些值的平均值,并取平方根:

基本上,你无法“随时”计算标准偏差。