簡體   English   中英

直方圖和高斯擬合

[英]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解釋為1False解釋為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM