我能把预先训练好的pdf函数传递到seaborn.distplot公司?

2024-09-24 22:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道你可以用seaborn.distplot公司将数据绘制成直方图并在其上叠加分布。我知道有一个参数允许您传入一个pdf函数来执行此操作。在源代码中,它看起来像是在内部调用fit()来进行训练。我想知道是否有一种方法可以预先训练模型,然后直接使用它。你知道吗

我尝试过使用lambda函数来表示我的分布,但是我不断地得到错误。 我还尝试将参数传递到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


Tags: 方法模型importtruedata参数statsseaborn
1条回答
网友
1楼 · 发布于 2024-09-24 22:32:57

原则上,不可能为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()

enter image description here

相关问题 更多 >