Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 概率密度的黎曼和_Python_Integral_Probability Density_Weibull - Fatal编程技术网

Python 概率密度的黎曼和

Python 概率密度的黎曼和,python,integral,probability-density,weibull,Python,Integral,Probability Density,Weibull,我试图找出随机变量超过特定值的事件概率,即pr(x>a),其中a是常数,通常远高于x的平均值,x不是任何标准高斯分布。所以我想拟合一些其他的概率密度函数,并从a到inf取x的pdf积分。由于这是一个尖峰建模问题,我认为这是一个极值分析问题,并发现Weibull分布可能是合适的 关于极值分布,威布尔分布有一个非常“不容易实现”的积分,因此我想我可以从Scipy得到pdf,然后做一个黎曼和。我还认为我可以简单地计算核密度,得到pdf,然后对黎曼和做同样的计算,来近似积分 我在堆栈中发现了一个Q,它为

我试图找出随机变量超过特定值的事件概率,即pr(x>a),其中a是常数,通常远高于x的平均值,x不是任何标准高斯分布。所以我想拟合一些其他的概率密度函数,并从a到inf取x的pdf积分。由于这是一个尖峰建模问题,我认为这是一个极值分析问题,并发现Weibull分布可能是合适的

关于极值分布,威布尔分布有一个非常“不容易实现”的积分,因此我想我可以从Scipy得到pdf,然后做一个黎曼和。我还认为我可以简单地计算核密度,得到pdf,然后对黎曼和做同样的计算,来近似积分

我在堆栈中发现了一个Q,它为Python中的黎曼求和提供了一种简洁的方法,我修改了该代码以适应我的问题。但当我计算积分时,我得到了奇怪的数字,这表明KDE或黎曼和函数有问题

根据Scipy文件,有两种情况,第一种是Weibull:

x = theData
x_grid = np.linspace(0,np.max(x),len(x))

p = ss.weibull_min.fit(x[x!=0], floc=0)
pd = ss.weibull_min.pdf(x_grid,p[0], p[1], p[2])
看起来是这样的:

然后还尝试了如下KDE方法

pd = ss.gaussian_kde(x).pdf(x_grid)
随后,我将运行以下函数:

def riemannSum(a, b, n):
    dx = (b - a) / n
    s = 0.0
    x = a
    for i in range(n): 
        s += pd[x]
        x += dx
    return s * dx          
print(riemannSum(950.0, 1612.0, 10000))
print(riemannSum(0.0, 1612.0, 100000))
在威布尔的例子中,它给了我

>> 0.272502150549
>> 18.2860384829
在KDE的情况下,我得到

>> 0.448450460469
>> 18.2796021034
这显然是错误的。取整件事情的积分应该是1,18.2+是很遥远的

我对这些密度函数的假设是错误的吗?还是我在黎曼和函数中犯了一些错误

威布尔分布有一个非常“不容易实现”的积分

有非常好的定义CDF,所以实现integral几乎是一个线性过程(好的,为了清晰起见,将它设为两个)


当然,还有
ss.weibull\u min.cdf(x_grid,p[0],p[1],p[2])
如果你想从标准库中挑选,我知道有一个公认的答案对你有用,但我在寻找如何计算概率密度的黎曼和时偶然发现了这个问题,其他人也可能会这样做,所以我会尝试一下

基本上,我认为您有一个(现在的)旧版本的numpy,它允许浮点索引,并且您的
pd
变量指向一个从pdf中提取的值数组,该数组对应于xgrid中的值。现在,当您尝试使用浮点索引时,numpy中会出现错误,但由于您没有这样做,因此您正在访问与该索引对应的网格值处的pdf值。你需要做的是用你想在黎曼和中使用的新值计算pdf

我编辑了问题中的代码,创建了一个计算pdf积分的方法

def riemannSum(a, b, n):
     dx = (b-a)/n
     s = 0.0
     x = 0
     pd = weibull_min.pdf(np.linspace(a, b, n), p[0], p[1], p[2])
     for i in range(n):
         s += pd[x]
         x += 1
     return s*dx

下面还可以使用Riemann实现(它使用Java而不是Python)对不起

导入静态java.lang.Math.exp;
导入静态java.lang.Math.pow;
导入java.util.Optional;
导入java.util.function.BiFunction;
导入java.util.function.BinaryOperator;
导入java.util.function.function;
导入java.util.stream.IntStream;
公共类微博客PDF
{
公共接口Riemann扩展双函数{}
公共静态void main(字符串参数[])
{
int N=100000;
黎曼s=(f,n)->(a,b)->
IntStream.range(0,n)。
.mapToDouble(i->f.apply(a+i*((b-a)/n))*((b-a)/n)).sum();
双k=1.5;
可选威布尔=
可选。of(s.apply(x->k*pow(x,k-1)*exp(-pow(x,k)),N)。apply(0.01612.0));
weibull.ifPresent(System.out::println);//打印0.9993617886716168
}
}

仔细看看这个和你的Riemann求和代码:数值计算积分是一个很好的问题,但是如果你的目标是计算尾部概率,那么Weibull分布的Scipy类已经有了一个
cdf
方法。谢谢!真不敢相信我怎么会忘记cdf/pdf的关系。陷入了近似积分的有趣挑战。我很幸运,我的大学成绩一旦设定就不能降低,否则我的数学统计老师会非常生气。提问者想要的是
python
而不是
java
。请更改它。我认为我的答案很重要,即使它不能回答Python中的问题,因为它显示了如何使用高阶函数从头开始实现黎曼和,以及如何将Weibull PDF(概率密度函数)作为一阶函数传递。它可能会帮助其他希望了解如何在不使用外部库和Java函数编程的情况下解决此问题的开发人员。@JoseLuisSotoPosada您的实现不是以非Java程序员可以轻松阅读的方式完成的。
def riemannSum(a, b, n):
     dx = (b-a)/n
     s = 0.0
     x = 0
     pd = weibull_min.pdf(np.linspace(a, b, n), p[0], p[1], p[2])
     for i in range(n):
         s += pd[x]
         x += 1
     return s*dx
import static java.lang.Math.exp;
import static java.lang.Math.pow;

import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.IntStream;

public class WeibullPDF
{
    public interface Riemann extends BiFunction<Function<Double, Double>, Integer, 
    BinaryOperator<Double>>     { }

    public static void main(String args[])
    {
        int N=100000;
        Riemann s = (f, n) -> (a, b) -> 
        IntStream.range(0, n).
        .mapToDouble(i->f.apply(a+i*((b-a)/n))*((b-a)/n)).sum();
        double k=1.5;
        Optional<Double> weibull = 
        Optional.of(s.apply(x->k*pow(x,k-1)*exp(-pow(x,k)),N).apply(0.0,1612.0));
        weibull.ifPresent(System.out::println); //prints 0.9993617886716168
    }
}