[英]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
作為變量名,因為有一個內置的類具有相同的名字。 隨着線的改變,直方圖看起來更像:
@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中屏蔽數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.