我有一个格式为
的数据集频率,方向,归一化功率谱密度,扩展,偏度,峰度
我能够使用skew normal distribution in scipy中最顶层答案的代码可视化特定记录的分布,但我不确定如何将分布值应用于分布?
from scipy import linspace
from scipy import pi,sqrt,exp
from scipy.special import erf
from pylab import plot,show
def pdf(factor, x):
return (100*factor)/sqrt(2*pi) * exp(-x**2/2)
def cdf(x):
return (1 + erf(x/sqrt(2))) / 2
def skew(x,e=0,w=1,a=0, norm_psd=1):
t = (x-e) / w
return 2 / w * pdf(norm_psd, t) * cdf(a*t)
n = 540
e = 341.9 # direction
w = 59.3 # spread
a = 3.3 # skew
k = 4.27 # kurtosis
n_psd = 0.5 # normalised power spectral density
x = linspace(-90, 450, n)
p = skew(x, e, w, a, n_psd)
print max(p)
plot(x,p)
show()
编辑:我从标题中删除了偏斜法线,因为我认为实际上不可能将峰度值应用于上述分布,我认为需要不同的分布,因为方向是涉及从循环统计分布可能更合适?
由于下面的答案我可以使用下面代码中演示的pdf_mvsk函数来应用峰度,不幸的是我的偏斜值会导致负y值,但答案满足了我的问题。
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.sandbox.distributions.extras as extras
pdffunc = extras.pdf_mvsk([341.9, 59.3, 3.3, 4.27])
range = np.arange(0, 360, 0.1)
plt.plot(range, pdffunc(range))
plt.show()
答案 0 :(得分:4)
如果你有平均值,标准差,倾斜度和峰度,那么你可以使用Gram-Charlier扩展来建立近似正态的分布。
我前一段时间研究过这个问题,scipy.stats的功能出错并被删除了。
我不记得这是什么状态,因为很久以前我把它放在statsmodels沙盒中 http://statsmodels.sourceforge.net/devel/generated/statsmodels.sandbox.distributions.extras.pdf_mvsk.html#statsmodels.sandbox.distributions.extras.pdf_mvsk