检查随机变量是否独立 Python
Check if random variables are independent Python
下面给定一个table
X
Y
pr
0
1
0.30
0
2
0.25
1
1
0.15
1
2
0.30
我打算创建一个函数来检查两个变量 X
和 Y
之间的独立性。请注意,table 中的第三列 pr
是概率。例如 P(X=0 ^ Y=1) = 0.3
。同样,P(Y=1) = 0.3+0.15 = 0.45
.
如果对于 X 的每个可能值 x 和对于 Y 的每个可能值 y,则两个随机变量是独立的
P(X =x ^ Y = y) = P(X = x)*P(Y = y)
.
我知道我们可以使用 iterrows()
或 itertuples()
来迭代 DataFrame。但是我遇到了在 for
循环中获得边际概率的问题。
注意:边际概率为 P(X = x)
和 P(Y = y)
。
这是我的基本代码
import pandas as pd
#you can use this table as an example
distr_table = pd.DataFrame({'X': [0, 0, 1, 1], 'Y': [1, 2, 1, 2], 'pr': [0.3, 0.25, 0.15, 0.3]})
x_0,x_1 = distr_table.groupby('X').pr.sum()
y_1,y_2 = distr_table.groupby('Y').pr.sum()
x_u = distr_table.X.unique()
y_u = distr_table.Y.unique()
for index, row in distr_table.iterrows():
print(row['X'], row['Y'], row['pr'])
尽管groupby
:
,边际概率很容易得到
>>> distr_table.groupby('Y')['pr'].sum()
Y
0 0.45
1 0.55
Name: pr, dtype: float64
>>> distr_table.groupby('X')['pr'].sum()
X
0 0.55
1 0.45
Name: pr, dtype: float64
所以从这里我们可以很容易地用 pd.merge(…, how='cross')
:
重构独立概率
>>> cmp = pd.merge(distr_table.groupby('X', as_index=False)['pr'].sum(), distr_table.groupby('Y', as_index=False)['pr'].sum(), how='cross')
>>> cmp['indep_pr'] = cmp['pr_x'] * cmp['pr_y']
>>> cmp
X pr_x Y pr_y indep_pr
0 0 0.55 0 0.45 0.2475
1 0 0.55 1 0.55 0.3025
2 1 0.45 0 0.45 0.2025
3 1 0.45 1 0.55 0.2475
最后将其与您的初始概率分布进行比较:
>>> cmp[['X', 'Y', 'indep_pr']].merge(distr_table, on=['X', 'Y'])
X Y indep_pr pr
0 0 0 0.2475 0.30
1 0 1 0.3025 0.25
2 1 0 0.2025 0.15
3 1 1 0.2475 0.30
如果你想比较这些分布,因为我们在这里使用浮点数,我建议 np.allclose()
,即
>>> np.allclose(cmp['indep_pr'], df['pr'])
False
下面给定一个table
X | Y | pr |
---|---|---|
0 | 1 | 0.30 |
0 | 2 | 0.25 |
1 | 1 | 0.15 |
1 | 2 | 0.30 |
我打算创建一个函数来检查两个变量 X
和 Y
之间的独立性。请注意,table 中的第三列 pr
是概率。例如 P(X=0 ^ Y=1) = 0.3
。同样,P(Y=1) = 0.3+0.15 = 0.45
.
如果对于 X 的每个可能值 x 和对于 Y 的每个可能值 y,则两个随机变量是独立的
P(X =x ^ Y = y) = P(X = x)*P(Y = y)
.
我知道我们可以使用 iterrows()
或 itertuples()
来迭代 DataFrame。但是我遇到了在 for
循环中获得边际概率的问题。
注意:边际概率为 P(X = x)
和 P(Y = y)
。
这是我的基本代码
import pandas as pd
#you can use this table as an example
distr_table = pd.DataFrame({'X': [0, 0, 1, 1], 'Y': [1, 2, 1, 2], 'pr': [0.3, 0.25, 0.15, 0.3]})
x_0,x_1 = distr_table.groupby('X').pr.sum()
y_1,y_2 = distr_table.groupby('Y').pr.sum()
x_u = distr_table.X.unique()
y_u = distr_table.Y.unique()
for index, row in distr_table.iterrows():
print(row['X'], row['Y'], row['pr'])
尽管groupby
:
>>> distr_table.groupby('Y')['pr'].sum()
Y
0 0.45
1 0.55
Name: pr, dtype: float64
>>> distr_table.groupby('X')['pr'].sum()
X
0 0.55
1 0.45
Name: pr, dtype: float64
所以从这里我们可以很容易地用 pd.merge(…, how='cross')
:
>>> cmp = pd.merge(distr_table.groupby('X', as_index=False)['pr'].sum(), distr_table.groupby('Y', as_index=False)['pr'].sum(), how='cross')
>>> cmp['indep_pr'] = cmp['pr_x'] * cmp['pr_y']
>>> cmp
X pr_x Y pr_y indep_pr
0 0 0.55 0 0.45 0.2475
1 0 0.55 1 0.55 0.3025
2 1 0.45 0 0.45 0.2025
3 1 0.45 1 0.55 0.2475
最后将其与您的初始概率分布进行比较:
>>> cmp[['X', 'Y', 'indep_pr']].merge(distr_table, on=['X', 'Y'])
X Y indep_pr pr
0 0 0 0.2475 0.30
1 0 1 0.3025 0.25
2 1 0 0.2025 0.15
3 1 1 0.2475 0.30
如果你想比较这些分布,因为我们在这里使用浮点数,我建议 np.allclose()
,即
>>> np.allclose(cmp['indep_pr'], df['pr'])
False