python - 使用python查找条件概率
问题描述
我遇到了一个明确告诉我不要使用numpy
andpandas
为此的问题:
给定一个列表列表,每个列表sublist
的长度为 2,即 [[x,y],[p,q],[l,m]..[r,s]] 认为它类似于matrix
n 行和两列
第一列 F 将仅包含 5 个唯一值(F1、F2、F3、F4、F5)第二列 S 将仅包含 3 个唯一值(S1、S2、S3)您的任务是查找
a. Probability of P(F=F1|S==S1), P(F=F1|S==S2), P(F=F1|S==S3)
b. Probability of P(F=F2|S==S1), P(F=F2|S==S2), P(F=F2|S==S3)
c. Probability of P(F=F3|S==S1), P(F=F3|S==S2), P(F=F3|S==S3)
d. Probability of P(F=F4|S==S1), P(F=F4|S==S2), P(F=F4|S==S3)
e. Probability of P(F=F5|S==S1), P(F=F5|S==S2), P(F=F5|S==S3)
Ex:
[[F1,S1],[F2,S2],[F3,S3],[F1,S2],[F2,S3],[F3,S2],[F2,S1],[F4,S1],[F4,S3],[F5,S1]]
a. P(F=F1|S==S1)=1/4, P(F=F1|S==S2)=1/3, P(F=F1|S==S3)=0/3
b. P(F=F2|S==S1)=1/4, P(F=F2|S==S2)=1/3, P(F=F2|S==S3)=1/3
c. P(F=F3|S==S1)=0/4, P(F=F3|S==S2)=1/3, P(F=F3|S==S3)=1/3
d. P(F=F4|S==S1)=1/4, P(F=F4|S==S2)=0/3, P(F=F4|S==S3)=1/3
e. P(F=F5|S==S1)=1/4, P(F=F5|S==S2)=0/3, P(F=F5|S==S3)=0/3
我为上面编写了以下代码,但是,我收到以下错误,我不确定问题是什么:
unsupported operand type(s) for &: 'str' and 'str'
另外,我写的代码似乎是实现上述问题的非常糟糕的方法,有没有更好的方法?如果是这样,会要求你分享它。
A = [['F1','S1'],['F2','S2'],['F3','S3'],['F1','S2'],['F2','S3'],['F3','S2'],['F2','S1'],['F4','S1'],['F4','S3'],['F5','S1']]
dictionary1 = {
'F1S1':0,
'F2S1':0,
'F3S1':0,
'F4S1':0,
'F5S1':0,
'F1S2':0,
'F2S2':0,
'F3S2':0,
'F4S2':0,
'F5S2':0,
'F1S3':0,
'F2S3':0,
'F3S3':0,
'F4S3':0,
'F5S3':0,
}
dictionary2= {
'S1':0,
'S2':0,
'S3':0
}
def compute_conditional_probabilities(A):
for i in range(len(A)):
if(A[i][0]=='F1'& A[i][1]=='S1'):
dictionary1['F1S1'] = dictionary1['F1S1'] +1
dictionary2['S1'] = dictionary2['S1'] +1
if(A[i][0]=='F1'&A[i][1]=='S2'):
dictionary1['F1S2'] = dictionary1['F1S2'] +1
dictionary2['S2'] = dictionary2['S2'] +1
if(A[i][0]=='F1'&A[i][1]=='S3'):
dictionary1['F1S3'] = dictionary1['F1S3'] +1
dictionary2['S3'] = dictionary2['S3'] +1
if(A[i][0]=='F2'&A[i][1]=='S1'):
dictionary1['F2S1'] = dictionary1['F2S1'] +1
dictionary2['S1'] = dictionary2['S1'] +1
if(A[i][0]=='F2'&A[i][1]=='S2'):
dictionary1['F2S2'] = dictionary1['F2S2'] +1
dictionary2['S2'] = dictionary2['S2'] +1
if(A[i][0]=='F2'&A[i][1]=='S3'):
dictionary1['F2S3'] = dictionary1['F2S3'] +1
dictionary2['S3'] = dictionary2['S3'] +1
if(A[i][0]=='F3'&A[i][1]=='S1'):
dictionary1['F3S1'] = dictionary1['F3S1'] +1
dictionary2['S1'] = dictionary2['S1'] +1
if(A[i][0]=='F3'&A[i][1]=='S2'):
dictionary1['F3S2'] = dictionary1['F3S2'] +1
dictionary2['S2'] = dictionary2['S2'] +1
if(A[i][0]=='F3'&A[i][1]=='S3'):
dictionary1['F3S3'] = dictionary1['F3S3'] +1
dictionary2['S3'] = dictionary2['S3'] +1
if(A[i][0]=='F4'&A[i][1]=='S1'):
dictionary1['F4S1'] = dictionary1['F4S1'] +1
dictionary2['S1'] = dictionary2['S1'] +1
if(A[i][0]=='F4'&A[i][1]=='S2'):
dictionary1['F4S2'] = dictionary1['F4S2'] +1
dictionary2['S2'] = dictionary2['S2'] +1
if(A[i][0]=='F4'&A[i][1]=='S3'):
dictionary1['F4S3'] = dictionary1['F4S3'] +1
dictionary2['S3'] = dictionary2['S3'] +1
if(A[i][0]=='F5'&A[i][1]=='S1'):
dictionary1['F5S1'] = dictionary1['F5S1'] +1
dictionary2['S1'] = dictionary2['S1'] +1
if(A[i][0]=='F5'&A[i][1]=='S2'):
dictionary1['F5S2'] = dictionary1['F5S2'] +1
dictionary2['S2'] = dictionary2['S2'] +1
if(A[i][0]=='F5'&A[i][1]=='S3'):
dictionary1['F5S3'] = dictionary1['F5S3'] +1
dictionary2['S3'] = dictionary2['S3'] +1
compute_conditional_probabilities(A)
print('Probability of P(F=F1|S==S1)',(dictionary1['F1S1']/dictionary2['S1']))
解决方案
(删除了与您已修复的部分代码相关的部分答案)
请注意,在调用字典时,您不必将键名作为字符串传递 - 您可以传递保存该值的变量。例如,如果d
是一个字典并且k
是一个等于 的变量1
,您可以通过d[k]
而不是d[1]
. 使用它,以及您可以将字符串“添加”在一起以连接它们的事实(例如'a'+'b' = 'ab'),您可以将函数重写compute_conditional_probabilities
为:
def compute_conditional_probabilities(A):
for i in range(len(A)):
k = A[i][0]+A[i][1]
dictionary1[k] += 1
dictionary2[A[i][1]] += 1
看看这是否有效,并且编码愉快!
推荐阅读
- javascript - 无法修复我的脚本以按我需要的方式记录
- scala - 如何从 csv 文件中读取以创建 scala Map 对象?
- arrays - 尝试从正态分布的数字生成伪随机数组/矩阵时出现问题
- python - 安装模块时,VSCode/pylint 将模块 win32event 报告为未解析的导入
- python - 我无法让 wx.Panel 正确刷新
- java - 获取删除文件夹\文件的时间
- java - 如何让多维数组与字符串输入一起循环?
- javascript - 全局存储 XHR 响应
- c++ - 我可以有一个与另一个向量共享存储的向量吗?
- r - 如何在数据表的多个列上应用`formatStyle`