我正在尝试计算一组值的累积分布函数。
我使用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.1 0.1 ...
为什么第一个位置有0?它不应该以0.05开始吗?
谢谢。
答案 0 :(得分:0)
GSL将sum指定为大小为n + 1的数组,其中n是bin的数量。但是,计算pdf只需要n个条目。这种额外的一个元素分配是因为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;
}
}