繁体   English   中英

随机温度的标准偏差

[英]Standard deviation of random temperatures

我正在尝试根据包含50,000+个温度的文本文件计算x随机温度的标准偏差。

我有一个数组,其中包含应该加载到的每个索引的样本大小。 例如,将8个随机温度归入索引0,将16个随机温度归入索引1,依此类推。

我已经成功计算出样本均值,但是在方差/标准差方面却遇到了麻烦。

private static void calcEstimates() {
    double 
        sum,
        mean,
        sampleSize = 0,
        mnSum = 0,
        mnSqrSum = 0;

    double [] means = new double[numTemps]; 

    for ( i = 0; i < sampleSizes.length; i++) {
        sum = 0;
        sampleSize = sampleSizes[i];
        for (j = 0; j < sampleSize; j++)
            sum += allTemps[rng.nextInt(numTemps)];

        mean = sum / sampleSize;
        mnSum += sum * sum;
        mnSqrSum = (sampleSizes[i] * mnSum - sum * sum) / (sampleSizes[i]*(sampleSizes[i]-1));

        sampleMeans[i]  = sum/sampleSize;;
        sampleStdDevs[i] = Math.sqrt(mnSqrSum);
    }
} 

输出:

在此处输入图片说明

每个样本大小的样本标准偏差应约为20。

(算术)平均值的定义(请参见例如https://en.wikipedia.org/wiki/Mean )为:

以及标准差 (请参见例如https://en.wikipedia.org/wiki/Standard_deviation ):

在下面的代码中,第一步中计算出平均值,第二步中计算出标准差:

private static void calcEstimates() {
    int sampleSize;
    double sum;
    double mean;
    double sumSqrDev;
    double stdDev;

    System.out.println("size   mean      stdDev");
    System.out.println("------------------------");
    for (int i = 0; i < sampleSizes.length; i++) {

        sum = 0;
        sampleSize = sampleSizes[i];

        // 1. Step: Calculation of the mean
        double[] temps = new double[sampleSize]; // N
        for (int j = 0; j < sampleSize; j++) {
            temps[j] = allTemps[rng.nextInt(numTemps)];
            sum += temps[j];
        }

        mean = sum / sampleSize;

        // 2. Step: Calculation of the standard deviation
        sumSqrDev = 0;
        for (int j = 0; j < sampleSize; j++) {
            sumSqrDev += Math.pow((temps[j] - mean), 2);
        }

        stdDev = Math.sqrt(sumSqrDev / (sampleSize - 1));

        System.out.printf("%5d  %.4f  %.4f\n", sampleSize, mean, stdDev);
    }
}

在下面的示例中,温度均匀分布,其值在a = 450b = 550

private static int[] sampleSizes = new int[] {8,16,32,64,128,140,160,200,240,280,320,360,400,20000};
private static Random rng = new Random();
private static int numTemps = 20000;
private static double[] allTemps = new double[numTemps]; 
private static double meanTemperature = 500;
private static double deviation = 100;

private static void initTemperatures() {        
    for (int i = 0; i < numTemps; i++) {
        allTemps[i] = meanTemperature + deviation * (rng.nextDouble() - 0.5);
    }
}

public static void main(String[] args) {
    initTemperatures();
    calcEstimates();
}

因此, 理论平均值为

并且理论标准偏差为

(见https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)https://stats.stackexchange.com/questions/35123/whats-the-difference-between-variance-and-standard-deviation )在与代码结果良好的一致性:

size   mean      stdDev
------------------------
    8  504.8617  32.1182
   16  503.5508  31.2777
   32  503.1226  28.3134
   64  504.2420  28.2647
  128  499.5431  27.3515
  140  504.0203  26.6482
  160  501.0673  28.7222
  200  498.4244  28.5140
  240  500.7214  28.6428
  280  497.3849  28.3684
  320  499.5752  28.8653
  360  500.6975  29.1524
  400  500.5515  29.9879
20000  499.7810  28.9035

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM