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

时间:2014-07-24 09:47:06

标签: python numpy matplotlib

我正在尝试为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')

enter image description here

我现在的问题是将此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()

enter image description here

我不知道这个情节是否正确,因为我在做CDF时没有包括重量(weight1和weight2)。如何在绘制CDF时包括权重?

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的数据,您会有许多样本与其相关的权重。也许你想要的是样本的实验性CDF。

样本位于向量x中,权重位于向量w中。让我们首先构造一个Nx2数组:

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

然后我们将按样本对此数组进行排序:

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

这种排序可能看起来有点奇怪,但argsort给出了排序顺序(0表示最小,1表示第二小,等等)。当通过该结果索引两列数组时,排列行使得第一列是升序的。 (仅sortaxis=0一起使用不起作用,因为它会对两个列进行独立排序。)

现在我们可以通过获取累计权重总和来创建累积分数:

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

必须将其标准化,以使满量程为1.

cum /= cum[-1]

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

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

现在X轴是输入值,Y轴对应于每个级别下面的样本分数。