- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组实验值和一个概率密度函数,据说可以描述它们的分布:
def bekkers(x, a, m, d):
p = a*np.exp((-1*(x**(1/3) - m)**2)/(2*d**2))*x**(-2/3)
return(p)
我使用 scipy.optimize.curve_fit 估计了函数的参数,现在我需要以某种方式测试拟合优度。我发现了一个 scipy.stats.kstest 函数,它可以完全满足我的需要,但它需要一个连续的分布函数。我如何处理我的任务?
最佳答案
注意:我不确定你可能的 x 值范围是多少,以及你对 a、m 和 d 的估计是多少,所以我尽量让这些尽可能开放。
KS 测试的 CDF 指的是累积 分布,而不是连续 分布函数(您已经得到)。我们将为此构建一个函数,由于我不确定您提供的方程的积分是否存在封闭形式,我们将使用 scipy.integrate 来完成。
为了将它与其他 numpy/scipy 工具一起使用,我们希望它接收并返回一个数组(可能有更漂亮的方法来做到这一点,但下面的方法仍然有效)。另请注意,您必须对 cdf 进行归一化,因为至少对于我选择的值和范围,整个可能值范围内的积分不等于 1。这是它的外观喜欢:
def bekkers_cdf(x,a,m,d,range_start,range_end):
values = []
for value in x:
integral = integrate.quad(lambda k: bekkers(k,a,m,d),range_start,value)[0]
normalized = integral/integrate.quad(lambda k: bekkers(k,a,m,d),range_start,range_end)[0]
values.append(normalized)
return np.array(values)
一旦我们有了这个,我们现在可以评估我们的 ks.test(使用我为范围、a、m 和 d 组成的一些值):
my_start,my_end = 1,10
my_a,my_m,my_d = 1,1,1
my_data = [1.5,1.6,1.8,2.1,2.2,3.3,4,6,8,9]
stats.kstest(my_data,lambda x: bekkers_cdf(x,my_a,my_m,my_d,my_start,my_end))
返回:
(0.17609125905568074, 0.9157727421346824)
第一个值是统计数据,第二个是 p 值。有了如此高的 p 值,我们绝对不能拒绝该数据来自该分布。
代码摘要:
import numpy as np
import scipy as sp
from scipy import integrate,stats
def bekkers(x, a, m, d):
p = a*np.exp((-1*(x**(1/3) - m)**2)/(2*d**2))*x**(-2/3)
return(p)
def bekkers_cdf(x,a,m,d,range_start,range_end):
values = []
for value in x:
integral = integrate.quad(lambda k: bekkers(k,a,m,d),range_start,value)[0]
normalized = integral/integrate.quad(lambda k: bekkers(k,a,m,d),range_start,range_end)[0]
values.append(normalized)
return np.array(values)
my_start = 1
my_end = 10
my_a,my_m,my_d = 1,1,1
my_data = [1.5,1.6,1.8,2.1,2.2,3.3,4,6,8,9]
stats.kstest(my_data,lambda x: bekkers_cdf(x,my_a,my_m,my_d,my_start,my_end))
为了一点乐趣,我们可以看一下 ks-test 在看什么。为此,我们将我们数据的理论 cdf 与建议函数的 cdf 进行了比较。 (请注意,下面我在数据的 cdf 点中进行了硬编码,但这很容易以编程方式进行)使用 matplotlib 这是:
import matplotlib.pyplot as plt
xs = np.linspace(1, 10)
ys = bekkers_cdf(xs,my_a,my_m,my_d,my_start,my_end)
theoretical, =plt.plot(xs,ys,linewidth=2)
x2s = [1,1.5,1.6,1.8,2.1,2.2,3.3,4,6,8,9,10]
y2s = [0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1,1]
data, =plt.plot(x2s,y2s,linewidth=2)
plt.legend([theoretical,data],['theoretical','data'])
产生:
我们看到数据的 cdf 与建议分布所建议的 cdf 相似,因此我们的测试没有拒绝 null 且样本数据来自该分布是有道理的。
关于python - 如何在 python 中对自定义概率密度函数执行 Kolmogorov-Smirnov 拟合优度检验?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26143499/
我很难让 ks.test 使用卡方分布式数据: > chi10 ks.test(chi10, dchisq, df=10) One-sample Kolmogorov-Smirnov tes
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我说的是用 python 公式检索这个表媒体的值 https://www.soest.hawaii.edu/GG/FACULTY/ITO/GG413/K_S_Table_one_Sample.pdf
假设我们有两个样本 data1 和 data2 以及它们各自的权重 weight1 和 weight2 并且我们想计算两个加权样本之间的 Kolmogorov-Smirnov 统计量。 我们在 pyt
我正在尝试为我的数据获得最佳分布。试衣完成如下图所示,但我需要测量,以选择最佳型号。我将拟合优度与卡方值进行比较,并使用 Kolmogorov-Smirnov (KS) 检验检验观察分布和拟合分布之间
我使用以下Python代码向学生演示随机变量的生成: import numpy as np import scipy.stats as stats def lcg(n, x0, M=2**32, a=
我正在尝试用 Java 运行 Smirnov 测试,以查看两组数据是否来自同一分布。但是,我收到“找不到符号”错误。如何“构建”Smirnov 测试以免出现此错误? import java.io.*;
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
在进行重要性抽样实验时,我模拟了 Kolmogorov-Smirnov 距离的值 $$ D_n =\max_x |\hat{F}_n(x)-F(x)| $$ 其中 $n$ 是原始重要性样本的大小,我想
柯尔莫哥洛夫-斯米尔诺夫统计量定义为经验累积分布函数与假设累积分布函数之间的最大距离。我认为,与其看数字,不如使用图表来找出最大差异。 我知道如何绘制经验分布函数 p1<-qplot(rnorm(30
我对 R 中的 ks 函数有疑问。我有一个拉普拉斯分布: ldes <- function(y, a) { if(y < 0.5) 1/a*log(2*y, 2) else 1/a*log(
我在 Spark 中有两组数据(我们称它们为 d1、d2)。我想执行两个样本柯尔莫哥洛夫-斯米尔诺夫检验,以测试它们的底层总体分布函数是否不同。 MLLib 的 Statistics.kolmogor
我设计了 3000 个实验,因此在一个实验中有 4 组(治疗组),每组有 50 个人(受试者)。对于每个实验,我都会做一个标准的单向方差分析,并证明它们的 p.values 在零假设下是否具有单一概率
我有一组实验值和一个概率密度函数,据说可以描述它们的分布: def bekkers(x, a, m, d): p = a*np.exp((-1*(x**(1/3) - m)**2)/(2*d*
我正在尝试测试值列表是否均匀分布。我知道 Kolmogorov-Smirnov 检验是适合运行的检验。但是,我的结果对我来说没有任何意义。 在下面的代码中,我创建了两个值列表,x 是均匀分布的,y 是
我有一组数据并通过对数正态分布拟合相应的直方图。我首先计算对数正态函数的最佳参数,然后绘制直方图和对数正态函数。这给出了很好的结果: import scipy as sp import numpy a
我正在尝试在 Python 3 中执行两个样本的 KS 测试,以检测分布之间的任何显着差异。为了方便起见,让a和b我要比较的.csv数据列,我干脆跑了下面的“代码”: from scipy.stats
我有一个点数组,我想检查它们是否服从 a=15.5 和 b=7 的 Gamma 分布。我在努力 scipy.stats.kstest(myarray, gamma.pdf(15.5, 0.143))
我在 MATLAB 中使用 Kolmogorov-Smirnov 检验来确定数据矩阵每一列的正态性,然后再执行广义线性回归。一个示例数据向量是: data = [8126,3163,9129,5399
我在 Python spark-ml 中进行正态性测试,发现我认为是一个错误。 这是设置,我有一个标准化的数据集(范围 -1,到 1)。 当我做直方图时,我可以清楚地看到数据不正常: >>> pric
我是一名优秀的程序员,十分优秀!