Python 生成峰度大于3的随机正态分布

Python 生成峰度大于3的随机正态分布,python,numpy,statistics,normal-distribution,Python,Numpy,Statistics,Normal Distribution,正态分布的峰度为3。随着分布中异常值的增加,尾部变得“胖”,峰度增加超过3 如何在峰度大于3(最好是5-7)的两个数字之间生成随机分布 导入 import numpy as np import scipy.stats import kurtosis 在0.01-0.10之间随机均匀 # Random Uniform Distribution runif = np.random.uniform(0.01, 0.10, 10000) kurtosis(runif, fisher=False)

正态分布的峰度为3。随着分布中异常值的增加,尾部变得“胖”,峰度增加超过3

如何在峰度大于3(最好是5-7)的两个数字之间生成随机分布

导入

import numpy as np
import scipy.stats import kurtosis
在0.01-0.10之间随机均匀

# Random Uniform Distribution
runif = np.random.uniform(0.01, 0.10, 10000)

kurtosis(runif, fisher=False)
lower = 0.01
upper = 0.10
mu = (upper)/2
sigma = 0.01
N = 10000
retstats = scipy.stats.truncnorm.rvs((lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)

mean = .05
stdev = .01  # 99.73% chance the sample will fall in your desired range

values = [gauss(mean, stdev) for _ in range(10000)]

kurtosis(values, fisher=False)
1.812489101330156

0.01-0.10之间的随机正态分布

# Random Uniform Distribution
runif = np.random.uniform(0.01, 0.10, 10000)

kurtosis(runif, fisher=False)
lower = 0.01
upper = 0.10
mu = (upper)/2
sigma = 0.01
N = 10000
retstats = scipy.stats.truncnorm.rvs((lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)

mean = .05
stdev = .01  # 99.73% chance the sample will fall in your desired range

values = [gauss(mean, stdev) for _ in range(10000)]

kurtosis(values, fisher=False)
3.015004351756201

随机正常,肥尾在0.01-0.10之间

# Random Uniform Distribution
runif = np.random.uniform(0.01, 0.10, 10000)

kurtosis(runif, fisher=False)
lower = 0.01
upper = 0.10
mu = (upper)/2
sigma = 0.01
N = 10000
retstats = scipy.stats.truncnorm.rvs((lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)

mean = .05
stdev = .01  # 99.73% chance the sample will fall in your desired range

values = [gauss(mean, stdev) for _ in range(10000)]

kurtosis(values, fisher=False)

由于峰度不是正态分布函数的参数之一,因此必须使用另一种方法生成近似正态分布的函数。事情变得复杂了。看看这个:

上面的链接给出了使用R(sigh)代码的示例,但我认为它足够简单,可以让您用Python编写等效代码。这是我所知道的几种扩展(即功能分层)之一,它们允许您实现这一点


不幸的是,据我所知,没有简单的解决方案。

因为峰度不是正态分布函数的参数之一,所以必须使用另一种方法生成近似正态分布的函数。事情变得复杂了。看看这个:

上面的链接给出了使用R(sigh)代码的示例,但我认为它足够简单,可以让您用Python编写等效代码。这是我所知道的几种扩展(即功能分层)之一,它们允许您实现这一点


不幸的是,据我所知,没有简单的解决方案。

正态分布的峰度总是为3。均匀分布的峰度为9/5。长尾分布的峰度大于3。例如,拉普拉斯的峰度为6。[请注意,这些分布通常是根据超额峰度定义的,即等于实际峰度减3.]见下表:

然而,通过切断尾巴,你只能减少峰度。通过切尾,不可能产生峰度大于3的正态分布。为了生成具有有限范围和高峰度的分布,您需要确保切割对尾部的影响最小,并从长尾(非正态)分布开始。通俗地说,您需要有一个非常尖锐的分布。我用拉普拉斯和一个小的指数衰减参数生成了下面的一个

将numpy导入为np
从scipy.stats导入峰度
最小范围=0.01
最大范围=0.10
中点=(最大范围+最小范围)/2
样本=10000
def过滤器尾部(x):

返回x[(x>=min_range)&(x正态分布的峰度始终为3。均匀分布的峰度为9/5。长尾分布的峰度高于3。例如,拉普拉斯分布的峰度为6。[请注意,这些分布通常是根据超额峰度定义的,即等于实际峰度减3.]见下表:

但是,通过切断尾部,只能降低峰度。通过切断尾部,不可能生成峰度高于3的正态分布。为了生成具有有限范围和高峰度的分布,需要确保切断对尾部的影响最小,并从长尾开始(非正态)分布。通俗地说,你需要有一个非常尖尖的分布。我用拉普拉斯和一个小的指数衰减参数生成了下面的分布

将numpy导入为np
从scipy.stats导入峰度
最小范围=0.01
最大范围=0.10
中点=(最大范围+最小范围)/2
样本=10000
def过滤器尾部(x):

返回x[(x>=最小范围)&(x谢谢!这太完美了!谢谢!这太完美了!