Стандартное отклонение случайных температур - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь вычислить стандартное отклонение для x количества случайных температур на основе текстового файла, содержащего 50 000+ температур.

У меня есть массив, содержащий размеры выборки для каждого индекса, в который я должен загрузить,Например, 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);
    }
} 

Выходные данные:

enter image description here

Размер образца должен составлять около ~ 20 для каждого размера образца.

1 Ответ

0 голосов
/ 23 февраля 2019

Определение среднего значения (арифметического) (см., Например, 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 = 450 до b = 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...