我有2个数据阵列,一个描述我想要绘制的数据,第二个描述该数据的频率或权重。
我使用
创建直方图import numpy as np
import matplotlib.pyplot as plt
data = [7., 8.2, 9.6, 11.3, 13.2, 15.5, 18.1, 21.2, 24.9, 29.1, 34.1, 40.0]
freq = [2., 4.1, 4.5, 3.2, 2.7, 2.1, 1.3, 1., 0.9, 0., 0., 0.]
h = np.histogram(data, weights = freq, bins = data)
f = plt.hist(data, weights = freq, bins = data)
我现在想要找到结果直方图的均值,标准差,偏度和峰度,但由于数据是“加权”或预先计数的,我似乎无法使scipy.stats.describe函数起作用。有什么想法吗?
我应该说清楚,我已经尝试过scipy.stats.describe但似乎无法找到一个允许我做我想做的重量论证。我真的不知道有哪些工具可以帮助解决这个问题,谷歌搜索没有返回很多有用的结果(虽然我承认我可能会搜索错误的东西)。
为了让事情变得更复杂,看到你的老鹰会注意到数据在日志空间中均匀分布,而不是真实的空间。因此,如果您的方法涉及高斯拟合,您可能需要牢记这一点......
答案 0 :(得分:0)
问题很简单,你可以在这里编写自己的函数,并且不需要scipy.stats中的函数。基本上你在这里给出的是分布函数,并且想要计算期望值。这由一个简单的积分给出。解决方案的一个例子是
def integrator(f,data,freq):
diffs = np.roll(data,-1)-data
return (f(data[:-1])*freq[:-1]*diffs[:-1]).sum()
freq_norm = freq/integrator(lambda x:1,data,freq)
exp_x = integrator(lambda x:x,data,freq_norm)
exp_x2 = integrator(lambda x:x**2,data,freq_norm)
exp_x4 = integrator(lambda x:x**4,data,freq_norm)
mean = exp_x
kurt = integrator(lambda x: ((x-exp_x)/std)**4,data,freq_norm)
skew = integrator(lambda x: ((x-exp_x)/std)**3,data,freq_norm)
答案 1 :(得分:0)
您可以使用 scipy.stats.rv_histogram 生成一个随机变量,其分布由 numpy.histogram 的输出给出,然后在其上使用 stats 方法得到您想要的。
import numpy as np
import scipy.stats as stats
data = [7., 8.2, 9.6, 11.3, 13.2, 15.5, 18.1, 21.2, 24.9, 29.1, 34.1, 40.0]
freq = [2., 4.1, 4.5, 3.2, 2.7, 2.1, 1.3, 1., 0.9, 0., 0., 0.]
rv = stats.rv_histogram(np.histogram(data, weights=freq))
您还可以使用 rv.moments(n)
直接获取(非中心)时刻,其中 n
是您感兴趣的顺序。
均值、变量、偏斜、kurt = rv.stats(moments='mvsk')
我希望这可以帮助某人!