首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy kstest,用于scipy对数正态分布

scipy kstest,用于scipy对数正态分布
EN

Stack Overflow用户
提问于 2018-08-18 05:18:02
回答 1查看 870关注 0票数 1

我正在尝试对一些数据和一些不同的发行版使用scipy的kstest。我对对数正态分布的数据进行了测试,结果感到困惑,所以我做了一个测试。

我通过对数正态的平均值和标准差(而不是scipys版本,其中loc是相应正态平均值的指数,s是相应正态的标准差)对对数正态分布进行参数化。在这里解释:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.lognorm.html

我已经编写了一个函数,该函数接受my参数,将它们转换为scipys参数,然后进行采样。这就是它:

代码语言:javascript
复制
def lognormal_samples(M_y, Sig_y):

    m_x = (2*math.log(M_y)) - (.5)*(math.log(math.pow(Sig_y,2) + math.pow(M_y,2)))
    scale = math.exp(m_x)

    sigma2 = -2 * math.log(M_y) + math.log(math.pow(Sig_y,2) + math.pow(M_y,2))
    s = math.sqrt(sigma2)

    result = stats.lognorm(s, scale=scale).rvs(size=10000)

    return result, s, scale

为了测试,我想看看ks统计量是否接近0,如果我将这些样本拟合到scipy.stats.lognormal中。这里我试着这样做:

代码语言:javascript
复制
def lognormal_test_of_ks_test():

samples, my_s, my_scale = lognormal_samples(1, .25)
ks = stats.kstest(samples, 'lognorm', args=[my_s, my_scale])[0]
print('ks: ', ks)

当我运行这个的时候,我得到了ks: 0.958038612187,它高得离谱。我的问题是,当我将[my_s,my_scale]传递给args时,它们实际上并没有传递给kstest中的sscale中的lognorm。如何将两个参数传递给kstest,以便它们真正参数化lognorm?我会把它想象成这样:

代码语言:javascript
复制
my_s = 's=' + str(my_s)
my_scale = 'scale=' + str(my_scale)
my_args = [my_s, my_scale]
ks = stats.kstest(samples, 'lognorm', args=my_args)[0]

但这也不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 05:57:11

kstest最终调用了lognorm.cdf,它根据doc接受以下参数

代码语言:javascript
复制
cdf(x, s, loc=0, scale=1)

所以你需要通过:

代码语言:javascript
复制
my_args = [my_s, 0, my_scale]
ks = stats.kstest(samples, 'lognorm', args=my_args)[0]

以下哪项输出:

代码语言:javascript
复制
ks:  0.007790356168134116
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51902996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档