Python和科学计算认证群组  - 讨论区

标题:from scipy.stats import weibull_min

2011年01月11日 星期二 09:28

 
numargs = weibull_min . numargs
[ c ] = [ 0.9 ,] * numargs
rv = weibull_min ( c )


x = np . linspace ( 0 , np . minimum ( rv . dist . b , 3 ))
请问rv.dist.b是什么意思?

另外weibull_min.fit 我只想要两参数的weibull分布能不能实现呢?就是让loc一直为0。
如果用weibull_min.fit(data, c, loc=0, scale=1) 它会给我返回三个参数的估计值。

谢谢


2011年01月11日 星期二 18:34

随机变量的属性a表示其取值范围的最小值,b表示最大值。

如果你希望保持loc始终为0,那么得自己编写拟合程序,可以仿照fit方法,下面是完整程序,你可以试试看,有不明白之处的话再讨论。

from scipy.stats import weibull_min
from scipy.optimize import fmin
import numpy as np
import math

rv = weibull_min(0.9)
data = rv.rvs(size=1000)

print weibull_min.fit(data)

def nnlf(theta, x):
   c, scale = theta
   x = x/scale
   N = len(x)
   return weibull_min._nnlf(x, c) + N*math.log(scale)

print fmin(nnlf, (1.0, 1.0), args=(data,), disp=0)

2011年01月11日 星期二 19:01

RY老师,weibull_min._nnlf是什么啊?我怎么找不到。。。

我最后看了一下估计两参数weibull分布的文献,然后用最小二乘法来拟合的。明天可以试一下您的这种方法,看看结果差别大不大。

fmin这个什么“下山单纯形法”也是第一次听说。。。比较难理解

 

2011年01月11日 星期二 19:10

程序在这里:

C:\Python26\Lib\site-packages\scipy\stats\distributions.py

搜索weibull_min可以找到:

class frechet_r_gen(rv_continuous):

    def _pdf(self, x, c):

        return c*pow(x,c-1)*exp(-pow(x,c))

    def _cdf(self, x, c):

        return -expm1(-pow(x,c))

    def _ppf(self, q, c):

        return pow(-log1p(-q),1.0/c)

    def _munp(self, n, c):

        return special.gamma(1.0+n*1.0/c)

    def _entropy(self, c):

        return -_EULER / c - log(c) + _EULER + 1

frechet_r = frechet_r_gen(a=0.0,name='frechet_r',longname="A Frechet right",

                          shapes='c',extradoc="""

 

A Frechet (right) distribution (also called Weibull minimum)

 

frechet_r.pdf(x,c) = c*x**(c-1)*exp(-x**c)

for x > 0, c > 0.

"""

                          )

weibull_min = frechet_r_gen(a=0.0,name='weibull_min',

                            longname="A Weibull minimum",

                            shapes='c',extradoc="""

 

_nnlf在父类rv_continuous中,搜索一下就可以找到了。

2011年01月11日 星期二 19:26

了解了

2011年01月13日 星期四 09:31

我试了一下,和最小二乘法拟合出来的结果很一致,不过在拟合过程中有时会出现Warning: invalid value encountered in log,可能是参数的初始值设的不太好,应该用什么方法具体估计一下。

2011年01月13日 星期四 20:36

可能是log函数的自变量为负数了。

2011年01月14日 星期五 11:17

可能吧。如果直接输入math.log(-1.),就会直接报错,但在上面程序里面只会提出警告。不知道出现这种情况后它是怎么继续进行迭代的。。。

2011年01月14日 星期五 18:46

 weibull_min._nnlf(x, c)里有一个numpy.log函数,也许是它出现的警告。不过我在NumPy 1.5.1下测试了一下,

>>> np.seterr(all="warn")

>>> np.log(-1)

没有出现这个警告,不知道你用的是什么版本?

2011年01月14日 星期五 19:02

1.4的,那不管出没出现警告,np.log里面跟一个负数,都返回的是nan,它怎么继续进行的呢?可能这个问题扯得越来越远了,不过RY老师有空还是可以跟我讲讲

2011年01月14日 星期五 19:08

我猜测fmin发现结果是nan的话,就抛弃,从以前的某个最小点开始重新搜索。

2011年01月14日 星期五 19:15

哦,有可能。还有我觉得如果log 里面出现负数了,给一个警告挺好的啊

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号