统计学初学贝叶斯公式,感觉很好奇,用python验证了一下,感觉被骗了.


百度原文链接地址:
https://baike.baidu.com/item/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%85%AC%E5%BC%8F

贝叶斯法则的举例分析
可以将贝叶斯法则的分析思路表达如下。
挑战者B不知道原垄断者A是属于高阻挠成本类型还是低阻挠成本类型,但B知道,如果A属于高阻挠成本类型,B进入市场时A进行阻挠的概率是20%(此时A为了保持垄断带来的高利润,不计成本地拼命阻挠);如果A属于低阻挠成本类型,B进入市场时A进行阻挠的概率是100%。
博弈开始时,B认为A属于高阻挠成本企业的概率为70%,因此,B估计自己在进入市场时,受到A阻挠的概率为:
0.7×0.2+0.3×1=0.44
0.44是在B给定A所属类型的先验概率下,A可能采取阻挠行为的概率。
当B进入市场时,A确实进行阻挠。使用贝叶斯法则,根据阻挠这一可以观察到的行为,B认为A属于高阻挠成本企业的概率变成A属于高成本企业的概率=0.7(A属于高成本企业的先验概率)×0.2(高成本企业对新进入市场的企业进行阻挠的概率)÷0.44=0.32
根据这一新的概率,B估计自己在进入市场时,受到A阻挠的概率为:
0.32×0.2+0.68×1=0.744
如果B再一次进入市场时,A又进行了阻挠。使用贝叶斯法则,根据再次阻挠这一可观察到的行为,B认为A属于高阻挠成本企业的概率变成。
A属于高成本企业的概率=0.32(A属于高成本企业的先验概率)×0.2(高成本企业对新进入市场的企业进行阻挠的概率)÷0.744=0.086
这样,根据A一次又一次的阻挠行为,B对A所属类型的判断逐步发生变化,越来越倾向于将A判断为低阻挠成本企业了。
以上例子表明,在不完全信息动态博弈中,参与人所采取的行为具有传递信息的作用。尽管A企业有可能是高成本企业,但A企业连续进行的市场进入阻挠,给B企业以A企业是低阻挠成本企业的印象,从而使得B企业停止了进入地市场的行动。
应该指出的是,传递信息的行为是需要成本的。假如这种行为没有成本,谁都可以效仿,那么,这种行为就达不到传递信息的目的。只有在行为需要相当大的成本,因而别人不敢轻易效仿时,这种行为才能起到传递信息的作用。
传递信息所支付的成本是由信息的不完全性造成的。但不能因此就说不完全信息就一定是坏事。研究表明,在重复次数有限的囚徒困境博弈中,不完全信息可以导致博弈双方的合作。理由是:当信息不完全时,参与人为了获得合作带来的长期利益,不愿过早暴露自己的本性。这就是说,在一种长期的关系中,一个人干好事还是干坏事,常常不取决于他的本性是好是坏,而在很大程度上取决于其他人在多大程度上认为他是好人。如果其他人不知道自己的真实面目,一个坏人也会为了掩盖自己而在相当长的时期内做好事。 [2]
 
python计算公式如下:
 
import random
from numpy import mean


def getH(flag=False, pre=0.7):
    if flag:
        #  A 高阻挠成本 B被阻挠  P(A|B) = P(B|A)*P(B)/P(A)
        result = round(0.2 * pre, 6) / round((pre * 0.2 + (1 - pre)), 6)
    else:
        #  A 低挠成本 B没被阻挠  P(A|B) = P(B|A)*P(B)/P(A)
        result = round(0.8 * (1 - pre), 6) / round((pre * 0.2 + (1 - pre)), 6)
    print(flag, pre, round(result, 6))
    return round(result, 6)


pre = 0.25  # 第一次估算高阻挠成本概率
result_list = []  # 过程中计算的高阻挠概率值集合
flag_list = []  # 记录触发多少次阻挠
total = 100000
for i in range(total):
    # 按照1/4(25%)概率取高阻挠,高阻挠中按照1/5(20%)取实际阻挠.
    flag = random.randint(0, 20) % 5 == 0 if random.randint(0, 20) % 4 == 0 else True
    flag_list.append(flag)
    pre = getH(flag, pre=pre)
    result_list.append(pre)
print("设置高阻挠概率:0.25")
print("按概率计算阻挠比例:", 0.25 * 0.2 + 0.75 * 1)
flag_count = len(list(filter(lambda x: x, flag_list)))
print("实际阻挠次数:", flag_count)
print("实际阻挠比例:", flag_count / total)
print("根据实际逆推高阻挠概率:", (flag_count / total - 0.75) / 0.2)
print("算法中位数", mean(result_list))
print("算法纠偏最终值:", pre)

 

以下为通过贝叶斯算法公式纠正之后的预测高阻挠率的值,竟然是0.多运行几遍结果没有这么夸张但是感觉也是差不多.反正准确率真的有待商榷.
特此纪念.

 

 

刚刚学贝叶斯公式,也是刚刚学python,有不准确的地方请帮忙指正,谢谢.

posted on 2020-08-14 18:19  夜色无边000  阅读(260)  评论(0编辑  收藏  举报