从numpy直方图的概率密度值和区间获取原始数据数组
我的目的是通过概率密度和np.histogram函数的区间信息来计算原始数据数组。
举个例子:
import random
a = random.sample(xrange(100), 50)
n, bin = np.histogram(a,bins=100,range=(-10,10), normed=True)
我想从n和bin中得到一个原始数据数组。我用过np.digitize,但感觉这不是个合适的解决方案。
其实我最初的目的是从这个直方图中计算原始数据的偏度和峰度。所以,我尝试把n和bin转换成原始数据。如果能直接从直方图中得到偏度和峰度,那就太好了。
感谢用户3823992,我尝试使用scipy.stats.rv_discrete函数从bins和概率密度函数中获取偏度和峰度。 我编辑后的代码是:
a = random.sample(xrange(100), 50)
n, bin = np.histogram(a,bins=100,range=(-10,10), normed=True)
b2=bin[:-1]
print np.mean(a), np.var(a), sp.skew(a),sp.kurtosis(a)
dist = sp.rv_discrete(values=(b2,n))
print dist.stats(moments='mvsk')
然而,从np.mean(a)、np.var(a)、sp.skew(a)、sp.kurtosis(a)和dist.stats(moments='mvsk')得到的结果差别太大了。根据scipy.stats.rv_discrete的文档,'values'中的两个元组之一应该是整数点(在这个例子中是b2),而另一个的总和(在这个例子中是n)应该是1。
问题是我b2中的数字不是整数,而且'n'的总和也不是1。我把bin的宽度乘以n再试了一次,但还是不行。
任何想法或帮助都非常感谢。
祝好,
Hoonill
1 个回答
1
scipy.stats.rv_discrete
可以帮你解决问题。它会根据你的数据创建一个随机分布的类。这个类会有很多实用的方法。使用 .stats
方法,你可以得到前四个统计量。如果你不特别指定,它会返回均值(m
)和方差(v
)。
b2=bin[:-1]
print mean(a), var(a), scipy.stats.skew(a)
dist = scipy.stats.rv_discrete(values=(b2,n))
print dist.stats(moments='mvsk')
上面的内容应该和你的代码兼容。只需要重新组织一下,利用输出结果即可。