2016-03-18 9 views
2

У меня проблема с моим длинным сценарием, и я надеюсь получить там ответ. У меня есть двумерная гистограмма, и я хотел бы подгонять ее по гауссовскому. Тем не менее, я хотел бы удалить много данных в моем массиве 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, чем я хотел бы удалить, чтобы получить хорошую установку.

Hopfully Я ясно,

Спасибо!

ответ

3

Вы вводите в заблуждение маску с замаскированными данными.

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. С измененной линией гистограмма выглядит больше нравится:

enter image description here

+0

Благодарим вас за ответ! Да, я вводил в заблуждение данные маски и маски. В моем случае это второе решение, которое позволяет получить то, что я хочу, так спасибо :) – Deadpool

2

@ ответ MSeifert уже делает исправить свой вопрос, чтобы соответствовать одномерным гауссово к данным. Однако гистограмма, отображаемая в вопросе, не может быть смоделирована правильно с помощью одного гауссова (как показывает график @MSeifert показывает).

Это может быть излишним для вашего вопроса, но вы можете получить лучшую визуализацию (и свойства моделирования), применив к вашим данным либо оценку плотности ядра, либо многомерную гауссову (или смесь gaussians).

Быстрый пример, чтобы сделать это с помощью 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() 

enter image description here

Note переименование list в list_1. Вы никогда не должны затенять типы данных в python.

+0

Мне очень нравится ваш ответ, но его [оригинальный вопрос] (http://stackoverflow.com/questions/36016693/fitting-a-gaussian -to-a-histogram-with-matplotlib-and-numpy), вероятно, зависит от одномерного гауссова. – MSeifert

+0

@MSeifert yep, я не знал об этом ответе. Ваш ответ тот, который фактически отвечает на вопрос ОП. Я просто указывал ему на другие направления, если у него был более общий вопрос. –

+0

На самом деле, мои данные представляют почти гауссово, когда я рисую гистограмму. Поэтому мне не нужно получать больше одной гауссовой кривой, чтобы соответствовать ей;) Но я не знал, что это возможно с морским дном! Так что спасибо – Deadpool