我可以将预训练的pdf函数传递给seaborn.distplot吗?

时间:2019-06-26 22:00:26

标签: python scipy seaborn

我知道您可以使用seaborn.distplot将数据绘制为直方图,并在其上叠加一个分布。我知道有一个参数可以让您传递pdf函数。在源代码中,看起来它内部调用fit()进行训练。我想知道是否有一种方法可以预训练模型并使用它。

我尝试使用表示我的发行版的lambda函数,但始终出错。 我还尝试将参数传递到seaborn.distplot中,以帮助训练所需的设置,但是那也不起作用。

方法1-对预训练模型使用lambda:

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:“功能”对象没有属性“适合” ^不能采用预先训练的模型。

方法2-尝试将参数作为fit方法的一部分传递。(我不知道我是否正确执行了此操作。)

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 个答案:

答案 0 :(得分:1)

原则上,不可能为seaborn的fit提供任何参数。这是由于源代码中的line params = fit.fit(a)

但是,您似乎可以通过提供一个提供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