You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算数组每列Standard Deviation时结果远大于样本的问题求助

二维数组列标准差计算问题解决

问题描述

需要计算二维数组每一列的标准差,但计算结果远大于给定的样本输出,求正确的计算方法。

给定数组

100.00     90.00    100.00     80.00     70.00
 50.00     60.00     70.00     80.00    100.00
 60.00     70.00    100.00     80.00     90.00
 69.50     70.50     80.50     30.50      0.00
 78.30     69.50     48.00     90.00    100.00
 88.50     95.00    100.00     99.00      0.00

期望输出

Test#0 Average: 74.38 with Std Deviation: 16.81
Test#1 Average: 75.83 with Std Deviation: 12.39
Test#2 Average: 83.08 with Std Deviation: 19.44
Test#3 Average: 76.58 with Std Deviation: 21.76
Test#4 Average: 60.00 with Std Deviation: 43.59

错误代码示例

参考代码(仅计算平均值)

double[] average = new double[arrScores.length];
for (int i = 0; i < arrScores[i].length; i++) {
    double sum = 0;
    for (int j = 0; j < arrScores.length; j++) {
        sum = sum + arrScores[j][i];
    }
    average[i] = sum / arrScores.length;
    System.out.printf("Test#%d: %.2f with Std Deviation: ", i, average[i]);
    average[i]=0;
}

之前尝试的代码(标准差计算逻辑错误)

double Stats = 0;
double Class = 0;
double average = 0;
double[] arr=new double[arrScores.length];
for(int i = 0; i < arrScores[i].length; i++){
    for(int j = 0; j < 6; j++){
        average = average +array[j][i];
        arr[j]=array[j][i];
    }
    average =average / arrScores[i].length;
    for(double num; num < arrScores.length; num++){
        Stats = Stats+ Math.pow(num-average,2);
    }
    Class=Math.sqrt(Stats / arrScores[i].length);
}

错误分析

  1. 第一段代码仅完成了每列平均值的计算,完全缺失标准差的计算逻辑。
  2. 第二段代码存在多处错误:
    • 循环变量num未初始化,且用num代替数组元素进行计算,逻辑完全错误。
    • Stats变量未在每列计算前重置,导致多列的平方差累加在一起,结果偏大。
    • 硬编码循环次数6,应该用数组的行数arrScores.length代替,增强代码通用性。
    • 变量名混乱,比如array和arrScores未对应,容易引发错误。
    • 未明确区分总体标准差和样本标准差:期望输出使用的是总体标准差(除以数据总数n),若误用样本标准差(除以n-1)会导致结果偏差。

正确实现代码

以下是符合期望输出的Java代码,步骤为:计算每列平均值 → 计算每列每个元素与平均值的平方差之和 → 求平方差平均值的平方根(总体标准差):

public class StdDevCalculator {
    public static void main(String[] args) {
        double[][] arrScores = {
            {100.00, 90.00, 100.00, 80.00, 70.00},
            {50.00, 60.00, 70.00, 80.00, 100.00},
            {60.00, 70.00, 100.00, 80.00, 90.00},
            {69.50, 70.50, 80.50, 30.50, 0.00},
            {78.30, 69.50, 48.00, 90.00, 100.00},
            {88.50, 95.00, 100.00, 99.00, 0.00}
        };

        // 列数
        int columns = arrScores[0].length;
        // 行数
        int rows = arrScores.length;

        for (int col = 0; col < columns; col++) {
            // 计算当前列的平均值
            double sum = 0.0;
            for (int row = 0; row < rows; row++) {
                sum += arrScores[row][col];
            }
            double average = sum / rows;

            // 计算当前列的平方差之和
            double squaredDiffSum = 0.0;
            for (int row = 0; row < rows; row++) {
                double diff = arrScores[row][col] - average;
                squaredDiffSum += Math.pow(diff, 2);
            }

            // 计算总体标准差
            double stdDev = Math.sqrt(squaredDiffSum / rows);

            // 按格式输出
            System.out.printf("Test#%d Average: %.2f with Std Deviation: %.2f%n", col, average, stdDev);
        }
    }
}

代码说明

  • 明确区分行数和列数,避免数组索引错误。
  • 每列计算前重置sum和squaredDiffSum,确保每列的计算独立。
  • 使用总体标准差(除以行数rows),与期望输出的计算逻辑一致。
  • 输出格式严格匹配给定的期望结果。

内容的提问来源于stack exchange,提问作者user19598384

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:57:21