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 © 2024
京ICP备05028076号