用于Python中条件密度估计的工具

时间:2014-10-25 01:45:51

标签: python kernel-density probability-density

我有一个大数据集,每行包含3个属性:A,B,C

A列:可以取值1,2和0。 B列和C列:可以采用任何值。

我想使用直方图对P(A = 2 | B,C)进行密度估算,并使用python绘制结果。

我不需要代码来执行此操作,我可以尝试自己计算。我只需要知道我应该使用的程序和工具吗?

2 个答案:

答案 0 :(得分:5)

要回答您的全部问题,我们应该采取不同的步骤并回答不同的问题:

  • 如何阅读csv文件(或文本数据)?

  • 如何过滤数据?

  • 如何绘制数据?

在每个阶段,您需要使用一些技巧和特定工具,您可能在不同阶段也有不同的选择(您可以在互联网上查找不同的选择)。

1-如何阅读csv文件:

有一个内置函数可以通过存储数据的csv文件。但大多数人建议Pandas来处理csv文件。

installing Pandas package之后,您可以使用Read_CSV命令读取您的csv文件。

import pandas as pd

df= pd.read_csv("file.csv")

由于您没有共享csv文件,我将制作一个随机数据集来解释即将到来的步骤。

import pandas as pd
import numpy as np

t= [1,1,1,2,0,1,1,0,0,2,1,1,2,0,0,0,0,1,1,1]
df = pd.DataFrame(np.random.randn(20, 2), columns=list('AC'))
df['B']=t  #put a random column with only 0,1,2 values, then insert it to the dataframe

注意:Numpy是一个python-Package。使用数学运算很有帮助。你并不是主要需要它,但我在这里提到它是为了清除混乱。

如果你在这种情况下打印df,你会得到结果:

         A         C    B
0  -0.090162  0.035458  1
1   2.068328 -0.357626  1
2  -0.476045 -1.217848  1
3  -0.405150 -1.111787  2
4   0.502283  1.586743  0
5   1.822558 -0.398833  1
6   0.367663  0.305023  1
7   2.731756  0.563161  0
8   2.096459  1.323511  0
9   1.386778 -1.774599  2
10 -0.512147 -0.677339  1
11 -0.091165  0.587496  1
12 -0.264265  1.216617  2
13  1.731371 -0.906727  0
14  0.969974  1.305460  0
15 -0.795679 -0.707238  0
16  0.274473  1.842542  0
17  0.771794 -1.726273  1
18  0.126508 -0.206365  1
19  0.622025 -0.322115  1

2- - 如何过滤数据: 有不同的技术来过滤数据。最简单的方法是选择数据框内的列名称+条件。在我们的例子中,标准是选择价值" 2"在B栏中。

l= df[df['B']==2]
print l

您还可以使用其他方式,例如groupby,lambda来浏览数据框并应用不同的条件来过滤数据。

for key in df.groupby('B'):
    print key 

如果您运行上述脚本,您将获得:

对于第一个:只有B == 2

的数据
           A         C  B
3  -0.405150 -1.111787  2
9   1.386778 -1.774599  2
12 -0.264265  1.216617  2

对于第二个:打印分组的结果。

(0,            A         C  B
4   0.502283  1.586743  0
7   2.731756  0.563161  0
8   2.096459  1.323511  0
13  1.731371 -0.906727  0
14  0.969974  1.305460  0
15 -0.795679 -0.707238  0
16  0.274473  1.842542  0)
(1,            A         C  B
0  -0.090162  0.035458  1
1   2.068328 -0.357626  1
2  -0.476045 -1.217848  1
5   1.822558 -0.398833  1
6   0.367663  0.305023  1
10 -0.512147 -0.677339  1
11 -0.091165  0.587496  1
17  0.771794 -1.726273  1
18  0.126508 -0.206365  1
19  0.622025 -0.322115  1)
(2,            A         C  B
3  -0.405150 -1.111787  2
9   1.386778 -1.774599  2
12 -0.264265  1.216617  2)
  • 如何绘制数据:

绘制数据的最简单方法是使用matplotlib

在B列中绘制数据的最简单方法是运行:

import random
import matplotlib.pyplot as plt

xbins=range(0,len(l))
plt.hist(df.B, bins=20, color='blue')
plt.show()

你会得到这个结果:

enter image description here

如果你想绘制结果,你应该使用不同的颜色/技术使其有用。

import numpy as np
import matplotlib.pyplot as plt
a = df.A
b = df.B
c = df.C
t= range(20)
plt.plot(t, a, 'r--',  b, 'bs--', c, 'g^--')
plt.legend()
plt.show()

你得到的结果是:

enter image description here

绘制数据是由特定需求驱动的。您可以通过查看marplotlib.org official website的示例来探索绘制数据的不同方法。

答案 1 :(得分:0)

如果您正在寻找其他工具,这些工具比使用直方图进行非参数密度估计要复杂得多,请将此link检查到python存储库中,或直接使用安装软件包

pip install cde

除了广泛的文档外,该软件包还实现了

  • 非参数(条件和邻域内核密度估计)
  • 半参数(最小二乘cde)和
  • 基于
  • 参数神经网络的方法(混合密度网络,核密度估计)

此外,该软件包还可以计算中心矩,统计差异(kl差异,hellinger,詹森-香农),百分位数,预期的不足和数据生成过程(跳跃,跳跃扩散,GMM等)

免责声明:我是软件包开发人员之一。