我正在尝试为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时包括权重?
答案 0 :(得分: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轴对应于每个级别下面的样本分数。