我知道您可以使用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
答案 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()