python - 直方图和高斯拟合

标签 python numpy matplotlib gaussian data-fitting

我的长脚本有问题,我希望在那里得到答案。 我有一个二维直方图,我想用高斯拟合它。但是,我想删除 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 之间有很多噪声,而不是我想要删除的噪声以获得良好的拟合。

希望我很清楚,

谢谢!

最佳答案

您将掩码与掩码数据混淆了。

data = np.array([1,2,3])
mask = data > 2
print(mask)
# array([False, False,  True], dtype=bool)

然后你制作这些 bool 值的直方图:但是 True被解释为1False0

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

print(data[mask])
# array([3])

所以在你的情况下,如果你只想保留那些高于 0.3 的值,你需要这样做:

# list_2 = list > 0.3
list_2 = list[list > 0.3] 

但我建议不要使用list作为变量名,因为有 built-in class同名。更改后的线条,直方图看起来更像:

enter image description here

关于python - 直方图和高斯拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36085716/

相关文章:

python - pickle 后文件大小急剧增加

python - 将 pickles 读取和写入编码流

python - 检测对 numpy 数组的更改

python - func (1) 返回的数组与 Python 中的大小不匹配

python - 如何根据条件删除包含 numpy 数组的列表中的行?

python - Matplotlib 和 django 模板

python时间序列将各个工作日绘制为线

python - 当键嵌入列表时从列表创建字典

python - 使用枕头的图像处理代码有问题吗?

python - 模块中的条件导入