进行Kolmogorov-Smirnov测试是否合身。
这将针对给定的分布G(x)对观察到的随机变量的分布F(x)进行测试。在原假设下,两个分布相同,F(x)= G(x)。替代假设可以是“ two-sided”(默认值),‘less’或‘greater’。 KS测试仅对连续分布有效。
参数:
rvs:str, array_like, 或 callable如果是字符串,则应该是其中的分布名称scipy.stats。如果是数组,则它应该是一维随机变量观测值的数组。如果是可调用的,它应该是生成随机变量的函数;必须具有关键字参数大小。
cdf:str 或 callable如果是字符串,则应该是其中的分布名称scipy.stats。如果rvs是字符串,则cdf可以为False或与rvs相同。如果是可调用的,则该可调用的用于计算cdf。
args:tuple, sequence, 可选参数分发参数,如果rvs或cdf是字符串,则使用。
N:int, 可选参数如果rvs是字符串或可调用的样本大小。默认值为20。
alternative:{‘two-sided’, ‘less’, ‘greater’}, 可选参数定义替代假设。提供以下选项(默认为“ two-sided”):
‘two-sided’
‘less’:one-sided, see explanation in Notes
‘greater’:one-sided, see explanation in Notes
mode:{‘approx’, ‘asymp’}, 可选参数定义用于计算p-value的分布。以下选项可用(默认值为‘approx’):
‘approx’:use approximation to exact distribution of test statistic
‘asymp’:use asymptotic distribution of test statistic
返回值:
statistic:浮动KS测试统计信息,D,D +或D-。
pvalue:浮动One-tailed或two-tailed p-value。
注意:
在one-sided检验中,替代方案是随机变量的经验累积分布函数比假设的累积分布函数G(x)为“less”或“greater”,F(x)<=G(x),分别。F(x)>=G(x)。
例子:
>>> from scipy import stats
>>> x = np.linspace(-15, 15, 9)
>>> stats.kstest(x, 'norm')
(0.44435602715924361, 0.038850142705171065)
>>> np.random.seed(987654321) # set random seed to get the same result
>>> stats.kstest('norm', False, N=100)
(0.058352892479417884, 0.88531190944151261)
以上各行等效于:
>>> np.random.seed(987654321)
>>> stats.kstest(stats.norm.rvs(size=100), 'norm')
(0.058352892479417884, 0.88531190944151261)
根据one-sided替代假设进行检验
将分布转移到更大的值,以便cdf_dgp(x) < norm.cdf(x):
>>> np.random.seed(987654321)
>>> x = stats.norm.rvs(loc=0.2, size=100)
>>> stats.kstest(x,'norm', alternative = 'less')
(0.12464329735846891, 0.040989164077641749)
拒绝替代假设的均等分布:较少
>>> stats.kstest(x,'norm', alternative = 'greater')
(0.0072115233216311081, 0.98531158590396395)
不要拒绝其他假设的均等分布:更大
>>> stats.kstest(x,'norm', mode='asymp')
(0.12464329735846891, 0.08944488871182088)
针对正态分布测试t个分布的随机变量
自由度为100时,t分布看起来接近正态分布,并且K-S检验不能拒绝样本来自正态分布的假设:
>>> np.random.seed(987654321)
>>> stats.kstest(stats.t.rvs(100,size=100),'norm')
(0.07929165471257, 0.67630062862479168)
在3个自由度的情况下,t分布看起来与正态分布完全不同,因此我们可以拒绝以下假设:样本来自10%水平的正态分布:
>>> np.random.seed(987654321)
>>> stats.kstest(stats.t.rvs(3,size=100),'norm')
(0.131016895759829, 0.058826222555312224)