直方图和高斯拟合

时间:2016-03-18 13:30:18

标签: python numpy matplotlib gaussian data-fitting

我的长脚本有问题,我希望在那里得到答案。 我有一个2D直方图,我想用高斯拟合。但是,我想删除我的numpy数组中的大量数据,因为有噪音。这种噪音正在改变我的高斯,它会导致错误。

我用这个小例子重现我的脚本,以便更容易看出问题所在:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
import random

list = np.array([0.1,0.258,0.259,1.536,1,0.99,0.24,2.1,0.32,0.8,0.7569,0.963,0.6544,0.785])  # initial array

list_2 = list > 0.3         # New array, for exemple only values which are > 0.3



plt.figure(1)
plt.hist(list)
plt.xlim((min(list), max(list)))

mean = np.mean(list)
variance = np.var(list)
sigma = np.sqrt(variance)
x = np.linspace(min(list), max(list),100)
plt.plot(x,mlab.normpdf(x,mean,sigma))




plt.figure(2)
plt.hist(list_2)
plt.xlim((min(list_2), max(list_2)))

mean2 = np.mean(list_2)
variance2 = np.var(list_2)
sigma2 = np.sqrt(variance2)
x2 = np.linspace(min(list_2), max(list_2),100)
plt.plot(x2,mlab.normpdf(x2,mean2,sigma2))

plt.show()

但是,当我绘制它时,我会得到这样的数字(它不是我想要的):

Initial list After condition

所以,我不知道为什么我失去了很多价值,甚至超过0.3。 这与我的原始脚本存在同样的问题,我的值范围介于0和2之间,噪音很大,介于0到0.1之间,而不是为了获得良好的拟合而删除。

我很清楚,

谢谢!

2 个答案:

答案 0 :(得分:3)

您将掩码与屏蔽数据混淆。

index.html

然后你制作这些布尔值的直方图:但<script>被解释为data = np.array([1,2,3]) mask = data > 2 print(mask) # array([False, False, True], dtype=bool) True被解释为1

你想要的是在绘制直方图之前应用蒙版:

False

因此,在您的情况下,如果您只想保留那些高于0.3的值,则需要执行以下操作:

0

但我建议不要使用print(data[mask]) # array([3]) 作为变量名,因为built-in class具有相同的名称。通过更改的直线,直方图看起来更像:

enter image description here

答案 1 :(得分:2)

@ MSeifert的答案已经解决了你的问题,以适应你的数据的单变量高斯。但是,您在问题中显示的直方图无法使用单个高斯模型正确建模(如@MSeifert节目所示)。

对于您的问题可能是多余的,但您可以通过将核密度估计值或多变量高斯(或高斯混合)拟合到数据中来获得更好的可视化(和建模属性)。

使用seaborn执行此操作的快速示例:

import seaborn as sns

list_2 = list_1[list_1 > 0.3]

plt.figure()
sns.distplot(list_2, kde=True, rug=True)
plt.show()

enter image description here

注意list重命名为list_1。你永远不应该在python中隐藏数据类型。