我在beta.ppf函数的scipy.stats实现中发现了一个bug。它已经被确认并标记为他们的错误再现系统中的一个缺陷。
然而,目前我需要计算贝塔分布的置信区间,因此我需要贝塔函数的逆。因为我不能依赖beta.ppf的当前版本,所以我需要一个替代的Python。最好我不想自己去实现这个功能。
有谁知道可以从beta.ppf中替换scipy.stats函数的函数吗?
发布于 2014-06-28 08:12:06
好的,我通过使用c++ boost库创建了一个解决方案,它实现了beta发行版的一个版本。为了使用它,您必须安装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)
;
}
Makefile:
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次。首先使用and,然后使用我的boost实现。这些结果以毫秒为单位:
required time scipy = 295.145019531
required time c++ = 7.68383789062
boost c++实现速度大约快42倍。
https://stackoverflow.com/questions/24432788
复制