在不使用标准库的情况下编写 scipy 函数(指数幂)

Posted

技术标签:

【中文标题】在不使用标准库的情况下编写 scipy 函数(指数幂)【英文标题】:Write a scipy function without using a standard library (exponential power) 【发布时间】:2022-01-12 03:05:43 【问题描述】:

我的问题可能看起来很愚蠢或很简单,但我无法找到解决方案。这是我的问题:我想编写一个指数功率分布函数,它在 scipy 中可用。但是,我不想为此使用 scipy。我该怎么办?

这是我迄今为止所做的努力:

import math
import numpy as np

def ExpPowerFun(x,b, size=1000):
        distribution = b*x**(b-1)*math.exp(1+x**b-math.exp(x**b))
        return distribution

我根据this scipy doc 使用了这个等式。公平地说,使用这个方程并使用它编写一个函数并没有多大作用。如您所见,它只返回一个值。我想在不使用 scipy 的情况下根据 scipy 的指数功率分布函数生成随机数分布。 我看过class exponpow_gefrom github code。但是,它使用scipy.special(-sc),所以它对我来说有点没用,除非有任何解决方法并避免使用 scipy。

我不知道该怎么做。同样,这可能是一项简单的任务,但我被困住了。请帮忙。

【问题讨论】:

这能回答你的问题吗? Vectorizing a function (Python) 【参考方案1】:

为给定分布生成随机数的最简单方法是使用该函数的 CDF 的倒数,当您将其应用于均匀分布的数字时,PPF(百分比点函数)将为您提供所需的分布。

对于您而言,PPF(直接取自 scipy 源代码并进行了一些修改)是:

np.power(np.log(1-np.log(1-x)), 1.0/b)

因此你的代码应该是这样的

def ExpPowerFun(b, size=1000):
    x = np.random.rand(size)
    return np.power(np.log(1-np.log(1-x)), 1.0/b)

import matplotlib.pyplot as plt
plt.hist(ExpPowerFun(2.7,10000),20)
plt.show()

编辑:均匀分布必须是从 0 到 1 ofc,因为概率是从 0% 到 100%

【讨论】:

非常感谢。我想,这对我有用。我还有一个问题:要创建一个类似于 scipy 的指数功率分布函数的函数,我们首先需要创建一个均匀分布并应用 PPF?我想了解这是如何工作的。谢谢 对于连续 PDF,CDF(X) 是得到一个小于或等于 X 的数字的概率。大多数时候在处理数值方法时,我们只是去掉小于号并说CDF(X) 是从该分布中得到 X 的概率。 因为 PPF 是逆的,这就像是说,如果我有概率 CDF(X),那么 X 是什么?所以它会在你的概率和如果你幸运的话你将获得的价值之间映射。最后,概率本身是均匀分布的,因为如果你有一个 100 面骰子,你同样可能掷出任意数量的骰子,因此我们可以使用 0 和 1 之间的均匀分布来简单地确定概率,一旦我们知道我们是多么幸运,我们可以简单地将其插入 PPF 并获得与该运气量相对应的值。 太棒了,非常感谢!

以上是关于在不使用标准库的情况下编写 scipy 函数(指数幂)的主要内容,如果未能解决你的问题,请参考以下文章

在没有 POW 或乘法的情况下编写指数函数

是否可以在不使用 main() 函数的情况下编写程序?

是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?

是否可以在不使用外部后端的情况下编写 grafana 数据源插件?

你好!无论如何要在不使用联合的情况下编写类似的查询吗?

在不指定初始和结束日期的情况下编写每月查询的自动方式?