任意概率分布函数的累积分布函数

0 投票
1 回答
2100 浏览
提问于 2025-04-18 14:34

我正在尝试为从csv文件中获取的一组数据绘制概率分布函数。

import numpy as np
import math
import matplotlib.pyplot as plt

data=np.loadtxt('data.csv',delimiter=',',skiprows=1)
x_value1= data[:,1]
x_value2= data[:,2]
weight1= data[:,3]
weight2= data[:,4]

这里的weight1是一个数据数组,表示x_value1的权重,而weight2则表示x_value2的权重。我生成了一个直方图,把权重放在参数里。

plt.hist(x_value1,bins=40,color='r', normed=True, weights=weight1, alpha=0.8,    label='x_value1')
plt.hist(x_value2, bins=40,color='b', normed=True, weights=weight2,  alpha=0.6,  label='x_value2')

这里插入图片描述

我现在的问题是如何把这个概率分布函数(PDF)转换成累积分布函数(CDF)。我在这里的某个帖子上看到,可以使用numpy.cumsum()来把一组数据转换为CDF,所以我尝试把它和np.histogram()一起使用。

values1,base1= np.histogram(x_value1, bins=40)
values2,base2= np.histogram(x_value2, bins=40)

cumulative1=np.cumsum(values1)
cumulative2=np.cumsum(values2)

plt.plot(base1[:-1],cumulative1,c='red',label='x_value1')
plt.plot(base2[:-1],cumulative2,c='blue',label='x_value2')

plt.title("CDF for x_value1 and x_value2")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

这里插入图片描述

我不知道这个图是否正确,因为在做CDF的时候没有考虑权重(weight1和weight2)。我该如何在绘制CDF时包含这些权重呢?

1 个回答

2

如果我理解你的数据没错,你有一些样本,每个样本都有一个对应的权重。也许你想要的是这些样本的实验性累积分布函数(CDF)。

样本存放在向量 x 中,权重则在向量 w 中。首先,我们来构建一个 Nx2 的数组,把它们放在一起:

arr = np.column_stack((x,w))

接下来,我们会根据样本对这个数组进行排序:

arr = arr[arr[:,0].argsort()]

这个排序可能看起来有点奇怪,但 argsort 会给出排序后的顺序(0 表示最小的,1 表示第二小的,以此类推)。当我们用这个结果来索引这个两列的数组时,行会被排列成第一列是升序的。(如果只用 sort 并设置 axis=0 是不行的,因为那样会独立排序两列。)

现在我们可以通过对权重进行累加来创建累积分数:

cum = np.cumsum(arr[:,1])

这个累积分数需要进行归一化处理,使得整体的范围是 1。

cum /= cum[-1]

现在我们可以绘制累积分布图了:

plt.plot(arr[:,0], cum)

在这个图中,X 轴是输入值,Y 轴对应的是低于每个水平的样本比例。

撰写回答