M H*_*ley 5 python statistics numpy scipy
所以,我注意到,有没有实施歪斜广义t分布在scipy。将这个分布拟合到我拥有的一些数据对我来说很有用。不幸的fit是,在这种情况下对我来说似乎不起作用。为了进一步解释,我已经像这样实现了
import numpy as np
import pandas as pd
import scipy.stats as st
from scipy.special import beta
class sgt(st.rv_continuous):
def _pdf(self, x, mu, sigma, lam, p, q):
v = q ** (-1 / p) * \
((3 * lam ** 2 + 1) * (
beta(3 / p, q - 2 / p) / beta(1 / p, q)) - 4 * lam ** 2 *
(beta(2 / p, q - 1 / p) / beta(1 / p, q)) ** 2) ** (-1 / 2)
m = 2 * v * sigma * lam * q ** (1 / p) * beta(2 / p, q - 1 / p) / beta(
1 / p, q)
fx = p / (2 * v * sigma * q ** (1 / p) * beta(1 / p, q) * (
abs(x - mu + m) ** p / (q * (v * sigma) ** p) * (
lam * np.sign(x - mu + m) + 1) ** p + 1) ** (
1 / p + q))
return fx
def _argcheck(self, mu, sigma, lam, p, q):
s = sigma > 0
l = -1 < lam < 1
p_bool = p > 0
q_bool = q > 0
all_bool = s & l & p_bool & q_bool
return all_bool
Run Code Online (Sandbox Code Playgroud)
这一切都很好,我可以用给定的参数生成随机变量,没问题。在_argcheck被要求作为一个简单的正PARAMS只检查不适合。
sgt_inst = sgt(name='sgt')
vars = sgt_inst.rvs(mu=1, sigma=3, lam = -0.1, p = 2, q = 50, size = 100)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试fit这些参数时,出现错误
sgt_inst.fit(vars)
Run Code Online (Sandbox Code Playgroud)
运行时警告:在减去
numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol) 中遇到无效值:
它只是返回
我觉得奇怪的是,当我实现文档中所示的示例自定义高斯分布时,运行该fit方法没有问题。
有任何想法吗?
小智 4
正如fit文档字符串所说,
拟合的起始估计由输入参数给出;对于未提供起始估计的任何参数,
self._fitstart(data)调用 来生成此类参数。
调用sgt_inst._fitstart(data)返回(1.0, 1.0, 1.0, 1.0, 1.0, 0, 1)(前五个是形状参数,后两个是loc和scale)。看起来_fitstart并不是一个复杂的过程。参数l不符合您的 argcheck 要求。
结论:为 提供您自己的起始参数fit,例如,
sgt_inst.fit(data, 0.5, 0.5, -0.5, 2, 10)
Run Code Online (Sandbox Code Playgroud)
返回(1.4587093459289049, 5.471769032259468, -0.02391466905874927, 7.07289326147152
4, 0.741434497805832, -0.07012808188413872, 0.5308181287869771)我的随机数据。