【问题标题】:How would I calculate the standard deviation from a file of floating point numbers?如何计算浮点数文件的标准偏差?
【发布时间】:2017-12-07 05:43:19
【问题描述】:

我正在尝试编写一个 Java 程序来在读取一个充满浮点数的文本文件后计算最大值、最小值、平均值和标准偏差。如您所见,我计算了最大值、最小值、平均值,但对于标准偏差,我感到很困惑。有什么想法我应该如何实现吗?

另外,我对编程还很陌生,如果结构不正确,非常抱歉。

这是我的代码:

/*
 * Create a Java program to read a file of floating point numbers and compute
 * the following statistics from the data file:
 * 
 * 1. Maximum
 * 2. Minimum
 * 3. Arithmetic Average (Mean)
 * 4. Standard Deviation
 * 
 * Do not assume anything about the large numbers in the file. They could be
 * positive or negative, and their magnitude could be extremely large or
 * extremely small.
 */

import java.io.*;
import java.util.Scanner;

public class DataFile {

public static void main(String[] args) {
    // declare variables
    double number, maximum, minimum, sum, mean, standardDeviation;
    int count;

    Scanner file = null;

/* -------------------------------------------------------------------------- */
    try {
        file = new Scanner(new File("RawData.txt"));
    }

    catch(FileNotFoundException e) {
        System.out.print("Error; The program was terminated!");
        System.exit(1);
    }

/* -------------------------------------------------------------------------- */
    // initialize variables
    maximum = file.nextDouble();
    minimum = maximum;
    sum = 0;
    count = 1;

    while(file.hasNextDouble()) {
        number = file.nextDouble();

        if(number > maximum)
            maximum = number;

        else if(number < minimum)
            minimum = number;

        sum += number;
        count += 1;

    } // end while loop

    file.close();

/* -------------------------------------------------------------------------- */
    // mean calculation
    mean = sum / count;

    // standard deviation calculation
    // .....

    // display statistics
    System.out.println("Maximum ------------> " + maximum                   );
    System.out.println("Minimum ------------> " + minimum                   );
    System.out.println("Sum ----------------> " + sum                       );
    System.out.println("Count --------------> " + count                     );
    System.out.println("Mean ---------------> " + mean                      );

} // end method main

} // end class DataFile

【问题讨论】:

  • 你知道计算是什么吗?还是您只是在问如何编码?
  • 对不起。我想知道如何编码。我有 sigma 表示法的公式,这让它有点难。
  • 也计算均方,然后使用所谓的标准差计算公式。

标签: java file text-files standard-deviation


【解决方案1】:

正如 Przemysław MoskalI 所建议的那样,我相信这就是您所追求的!列表在 Java 中非常有用。这很快就完成了,所以请确保您对最终的计算感到满意!快乐编程!

已编辑 - 多亏了 Bathsheba 的建议,使用了计算公式,它允许您根本不使用列表(这样更节省内存)。

请参阅此网站以轻松了解计算: https://www.mathsisfun.com/data/standard-deviation-formulas.html

// initialize variables
maximum = file.nextDouble();
minimum = maximum;
sum = 0;
count = 1;
double computationalSum = 0;
double squareSum = 0;

while(file.hasNextDouble()) {
    number = file.nextDouble();

    squareSum += Math.pow(number, 2);
    computationalSum += number;

    if(number > maximum)
        maximum = number;

    else if(number < minimum)
        minimum = number;

    sum += number;
    count += 1;

} // end while loop

file.close();

/* ------------------------------------------------------------------------*/ 
// mean calculation
mean = sum / count;
double stdDevSum = 0;
double stdDevMean = 0;
double stdDev = 0;

double sumOfSquares = squareSum - ((Math.pow(computationalSum, 2)/(count-1)));
double sSquared = sumOfSquares/(count-1);
double otherStdDev = Math.sqrt(sSquared);

// display statistics
System.out.println("Maximum ------------> " + maximum                   );
System.out.println("Minimum ------------> " + minimum                   );
System.out.println("Sum ----------------> " + sum                       );
System.out.println("Count --------------> " + count                     );
System.out.println("Mean ---------------> " + mean                      );
System.out.println("StdDev -------------> " + otherStdDev);

} // end method main

【讨论】:

  • 进一步澄清?
  • 谷歌“标准差的计算公式”。如果您使用它,将投票赞成。
【解决方案2】:

在 while 循环中,您可以将每个 number 放入在此循环之前初始化的 ArrayList。当您到达文件的末尾时,您可以更改 ArrayList 中的值 - 您需要提供一个循环来将列表中已有的值与平均值之间的差异存储在列表中,然后将该差异平方。循环整个ArrayList 后,将ArrayList 中的值相加,除以count,然后只需要该结果的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多