python数据分析,模拟概率论问题的库,特别是条件概率。使用特定的PMF或PDF创建自定义的单一或联合分布以获取概率表并基于概率函数生成数据也很有用

介绍

这是一个模拟概率论问题的库,特别是条件概率。使用特定的PMF或PDF创建自定义的单一或联合分布以获取概率表并基于概率函数生成数据也很有用。

如何安装?

pip install pprobs

概率模拟器

它模拟概率论问题,尤其是条件概率。

示例1

我们想通过定义一些事件来获得一些信息。

  • P(A) = 0.3
  • P(B) = 0.2
  • P(A^B) = 0.1
  • A and B are dependent
  • P(A+B) = ? , P(A|B) = ?
from pprobs.simulation import Simulator

space = Simulator()

space.add_event('A', 0.3)
space.add_event('B', 0.2)
space.add_event('A^B', 0.1)

prob_1 = space.get_prob('A+B') # A+B means union of A and B
prob_2 = space.get_prob('A|B')

print(prob_1, prob_2) # 0.4  0.5

示例2

在100名跑车购买者中,40人购买了报警系统,30人购买了斗式座椅,20人购买了报警系统和斗式座椅。如果一个随机选择的汽车购买者买了一个报警系统,他们也买了桶形座椅的概率是多少?

经过统计显示

  • P(SEAT) = 0.3
  • P(ALARM) = 0.4
  • P(SEAT ^ ALARM) = 0.2
  • P(SEAT | ALARAM) = ?
from pprobs.simulation import Simulator

space = Simulator()

space.add_event('SEAT', 0.3).add_event('ALARM', 0.4) # We can also add events sequentially in a line (chaining) 
space.add_event('SEAT^ALARM', 0.2) # A^B means intersection of A & B

print(space.get_prob('SEAT|ALARM')) # 0.5

示例3

总共有1%的人有某种遗传缺陷。90%的基因检测发现缺陷(真阳性)。9.6%的测试是假阳性。如果一个人的测试结果是阳性,那么他们真的有基因缺陷的几率有多大?

经过统计显示

  • P(GEN_DEF) = 0.01
  • P(POSITIVE|GEN_DEF) = 0.9
  • P(POSITIVE|GEN_DEF!) = 0.096
  • P(GEN_DEF|POSITIVE) = ?
space = Simulator()

space.add_event('GEN_DEF', 0.01)
space.add_event('POSITIVE|GEN_DEF', 0.9) # A|B means A given B
space.add_event('POSITIVE|GEN_DEF!', 0.096) # A! means complement of A

print(space.get_prob('GEN_DEF|POSITIVE')) # 0.0865

实例4

鲍勃明天有一个重要的会议,他必须在早上准时到达办公室。他的一般交通方式是开车,在正常情况下(没有汽车故障),他准时到达的概率是0.3。他可能有汽车故障的概率是0.2。如果汽车出了问题,他将不得不乘火车,而10列火车中只有2列能让他准时到达办公室。

经过黑客地球

  • P(ON_TIME|CAR_OK) = 0.3
  • P(ON_TIME|CAR_OK!) = 2/10 => Go by train
  • P(CAR_OK!) = 0.2
  • P(ON_TIME) = ?
space = Simulator()

space.add_event('ON_TIME|CAR_OK', 0.3)
space.add_event('ON_TIME|CAR_OK!', 2/10)
space.add_event('CAR_OK!', 0.2)

prob = space.get_prob('ON_TIME') # Probability of ON_TIME

print(prob) # 0.28

分布模拟器

使用特定的PMF或PDF创建自定义的单一或联合分布对于获取概率表和基于概率函数生成数据非常有用。

示例1

假设我们有一个具有特定PMF的离散随机变量。我们希望基于这个变量生成许多数据。正如您在第二个示例中看到的,1的概率最大,复制次数最多,4的概率最小,复制次数较少。

from pprobs.distribution import Discrete

# First 
def pmf(x):
    return 1 / 6

dist = Discrete(pmf, [1, 2, 3, 4, 5, 6]) # The second is the sample space of our PMF

print(dist.generate(15)) # [4, 3, 1, 6, 5, 3, 5, 3, 5, 4, 2, 5, 6, 1, 6]


# Second
def pmf(x):
    return 1 / x

dist = Discrete(pmf, [1, 2, 3, 4])
print(dist.generate(15)) # [1, 2, 1, 1, 1, 4, 3, 1, 1, 3, 2, 4, 1, 2, 2]

示例2

假设我们有一个特定PDF的连续随机变量。

from pprobs.distribution import Continuous

def pdf(x):
  if x > 1:
    return x / x ** 2
  return 0

dist = Continuous(pdf, [1, 6]) # The second is the sample interval of our PDF

print(dist.generate(15)) # [2.206896551724138, 4.103448275862069, ..., 5.655172413793104, 6.0]

示例3

假设我们有一个具有特定PDF的连续联合变量。

from pprobs.distribution import Joint

def pdf(x, y):
  if x > 1:
    return 1 / (x * y)
  return 0

dist = Joint(pdf, [1, 6], [3, 10]) # The second and third are the intervals of our PDF

print(dist.probability_table(force=20)) # if force gets more, many number will generate
输出:

X/Yx=3.0X=3.7...X=10
X=1.00.0000.000...0.000
...............
X=6.00.0550.044...0.016
print(dist.get_prob(3.5, 3.5)) # 0.081 is P(X=3.5, Y=3.5)
print(dist.get_prob([1, 6], 4)) # 0.041 is P(Y=4) because X includes its whole domain
print(dist.get_prob(2.1, [1, 4])) # 0.206 is P(X=2.1, Y in [1, 4])

实例4

假设我们有一个具有特定PMF的离散联合变量。

from pprobs.distribution import Joint

def pmf(x, y):
  if x > 1:
    return 1 / (x * y)
  return 0

dist = Joint(pmf, range(1, 6), range(6, 10)) # The second and third are the sample space of our PMF

print(dist.probability_table()) 
输出:

X/YY=6Y=7Y=8Y=9
X=10.0000000.0000000.0000000.000000
X=20.0833330.0714290.0625000.055556
X=30.0555560.0476190.0416670.037037
X=40.0416670.0357140.0312500.027778
X=50.0333330.0285710.0250000.022222
print(dist.get_prob(2, range(6, 10))) # 0.272 is P(X=2)
print(dist.get_prob(2, 6)) # 0.083 is P(X=2, Y=6)

谢谢你在Github上给我一颗星。mokar2001 (MohammadReza KarimiNejad) · GitHub

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值