Loading...
墨滴

yuanzhoulvpi

2021/06/17  阅读:45  主题:默认主题

对概率的有印象的体验

介绍

感觉工作以后,好多知识点都忘记了,比如一些英语单词,都不知道怎么写了。当然更别说我学的数学分析和数理统计,知识点都还给老师了。

但是今天最近遇到一个小事情,让我想起来以前学习的概率统计中一个重要的知识点:条件概率。

问题

为了取出某个数据,我需要将一个sql脚本拆分几个小片段,这些小片段是前后都有依赖的,第一句失败了,第二句也就会失败,第三句也就会失败 …… 那我的目的就是提高每一片段sql的执行的成功率。

每一个片段如果第一次执行错误,那么再执行一遍。所以说,一个片段的执行次数最大2次。

解决办法

我遇到问题,就喜欢用代码模拟一下,都想算一算。这么做的目的:

  1. 为了提高我的代码能力;
  2. 顺带解决我工作上的问题;
  3. 就是好玩;

我就创建了一个简单的python错误:

import random
random.choice([1'a''b''c''d']) + 1

在上面的代码中,会有1/5的概率运行成功。原理就是从一个列表取一个对象,如果这个对象是一个字符串,那么这个字符串和数值1相加就会报错,如果取出来是一个数值型的,那么就不会报错。

捕获异常

上面的错误我们再用try语句捕捉到。然后放到for循环里面,看看能执行多少次。

#%%
from tqdm import tqdm
import random
#%%
for i in tqdm(range(10)):
    try:
        random.choice([1'a''b''c','d']) + 1
        print('success')
    except Exception as e:
        pass

通常会输出两个成功,当然,如果把10调整更大,成功输出的概率会接近0.2 。

实现2次运行

基于上面的代码,我们添加了一个while,如果不成功,再运行一次,再次运行的次数最大2次。因为需要运行更多次,才能让成功运行的概率趋向于真实概率,这里我们做了一个统计,看看最终输出多少。

# 两次运行
epoch = 1000
success_time = 0

for i in tqdm(range(epoch)):
    status = 1

    while status <= 2:

        try:
            random.choice([1'a''b''c','d']) + 1
            # print('success')
            success_time += 1

        except Exception as e:
            status += 1
            continue
        break

print(f"成功次数: {success_time / epoch}")

这个模拟出来的概率是0.356,那么理论上应该多少?

按照条件概率计算应该是:1/5 + 4/5 * 1/5 = 0.36。和我们模拟算出来的是差不多的。实际上你把商品的那个epoch数值改大一点,会不断的趋向于0.36.

如果把上面那个while status <= 2中的2改为6,那么计算出来的模拟概率会更大。就像是下面的结果一样:

这个算出来是0.737388 和我们直接按照条件概率算出来的是一样的:

最后,不希望代码失败退出

当然我也希望每一步都不要出现错误,哪怕出现错误,再回去运行一次,直到成功为止,那么我们就可以这么写:

for i in tqdm(range(4)):

    while True:

        try:
            random.choice([1'a''b''c','d']) + 1
            print('success')
        except Exception as e:
            continue
        break

是不是很粗暴!!!

总结

这个就是我在工作中遇到的一些代码执行故障,然后提高运行次数来让结果能跑出来,看到输出的概率,就想到之前学的条件概率、贝叶斯之类的。

感觉有点亲切:一方面是突然联想到自己学的知识点;一方面想到了课本中那个容易出错的”机器“。而我现在,不就是书中那个流水线上有着失败、错误概率的机器么。书本的具体的知识点都快忘记了,但是还记得提高成功率的办法:失败不断的重来,只要你不停下来,那么这台机器的成功率就会趋向1。

生活虽然苦,工作虽然累,可是好歹还有时间写自己喜欢的代码,工作中也是写一些代码解决问题。其实真的开心快乐。

PS

自己一直用着Pycharm的学生版本,感觉Pycharm的专业版确实很好用。在学生版本快到期的时候,刚好给我一个优惠价格,然后我花了大概400多大洋买了这个Pycharm的专业版一年,可别说,写python、sql、js、rust还真的很舒服。嘿嘿,我用正版有点开心😘。

祝福大家都能找到自己喜欢做的事情,并且可以坚持下去!

yuanzhoulvpi

2021/06/17  阅读:45  主题:默认主题

作者介绍

yuanzhoulvpi