从数据确定威布尔参数

lar*_*ual 6 python csv numpy scipy weibull

我想确定我的数据的威布尔参数(即形状和比例)。

0.022988506
0.114942529
0.218390805
0.114942529
0.149425287
0.114942529
0.068965517
0.068965517
0.034482759
0.022988506
0.022988506
0.022988506
0.022988506
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个答案提出的内容,并且我使用的是 Python 3.4。

import scipy.stats as s
import numpy as np
from scipy import stats


def weib(x,n,a):
    return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)


data = np.loadtxt("data1.csv")
print(data)
(loc, scale) = s.exponweib.fit_loc_scale(data, 1, 1)
print('loc is: ',loc, '\n scale is: ', scale)
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出:

0.022988506
0.114942529
0.218390805
0.114942529
0.149425287
0.114942529
0.068965517
0.068965517
0.034482759
0.022988506
0.022988506
0.022988506
0.022988506
Run Code Online (Sandbox Code Playgroud)

我假设我的 csv 文件中的数据被读取为 x 输入值,而不是 Weibull 函数的 y 值。当我使用 bin 添加第二列(或行)时,会出现字符串值无法转换为浮点数的错误。

我需要如何修改我的 csv 文件才能将其中的数据用作 Weibull 函数的 y 值?

我想我的问题可能是我不明白这一行:

import scipy.stats as s
import numpy as np
from scipy import stats


def weib(x,n,a):
    return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)


data = np.loadtxt("data1.csv")
print(data)
(loc, scale) = s.exponweib.fit_loc_scale(data, 1, 1)
print('loc is: ',loc, '\n scale is: ', scale)
Run Code Online (Sandbox Code Playgroud)

1, 1这里代表什么?参数不应为负数。

War*_*ser 8

它看起来像你想使用fit的方法scipy.stats.weibull_min(这是一个别名scipy.stats.frechet_r)。使用参数floc=0将位置限制为 0。

In [9]: data
Out[9]: 
array([ 0.02298851,  0.11494253,  0.2183908 ,  0.11494253,  0.14942529,
        0.11494253,  0.06896552,  0.06896552,  0.03448276,  0.02298851,
        0.02298851,  0.02298851,  0.02298851])

In [10]: from scipy.stats import weibull_min

In [11]: shape, loc, scale = weibull_min.fit(data, floc=0)

In [12]: shape
Out[12]: 1.3419930069121602

In [13]: scale
Out[13]: 0.084273047253525968
Run Code Online (Sandbox Code Playgroud)