Как получить функцию распределения возможностей из Python Seaborn Displot - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу получить функцию распределения возможностей (PDF) для модели fit cruve, предлагаемой kde fit, в пределах seaborn.displot(), или когда у меня есть x=20, как я могу получить значение возможности на кривой?

import matplotlib.pyplot as plt 
import numpy as np
import seaborn as sns

x=np.array([33,42,31,36,36,33, 37 ,37, 28 ,36 ,32, 40 ,43 ,37, 33 ,40 ,41 ,44, 53 ,38, 32, 48, 51, 37 ,29, 41 ,30 ,29 ,28, 40 ,35 ,33 ,33 ,29, 27 ,33, 35, 34, 28 ,35, 39 ,37 ,31 ,33 ,32 ,39 ,24, 30, 29, 21, 28, 28, 29, 29 ,25, 34, 24, 28 ,25, 25 ,27, 18, 27, 27, 35, 26, 29, 29, 30])

sns.distplot(x)

enter image description here

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете получить данные (значения x и y), используемые для построения графика распределения.Из этого вы можете интерполировать любые значения между ними.

Если вы хотите получить вероятность, вы должны интегрировать pdf-данные и вычислить значение в диапазоне.

import numpy as np
import seaborn as sns
import scipy

x=np.array([33,42,31,36,36,33, 37 ,37, 28 ,36 ,32, 40 ,43 ,37, 33 ,40 ,41 ,44, 53 ,38, 32, 48, 51, 37 ,29, 41 ,30 ,29 ,28, 40 ,35 ,33 ,33 ,29, 27 ,33, 35, 34, 28 ,35, 39 ,37 ,31 ,33 ,32 ,39 ,24, 30, 29, 21, 28, 28, 29, 29 ,25, 34, 24, 28 ,25, 25 ,27, 18, 27, 27, 35, 26, 29, 29, 30])
ax = sns.distplot(x) 

#Value to estimate for
value = 20

#Get the data from the KDE line
xdata, ydata = ax.get_lines()[0].get_data()

#Find the closest point on the curve
idx = (np.abs(xdata-value)).argmin()
#Interpolate to get a better estimate
p = np.interp(value,xdata[idx:idx+2],ydata[idx:idx+2])
print('Point on PDF for X = {} is: {}'.format(value,p))

#Plot the line
ax.vlines(value, 0, p ,colors='r')

#Find the probability for an interval of one (e.g. between 20 and 21)
cdf = scipy.integrate.cumtrapz(ydata, xdata, dx=1, initial=0)
pr = cdf[value+1] - cdf[value]
print('Probability of X <{},{}> is: {}'.format(value,value+1,pr))

# Fill the area 
plt.fill_between(xdata,ydata, where = (xdata>=value) & (xdata<=value+1), color='g')

Выходные данные должны быть:

Point on PDF for X = 20 is: 0.007789463075158201
Probability of X <20,21> is: 0.0015438476906999374

Выходной график

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

Кажется, что нет прямого способа вернуть pdf-файл, подогнанный с помощью distplot, но вы можете получить данные строки pdf следующим образом и построить график, чтобы убедиться, что вы получите такой же подгонки

fig, axs = plt.subplots(1,2, figsize=(10,3))

x=np.array([33,42,31,36,36,33, 37 ,37, 28 ,36 ,32, 40 ,43 ,37, 33 ,40 ,41 ,44, 53 ,38, 32, 48, 51, 37 ,29, 41 ,30 ,29 ,28, 40 ,35 ,33 ,33 ,29, 27 ,33, 35, 34, 28 ,35, 39 ,37 ,31 ,33 ,32 ,39 ,24, 30, 29, 21, 28, 28, 29, 29 ,25, 34, 24, 28 ,25, 25 ,27, 18, 27, 27, 35, 26, 29, 29, 30])

ax1 = sns.distplot(x, ax=axs[0], label='KDE pdf')
fit = ax1.get_lines()[0].get_data() # Getting the data from the plotted line
xfit, yfit = fit[0], fit[1]
ax1.legend()

axs[1].plot(xfit, yfit, label='Extracted pdf')
axs[1].set_ylim(ax1.get_ylim())
plt.legend()

Подгонка не содержит точно x=20, но вы можете использовать некоторое значение допуска, чтобы получить точку, ближайшую к x=20

Выход

enter image description here

...