直方图和高斯拟合
Histogram and Gaussian 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()
但是,当我绘制它时,我得到了这样的数字(这不是我想要的):
所以,我不知道为什么我丢失了很多值,甚至超过 0.3。
这与我的原始脚本有同样的问题,我的值范围在 0 到 2 之间,0 到 0.1 之间有很多噪音,比我想删除以获得更好的拟合。
希望我是清楚的,
谢谢!
您将掩码与掩码数据混淆了。
data = np.array([1,2,3])
mask = data > 2
print(mask)
# array([False, False, True], dtype=bool)
然后你制作这些布尔值的直方图:但是 True
被解释为 1
而 False
被解释为 0
。
您想要的是在绘制直方图之前应用蒙版:
print(data[mask])
# array([3])
所以在你的情况下,如果你只想保留那些高于 0.3 的值,你需要做而不是:
# list_2 = list > 0.3
list_2 = list[list > 0.3]
但我建议不要使用 list
作为变量名,因为有一个 built-in class 具有相同的名称。使用更改后的线,直方图看起来更像:
@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.
中的数据类型
我的长脚本有问题,希望在那里得到答案。 我有一个 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()
但是,当我绘制它时,我得到了这样的数字(这不是我想要的):
所以,我不知道为什么我丢失了很多值,甚至超过 0.3。 这与我的原始脚本有同样的问题,我的值范围在 0 到 2 之间,0 到 0.1 之间有很多噪音,比我想删除以获得更好的拟合。
希望我是清楚的,
谢谢!
您将掩码与掩码数据混淆了。
data = np.array([1,2,3])
mask = data > 2
print(mask)
# array([False, False, True], dtype=bool)
然后你制作这些布尔值的直方图:但是 True
被解释为 1
而 False
被解释为 0
。
您想要的是在绘制直方图之前应用蒙版:
print(data[mask])
# array([3])
所以在你的情况下,如果你只想保留那些高于 0.3 的值,你需要做而不是:
# list_2 = list > 0.3
list_2 = list[list > 0.3]
但我建议不要使用 list
作为变量名,因为有一个 built-in class 具有相同的名称。使用更改后的线,直方图看起来更像:
@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.