Могу ли я передать предварительно подготовленную функцию PDF в seaborn.distplot? - PullRequest
2 голосов
/ 27 июня 2019

Мне известно, что вы можете использовать seaborn.distplot для отображения данных в виде гистограммы и наложения распределения поверх него.Мне известен параметр, который позволяет вам передать функцию pdf для этого.В исходном коде, похоже, что он внутренне вызывает fit () для обучения.Мне было интересно, есть ли способ предварительно обучить модель и просто использовать ее.

Я пытался использовать лямбда-функции, представляющие мое распределение, но я продолжал получать ошибки.Я также попытался передать параметры в seaborn.distplot, чтобы помочь обучению с нужными настройками, но это тоже не сработало.

Метод 1 - Использование лямбды для предварительно обученной модели:

import seaborn as sns
from scipy import stats

params = stats.exponweib.fit(data, floc=0, f0=1)
custom_weib = lambda x: stats.exponweib.pdf(x, *params)
sns.distplot(data, bins=bin_count, fit=custom_weib, norm_hist=True, kde=False, hist_kws={'log':True})

Я вижу это сообщение об ошибке: AttributeError: у объекта 'function' нет атрибута 'fit' ^ Он не может использовать предварительно обученную модель.

Метод 2 - Попытка передать параметры как часть метода подгонки. (Я не знаю, правильно ли я делаю это.)

import seaborn as sns
from scipy import stats

sns.distplot(data, bins=bin_count, norm_hist=True, kde=False, hist_kws=hist_kws, fit=stats.exponweib, floc=0, f0=1)

Я получаю это исключение: TypeError: distplot () получил неожиданный ключевой аргумент 'floc' ^ Очевидно, что я неправильно передаю переменные, но не знаю как.

Вот ссылка на исходный код Seaborn, если вам это нужно:https://github.com/mwaskom/seaborn/blob/master/seaborn/distributions.py

1 Ответ

1 голос
/ 27 июня 2019

В принципе, невозможно предоставить какие-либо параметры для fit. Это связано с строкой params = fit.fit(a) в исходном коде.

Тем не менее, похоже, что вы можете обмануть seaborn, предоставив объект, который предоставляет метод fit() и pdf(), и изменив аргументы в этом объекте.

import numpy as np
from scipy.stats import exponweib
import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(1, 1)

class MyDist():
    def __init__(self, **kw):
        self.dist = exponweib
        self.kw = kw

    def fit(self, data):
        return self.dist.fit(data, **self.kw)

    def pdf(self, data, *args, **kw):
        return self.dist.pdf(data, *args, **kw)


r = exponweib.rvs(3, 2, loc=0.3, scale=1.3, size=100000)

sns.distplot(r, fit=MyDist(floc=0.3, fscale=1.3), norm_hist=True, kde=False)


params = exponweib.fit(r, floc=0.3, fscale=1.3)
x = np.linspace(0.1, 4.1, 100)
ax.plot(x, exponweib.pdf(x, *params),
        'r-', lw=3, alpha=0.6)


plt.show()

enter image description here

...