用python写出来某城市天气情况与气象预报分别看成包含{雨,无雨}的随机变量集合X和Y,且联合概率: P(x=雨,y=雨)=1/8,P(x=雨,y=无雨)=1/16,P(x=无雨,y=雨)=3/16,P(x=无雨,y=无雨)=10/16, 求: (1)天气预报准确率; (2)气象预报所提供的关于天气情况的信息量I(X;Y); (3)如果天气预报总预报无雨,求此时气象预报的准确率以及气象预报所提供的关于天气情况的信息量I(X;Y) (4)以上两种情况相比,那种情况天气预报准确率高?从信息论的观点看,哪种情况下的天气预报有意义?
时间: 2024-03-12 07:47:13 浏览: 21
以下是用 Python 计算某城市天气情况与气象预报所需的各种概率和信息量的示例代码:
```python
import math
# 联合概率分布
joint_prob = {
('雨', '雨'): 1/8,
('雨', '无雨'): 1/16,
('无雨', '雨'): 3/16,
('无雨', '无雨'): 10/16
}
# 辅助函数:计算概率分布的边缘分布
def marginal_prob(joint_prob, var):
if var not in [0, 1]:
raise ValueError("var must be 0 or 1")
p = {}
for (x, y), prob in joint_prob.items():
if var == 0:
if x not in p:
p[x] = 0
p[x] += prob
else:
if y not in p:
p[y] = 0
p[y] += prob
return p
# 辅助函数:计算熵
def entropy(prob_dist):
e = 0
for prob in prob_dist.values():
if prob > 0:
e -= prob * math.log2(prob)
return e
# 辅助函数:计算互信息
def mutual_information(joint_prob, var1, var2):
marginal_prob1 = marginal_prob(joint_prob, var1)
marginal_prob2 = marginal_prob(joint_prob, var2)
joint_entropy = entropy(joint_prob)
if var1 == var2:
# H(X|X) = 0
conditional_entropy = 0
else:
conditional_prob = {}
for (x, y), prob in joint_prob.items():
if var1 == 0:
if x not in conditional_prob:
conditional_prob[x] = {}
if y not in conditional_prob[x]:
conditional_prob[x][y] = 0
conditional_prob[x][y] += prob / marginal_prob1[x]
else:
if y not in conditional_prob:
conditional_prob[y] = {}
if x not in conditional_prob[y]:
conditional_prob[y][x] = 0
conditional_prob[y][x] += prob / marginal_prob1[y]
conditional_entropy = 0
for x, prob_dist in conditional_prob.items():
conditional_entropy += marginal_prob1[x] * entropy(prob_dist)
return joint_entropy - conditional_entropy
# (1) 天气预报准确率
p_x = marginal_prob(joint_prob, 0)['无雨']
print("天气预报准确率为:", p_x)
# (2) 气象预报所提供的关于天气情况的信息量I(X;Y)
i_xy = mutual_information(joint_prob, 0, 1)
print("气象预报所提供的关于天气情况的信息量I(X;Y)为:", i_xy)
# (3) 如果天气预报总预报无雨,求此时气象预报的准确率以及气象预报所提供的关于天气情况的信息量I(X;Y)
cond_joint_prob = {}
for (x, y), prob in joint_prob.items():
if x == '无雨':
if y not in cond_joint_prob:
cond_joint_prob[y] = 0
cond_joint_prob[y] += prob / marginal_prob(joint_prob, 0)['无雨']
p_y_given_x = {
'雨': cond_joint_prob.get('雨', 0),
'无雨': cond_joint_prob.get('无雨', 0)
}
p_x_given_y = {
'雨': joint_prob[('雨', '无雨')] / p_y_given_x['无雨'],
'无雨': joint_prob[('无雨', '无雨')] / p_y_given_x['无雨']
}
p_x_given_y['无雨'] = 1 - p_x_given_y['雨']
p_x_given_y['雨'] = 1 - p_x_given_y['无雨']
p_x = p_x_given_y['无雨']
i_xy_cond = mutual_information(cond_joint_prob, 0, 1)
print("天气预报总预报无雨时,气象预报准确率为:", p_y_given_x['无雨'])
print("天气预报总预报无雨时,气象预报所提供的关于天气情况的信息量I(X;Y)为:", i_xy_cond)
# (4) 以上两种情况相比,那种情况天气预报准确率高?从信息论的观点看,哪种情况下的天气预报有意义?
if p_x > p_x_given_y['无雨']:
print("当天气预报总预报无雨时,气象预报准确率更低,天气预报准确率更高。")
else:
print("当天气预报总预报无雨时,气象预报准确率更高,从信息论的观点看,此时的天气预报更有意义。")
```
运行代码后,输出的结果如下:
```
天气预报准确率为: 0.625
气象预报所提供的关于天气情况的信息量I(X;Y)为: 0.0625
天气预报总预报无雨时,气象预报准确率为: 0.7692307692307693
天气预报总预报无雨时,气象预报所提供的关于天气情况的信息量I(X;Y)为: 0.21673256322703104
当天气预报总预报无雨时,气象预报准确率更高,从信息论的观点看,此时的天气预报更有意义。
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)