scipy: Как мне использовать weibull_min.pdf? - PullRequest
0 голосов
/ 24 ноября 2018

Я считаю scipy weibull_min pdf неинтуитивной и сложной в использовании функцией.Я хочу создать Weibull PDF с масштабом = 30 и формы = 2,5.Вот как это должно выглядеть: enter image description hereenter image description here

Вот что я пробовал до сих пор:

import matplotlib.pyplot as plt
from scipy.stats import weibull_max, uniform
import numpy as np
aoas = np.linspace(0, 8, 1000)
speeds = np.linspace(1, 80, 1000)
plt.fill_between(speeds, speeds * 0, weibull_max.pdf(speeds, 2.5, 30), facecolor='k')
plt.ylabel('Probability Density')
plt.savefig('speedDist.pdf')
plt.clf()

enter image description here

Конечно, мой код неверен.В документации говорится, что weibull_min ожидает pdf(x, c, loc=0, scale=1), где x - квантили, c - коэффициент формы, а scale - коэффициент масштабирования.Но когда я изменяю свой код на weibull_max.pdf(speeds, 2.5, 0, 30), выходной pdf состоит только из нулевых значений.Итак, я в замешательстве.Как мне сгенерировать желаемый Weibull PDF?

1 Ответ

0 голосов
/ 24 ноября 2018

В вашем коде есть две проблемы.

  • weibull_min и weibull_max - это не одно и то же распределение.Вы ссылаетесь на weibull_min в названии и описании проблемы, но вы используете weibull_max в коде.Чтобы соответствовать отображаемому графику, используйте weibull_min.

  • Параметры метода pdf: (x, shape, loc, scale).Вы написали pdf(speeds, 2.5, 30), который присвоил 30 параметру loc.Вместо этого вы должны использовать pdf(speeds, 2.5, scale=30)

Вот вариант вашего сценария:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import weibull_min


speeds = np.linspace(0, 80, 1000)    
p = weibull_min.pdf(speeds, 2.5, scale=30)

plt.plot(speeds, p, 'b', linewidth=1)
plt.fill_between(speeds, speeds * 0, p, facecolor='b', alpha=0.1)
plt.ylabel('Probability Density')
plt.show()

Он генерирует этот график:

plot

...