【问题标题】:Can I pass a pretrained pdf function into seaborn.distplot?我可以将预训练的 pdf 函数传递给 seaborn.distplot 吗?
【发布时间】:2019-11-08 21:51:45
【问题描述】:

我知道您可以使用 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:'function'对象没有属性'fit' ^ 不能采用预训练模型。

方法 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() got an unexpected keyword argument 'floc' ^ 很明显我没有正确传递变量,但我不知道如何。

如果需要,这里是 Seaborn 源代码的链接:https://github.com/mwaskom/seaborn/blob/master/seaborn/distributions.py

【问题讨论】:

  • “火车”这个词对于统计拟合来说可能有点脱离上下文?如果没有这个概念,你能描述问题吗?是不是你想修复一个参数而只适合另一个?
  • @ImportanceOfBeingErnest - 是的,这是正确的。我希望能够修复训练参数。 flocf0

标签: python scipy seaborn


【解决方案1】:

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

但是,您似乎可以通过提供一个提供 fit()pdf() 方法的对象并修改此对象中的参数来欺骗 seaborn。

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多