任意概率分布函数的累积分布函数
我正在尝试为从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 轴对应的是低于每个水平的样本比例。