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

0 投票
2 回答
5068 浏览
提问于 2025-04-29 13:56

我有一个很大的数据集,每一行有三个属性:A、B、C。

其中,A这一列的值可以是1、2或者0。

B和C这两列可以是任何值。

我想用直方图来估计在给定B和C的情况下,A等于2的概率P(A = 2 | B,C),并用Python来绘制结果。

我不需要具体的代码,我可以自己尝试找出怎么做。我只想知道应该使用哪些步骤和工具。

暂无标签

2 个回答

0

如果你在寻找一些比用直方图做非参数密度估计更复杂的工具,可以查看这个 链接,里面有个Python库,或者你也可以直接用下面的命令安装这个包:

pip install cde

这个包除了有详细的文档外,还实现了:

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

此外,这个包还可以计算中心矩、统计差异(如KL散度、海林格散度、詹森-香农散度)、百分位数、预期损失和数据生成过程(如ARMA跳跃、跳跃扩散、GMM等)。

免责声明:我是这个包的开发者之一。

6

为了回答你的总体问题,我们需要分步骤来讨论不同的问题:

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

  • 如何筛选数据?

  • 如何绘制数据图?

在每个阶段,你需要使用一些技术和特定的工具,而且在不同阶段你可能会有不同的选择(你可以在网上查找不同的替代方案)。

1- 如何读取csv文件:

有一个内置的功能可以读取你存储数据的csv文件。但大多数人推荐使用Pandas来处理csv文件。

安装Pandas包之后,你可以使用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包。它在进行数学运算时很有帮助。你不一定需要它,但我提到它是为了避免混淆。

如果你在这种情况下打印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- 如何筛选数据:

筛选数据有不同的技巧。最简单的方法是选择数据框中列的名称加上条件。在我们的例子中,条件是选择B列中值为“2”的数据。

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

绘制数据是基于特定需求的。你可以通过访问matplotlib.org官方网站来探索不同的绘图方式。

撰写回答