定义样本空间的简单api(用于运行简单的统计模拟)

sample_space的Python项目详细描述


…是一个非常轻量级的python api,用于模拟示例空间, 事件、随机变量和(条件)分布。

示例

查看iPython notebook或阅读 以下内容:

fromsample_spaceimport*classNCoinTosses(Experiment):def__init__(self,n,p):self.n=nself.p=pdefrerun(self):self.tosses=[Bern(self.p)for_inrange(self.n)]defheads(self):returnsum(self.tosses)defthere_are_at_least_two_heads(self):returnself.heads()>=2deffirst_toss_heads(self):returnself.tosses[0]space=SampleSpace(NCoinTosses(10,0.5),iters=20000)# ask for probability of any truthy methodprint('        P(#H>=2):',space.probability_that('there_are_at_least_two_heads'))# alias for the above, if it's more grammaticalprint('           P(H1):',space.probability_of('first_toss_heads'))# change the number of iterationsprint(' P(H1), 1K iters:',space.probability_of('first_toss_heads',iters=1000))# ask for probabilities of functions of random variablesprint('         P(#H>5):',space.probability_that(['heads',is_greater_than(5)]))# ask for conditional probabilitiesprint('      P(#H>5|H1):',space.probability_that(['heads',is_greater_than(5)],given=['first_toss_heads']))print('      P(H1|#H>5):',space.probability_of('first_toss_heads',given=[['heads',is_greater_than(5)]]))print(' P(#H>5|H1,H>=2):',space.probability_that(['heads',is_greater_than(5)],given=['first_toss_heads','there_are_at_least_two_heads']))# ask for expectations, variances, and moments, conditionally or absolutelyprint('           E(#H):',space.expected_value_of('heads'))print('        E(#H|H1):',space.expected_value_of('heads',given=['first_toss_heads']))print('         Var(#H):',space.variance_of('heads'))print('      Var(#H|H1):',space.variance_of('heads',given=['first_toss_heads']))print('1st moment of #H:',space.nth_moment_of('heads',1))print('2nd moment of #H:',space.nth_moment_of('heads',2))print('3rd moment of #H:',space.nth_moment_of('heads',3))print('4th moment of #H:',space.nth_moment_of('heads',4))print('  Skewness of #H:',space.nth_moment_of('heads',3,central=True,normalized=True),'(using nth_moment_of w/ central=True, normalized=True)')print('  Skewness of #H:',space.skewness_of('heads'),'(using skewness_of)')print('  Kurtosis of #H:',space.kurtosis_of('heads'))# some plotsfig=plt.figure(figsize=(14,3))# plot distribution histogramsfig.add_subplot(121)space.plot_distribution_of('heads')# pass kwargsplt.legend()# plot conditional distribution histogramsfig.add_subplot(122)space.plot_distribution_of('heads',given=['first_toss_heads'],bins=10)# can pass kwargsplt.legend()plt.show()

