【问题标题】:How can I get standard deviation without using arrays in Java?如何在不使用 Java 数组的情况下获得标准偏差?
【发布时间】:2019-11-27 18:37:14
【问题描述】:

使用双浮点数据计算任何给定输入的计数、平均值和标准差。

每次我运行程序时,它都会给出我的计数和平均值,但是我的标准偏差显示为 NaN。

import java.util.Scanner;

public class Final 
{
    public static void main (String[]args)
    {
        Scanner in = new Scanner(System.in);

        System.out.print("Enter a range of digits to recieive 1. Count , 2. Average , 3. StdDvn");

        double input = in.nextDouble();

        double count = 1;
        double sum = 0;
        double sumsquared = sum * sum;
        double std = 0;

        while (in.hasNextDouble())
        { double value = in.nextDouble();

            sum = input += value;
            count++;
        }

        double average = sum / count;
        std = Math.sqrt((sumsquared-(sum/count)) / (count - 1));

        System.out.println("Your count of numbers is : " + count);
        System.out.println("Your average of numbers is : " + average);
        System.out.println("Your standard deviation of numbers is : " + std);
    }
}

【问题讨论】:

  • 每次我运行程序时,它都会给我计数和平均值,但是我的标准偏差显示为 NaN :/
  • 使用edit按钮添加更多信息,不要使用cmets。
  • sumsquared = sum * sum; 移到 while 循环下方。
  • 谢谢。我输入 1,2,3,4,5,6 并且我得到 9.4 的标准偏差输出。我想应该是1.8。伙计们,我在哪里出错了stndrd偏差公式??
  • s.d.的常用计算方法。涉及首先找到平均值,然后计算每个项目与平均值的差异的平方和,这需要第二次迭代项目。在不重新访问每个输入的情况下计算标准偏差是困难的,但并非不可能。这样一个"online algorithm" exists to have only one pass,但对于普通程序员来说,实现它可能有点矫枉过正。你能用List吗?

标签: java standard-deviation


【解决方案1】:

您的sumsquaredvariable 始终为0,因为您在初始化double sum=0; 之后立即从0*0 计算它。

这部分应该移到总和之下。

同样要使用循环计算不使用数组的标准差,您需要知道以下 3 个值:

  • 输入了多少个数字。
  • 所有数字的总和。
  • 数字的平方和。

公式E[X^2]-(E[X])^2wikipedia^2 当然是squared

public static void main (String[]args)
{
    Scanner in = new Scanner(System.in);

    double count = 10.0;   // how many numbers are entered, e.g.: 10
    double sum1 = 0.0;    // sum of the numbers
    double sum2 = 0.0;    // sum of the squares
    System.out.println("Enter 10 numbers: ");
    for (int i=0; i < 10; i++) {
      double n = in.nextDouble();
      sum1 += n;
      sum2 += n * n;
    }
    double average = sum1 / count;
    double variance = (count * sum2 - sum1 * sum1) / (count * count);
    double stddev = Math.sqrt(variance);

    System.out.println("Your count of numbers is : " + count);
    System.out.println("Your average of numbers is : " + average);
    System.out.println("Your standard deviation of numbers is : " + stddev);
}

【讨论】:

    【解决方案2】:

    您的sumsquared 为零。因此,您在标准差中使用了 0 的值。这是重新定位您的 sumsquared 的修复程序。

    编辑:我认为您的 std 不正确。你必须先找到平均值。在平方根内,找到 ( x - mean) 的总和,其中 x 是您的数据,然后将该结果除以 count - 1

    public static void main (String[]args)
    {
    
    
        Scanner in = new Scanner(System.in);
    
        System.out.print("Enter a range of digits to recieive 1. Count , 2. Average , 3. StdDvn");
    
        double input = in.nextDouble();
    
        double count = 1;
        double sum = 0;
        double std = 0;
    
        while (in.hasNextDouble())
        { double value = in.nextDouble();
    
            sum = input += value;
            count++;
    
        }
    
        double sumsquared = sum * sum;
        double average = sum / count;
        std = Math.sqrt((sumsquared-(sum/count)) / (count - 1)); /* fix this formula */
    
        System.out.println("Your count of numbers is : " + count);
        System.out.println("Your average of numbers is : " + average);
        System.out.println("Your standard deviation of numbers is : " + std);
        }
    }
    

    【讨论】:

    • 我试过了,但标准差仍然是 9.4 错误的数字
    • 我更新了我的答案。您的标准公式不正确。
    • 可能会另辟蹊径,试试for语句
    • 您需要从扫描仪input 中删除第一次读取。你不需要在程序的那个时候阅读。将 while 循环内的求和公式更改为 sum += value。修正标准差公式,我想你会搞定的。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2019-08-16
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多