Вопрос гистограммы GSL

Я пытаюсь вычислить накопительную функцию распределения для набора значений.

Я вычислил гистограмму, используя gsl, и попытался вычислить CDF отсюда, но кажется, что значения смещены на одну позицию.

Это код, который я использую:

gHist =  gsl_histogram_alloc((maxRange - minRange) / 5);
gsl_histogram_set_ranges_uniform(gHist, minRange, maxRange);

for (int j = 0; j < ValidDataCount; j++)
gsl_histogram_increment (gHist, ValAdd[j]);

gsl_histogram_pdf * p = gsl_histogram_pdf_alloc(gsl_histogram_bins(gHist));
gsl_histogram_pdf_init (p,  gHist);

for (int j = 0; j < gsl_histogram_bins(gHist) + 1 ; j++)
printf ("%f ", p->sum[j]);

Гистограмма выглядит так:
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 …. продолжается следующим образом. всего 20 значений

И в формате cdf:
0,00 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,1 0,1 0,1 …

Почему 0 на первой позиции? Разве это не должно начинаться с 0,05?

Спасибо.

0

Решение

GSL выделяет сумму, чтобы быть массивом размера n + 1, где n — количество бинов. Тем не менее, только n записей необходимы для расчета PDF. Это дополнительное выделение одного элемента происходит потому, что gsl определяет sum [0] = 0.

в исходном коде GSL «pdf.c» вы можете увидеть, что

 gsl_histogram_pdf *gsl_histogram_pdf_alloc (const size_t n)
{
(...)
p->sum = (double *) malloc ((n + 1) * sizeof (double));
}int  gsl_histogram_pdf_init (gsl_histogram_pdf * p, const gsl_histogram * h)
{
(...)
p->sum[0] = 0;
for (i = 0; i < n; i++)
{
sum += (h->bin[i] / mean) / n;
p->sum[i + 1] = sum;
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]