【问题标题】:Histogram and Gaussian fitting直方图和高斯拟合
【发布时间】:2016-07-05 06:52:39
【问题描述】:

我的长脚本有问题,我希望在那里得到答案。 我有一个二维直方图,我想用高斯拟合它。但是,我想删除我的 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()

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

所以,我不知道为什么我丢失了很多值,甚至超过 0.3。 我的原始脚本也存在同样的问题,我的值的范围在 0 到 2 之间,0 到 0.1 之间的噪音比我想要移除的噪声要好。

希望我很清楚,

谢谢!

【问题讨论】:

    标签: python numpy matplotlib gaussian data-fitting


    【解决方案1】:

    您将屏蔽与蒙版数据混为一组。

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

    然后你做了这些布尔值的直方图:但是True被解释为@ 987654326和False AS 0

    您想要在绘制直方图之前应用掩码:

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

    所以在您的情况下,如果您只想保留那些高于0.3的值,而不是:

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

    但我建议不要使用list作为变量名称,因为有一个built-in class,具有相同的名称。随着改变的线,直方图看起来更像是:

    【讨论】:

    • 谢谢你的答案!是的,我在掩码和掩码数据之间困惑。在我的情况下,它是第二种解决方案让我想要的东西所以谢谢:) span>
    【解决方案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()
    

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

    【讨论】:

    • 我真的很喜欢你的回答,但他的original question 可能适合单变量高斯。
    • @MSeifert 是的,我不知道那个答案。您的答案是实际回答 OP 问题的答案。我只是将他指向其他方向,以防背后有更普遍的问题。
    • 事实上,当我绘制直方图时,我的数据几乎完美地代表了一个高斯分布。所以我不需要超过一条高斯曲线来拟合它;)但是,我不知道 seaborn 可以做到这一点!所以谢谢
    猜你喜欢
    • 2014-11-12
    • 2015-08-11
    • 2018-02-17
    • 2022-01-06
    • 2013-11-19
    • 2017-10-10
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多