gpt4 book ai didi

python - scipy.stats 的 beta 函数的替代逆计算

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:54 27 4
gpt4 key购买 nike

我在 scipy.stats 中的 beta.ppf 函数的实现中发现了一个错误。它已经在他们的错误报告系统中被确认并标记为缺陷。

但是,目前我需要计算 beta 分布的置信区间,因此我需要 beta 函数的反函数。因为我不能依赖当前版本的 beta.ppf,所以我需要一个 Python 的替代品。最好我不想自己实现该功能。

有人知道可以从 scipy.stats 中替换 beta.ppf 函数的函数吗?

最佳答案

好的,我通过使用实现 beta 分发版本的 c++ boost 库创建了一个解决方法。为了使用它,你必须安装 boost 库并编译它。之后您可以使用以下代码使用它:

betainv.cpp

#include <boost/python.hpp>
#include <boost/math/distributions/beta.hpp>

using namespace boost::python;

class betainvClass {
public: double betainv(double p, double a, double b);
};

double betainvClass::betainv(double p, double a, double b) {
return boost::math::ibeta_inv(a, b, p);
}

// Expose classes and methods to Python
BOOST_PYTHON_MODULE(betainv) {
class_<betainvClass> ("create_betainv_instance")
.def("betainv", &betainvClass::betainv)
;
}

生成文件:

TARGET = betainv
PYTHON_INC = /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/include/python2.7
PYTHON_LIB = /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config
BOOST_INC = /usr/local/include
BOOST_LIB = /usr/local/lib

$(TARGET).so: $(TARGET).o
g++ -shared -Wl \
$(TARGET).o -L$(BOOST_LIB) -lboost_python \
-L$(PYTHON_LIB) -lpython2.7 \
-o $(TARGET).so

$(TARGET).o: $(TARGET).cpp
g++ -I$(PYTHON_INC) -I$(BOOST_INC) -c $(TARGET).cpp

clean:
rm -f *.o *.a *.so *~ core

Python 示例文件:

import betainv

beta = betainv.create_betainv_instance()
print "0.25, 0.0342, 170 -> " + str(beta.betainv(0.25, 0.0342, 170))
print "0.25, 0.0342, 171 -> " + str(beta.betainv(0.25, 0.0342, 171))
print "0.25, 0.0342, 172 -> " + str(beta.betainv(0.25, 0.0342, 172))

顺便说一句,进一步的评论。我进行了速度测试并运行了该方法 1000 次。首先使用 scipy,然后使用我的 boost 实现。这些是以毫秒为单位的结果:

required time scipy = 295.145019531
required time c++ = 7.68383789062

boost C++ 实现大约快 42 倍。

关于python - scipy.stats 的 beta 函数的替代逆计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com