它应该输出(加上一些曲线图):

        P(#H>=2): 0.98975
           P(H1): 0.502
 P(H1), 1K iters: 0.48
         P(#H>5): 0.37665
      P(#H>5|H1): 0.5076294006183305
      P(H1|#H>5): 0.6580109757729888
 P(#H>5|H1,H>=2): 0.49361831442463533
           E(#H): 4.9983
        E(#H|H1): 5.48924623116
         Var(#H): 2.4486457975
      Var(#H|H1): 2.31806506582
1st moment of #H: 4.99245
2nd moment of #H: 27.5097
3rd moment of #H: 163.13055
4th moment of #H: 1015.54155
  Skewness of #H: -0.00454435802967 (using nth_moment_of w/ central=True, normalized=True)
  Skewness of #H: 0.00414054522343 (using skewness_of)
  Kurtosis of #H: 2.78225928171

为什么?

主要是为了避免错误/减少统计模拟中的样板 检查作业解决方案。但也为了得到更好的 对概率论的理解。

Sample spaces是 概率论的核心概念。它们概括了 用随机结果反复进行实验。几乎每 重要的统计数量-事件发生的概率,或 随机变量的矩-总是相对于样本定义的 空间。所以,如果你试图编程有意义的模拟(如果 你更关心的是表现力而不是表现力 也可以通过显式定义代码来组织代码。

安装/使用

首次运行

pip install sample_space

还有import图书馆。然后定义^{tt2}的子类$ 它响应rerun(self)rerun应该执行随机 实验并将一个或多个基本结果存储为实例变量。如果 如果要定义更复杂的事件或随机变量,可以 将它们表示为实例方法。

然后,使用 Experiment。您可以在示例空间中查询 probability_that/probability_of事件,或者您可以查询它 对于distribution_ofexpected_value_ofvariance_of, ^随机的{tt12}$、kurtosis_ofnth_moment_of。 变量(也可以是事件,在这种情况下 解释为指示器)。最后,对于这些方法中的任何一种,您可以 传递一个带有事件列表的given关键字参数,它将使 你得到的任何结果都是以所有发生的事件为条件的。 在幕后,SampleSpace将只是rerun您的实验 10000次,平均你的随机变量或计算一个事件发生的频率 发生(有条件地)。可以将iters关键字参数传递给 任何方法或SampleSpace.__init__来增加 迭代。

若要引用事件或随机变量,请传递 实例变量或实验的实例方法,或传递 具有变量/方法名和lambda函数的数组。例如:

space=SampleSpace(CoinTossExperiment(10))space.probability_that('first_toss_is_heads')space.probability_that(['n_heads',lambdah:h>5])space.expected_value_of('n_heads')space.expected_value_of('n_heads',given=['first_toss_is_heads'])space.probability_that('first_toss_is_heads, given=[['n_heads', lambda h: h > 3], 'last_toss_is_heads'])

另外,sample_space定义了一些有用的lambda返回 方法(is_greater_than(x)is_less_than(x)is_at_least(x)is_at_most(x)equals(x))为方便起见。 当然,您也可以在^{tt2}上定义实例方法。$ 为了实现同样的目标。

库还公开了一些基本的采样函数(Bern(p)Bin(n,p)RandomSign(p)Categ(categories, weights))到 协助定义实验。

精简版

如果您不想定义完整的Experiment类,还可以 只需定义一个随机事件/随机变量函数 一个布尔值或一个数字,然后调用 probability_that/expected_value_of

importsample_spaceasssdefweighted_coin_flip_is_heads(p=0.4):returnss.Bern(p)defn_weighted_heads(n=100,p=0.4):returnsum(weighted_coin_flip_is_heads(p)for_inrange(n))print(ss.probability_that(weighted_coin_flip_is_heads))print(ss.probability_that(lambda:weighted_coin_flip_is_heads(0.5))print(ss.expected_value_of(n_weighted_heads))print(ss.expected_value_of(lambda:n_weighted_heads(200,0.3)))

许可证

MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka DSL Kstream>Ktable连接序列化编译错误   java为什么Bean A中的参数注入会破坏属性解析Bean B?(都是类型PropertyPlaceHolderConfigure的类型)   java Oracle SQL开发人员在尝试导出数据时调用TargetException   编辑JTree中返回的java意外值   Java,Lambda:如何从不同类型的列表集合中查找列表?   如何使用java执行命令   java如何将drawable分配给widgets按钮   JavaIntelliJ13JSF对Springbeans的支持   java转换。转换成补语   java Tomcat的性能测试   sendmail Java发送邮件函数   java重用ProjectReactor/Flux/Mono被认为是最佳实践吗?   javafx在Java中错误地转换为lambda表达式   反序列化json数组,其中属性值为数组java   java After ItemClickListener调用方法   此Java代码中有多少对象符合垃圾收集条件?   java程序“keytool”可以在以下包中找到