【问题标题】:Cumulative Distribution Function from arbitrary Probability Distribution Function任意概率分布函数的累积分布函数
【发布时间】:2014-09-15 19:28:51
【问题描述】:

我正在尝试为 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 时包含权重?

【问题讨论】:

  • backgroundsignalx_value1x_value2 有什么关系?另外,你所有的权重都是整数值吗?
  • 您的 pdf 数据中似乎出现了峰值。对于最高值,我希望它更像零。您可能在加载数据文件时遇到问题,或出现其他错误。这也会影响 cdf。
  • @Brionius:对此感到抱歉。这只是错字。我编辑了问题。
  • @Salixalba:我确信我加载数据的方式没有问题。我只想在构建 CDF 时包含 weight1 和 weight2
  • 但您确实需要注意数据中的异常值。这样的异常值会影响计算均值和标准差。

标签: python numpy matplotlib


【解决方案1】:

如果我对您的数据的理解正确,那么您有许多样本具有一定的权重。也许你想要的是样本的实验 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 轴对应于每个级别以下的样本分数。

【讨论】:

  • 我认为这是正确的。效果很好,我必须使用权重。非常感谢!
  • 你能解释一下(以更简单的方式).argsort() 是如何工作的吗?
  • 我在答案中添加了一些 cmets。它看起来很奇怪,但是一旦您了解了它的工作原理,它就会非常方便。查看numpy.argsort 的文档并自己尝试一些简单的示例可能会有所帮助。
猜你喜欢
  • 2021-12-01
  • 2011-08-22
  • 2014-08-14
  • 2021-06-09
  • 1970-01-01
  • 2015-04-27
  • 2012-06-08
  • 2016-07-09
  • 2014-07-04
相关资源
最近更新 更多