2015-07-06 3 views
3

Я начал использовать python для анализа. Я хотел бы сделать следующее:Как оценить функцию плотности и рассчитать ее пики?

  1. Получить распределение набора данных
  2. Получить пики этого распределения

я использовал gaussian_kde от scipy.stats сделать оценку для функции плотности ядра. Представляет ли guassian_kde какое-либо предположение о данных?. Я использую данные, которые меняются со временем. поэтому, если данные имеют один дистрибутив (например, гауссовский), он может иметь другое распределение позже. Есть ли у gaussian_kde какие-либо недостатки в этом сценарии ?. Было предложено в question попытаться установить данные в каждом дистрибутиве, чтобы получить распределение данных. Так в чем разница между использованием gaussian_kde и ответом, указанным в question. Я использовал код ниже, мне также интересно узнать, является ли gaussian_kde хорошим способом оценки pdf, если данные будут изменены со временем?. Я знаю, что одним из преимуществ gaussian_kde является то, что он автоматически вычисляет полосу пропускания с помощью правила, как в here. Кроме того, как я могу получить его пики?

import pandas as pd 
import numpy as np 
import pylab as pl 
import scipy.stats 
df = pd.read_csv('D:\dataset.csv') 
pdf = scipy.stats.kde.gaussian_kde(df) 
x = np.linspace((df.min()-1),(df.max()+1), len(df)) 
y = pdf(x)       

pl.plot(x, y, color = 'r') 
pl.hist(data_column, normed= True) 
pl.show(block=True)  
+0

Первые несколько предложений очень трудно понять. Вы можете быть более ясными там. Как вы думаете, что «gaussian kde» нормализует ваши данные? И почему это привело бы к одному пику? И после этого я не получаю предложение. – cel

+0

Примите мои извинения, я перефразировал вопрос – Yasmin

ответ

7

Я думаю, что нужно различать непараметрические плотности (один реализованные в scipy.stats.kde) от параметрической плотности (один в StackOverflow question вы упоминаете). Чтобы проиллюстрировать разницу между этими двумя, попробуйте следующий код.

import pandas as pd 
import numpy as np 
import scipy.stats as stats 
import matplotlib.pyplot as plt 

np.random.seed(0) 
gaussian1 = -6 + 3 * np.random.randn(1700) 
gaussian2 = 4 + 1.5 * np.random.randn(300) 
gaussian_mixture = np.hstack([gaussian1, gaussian2]) 

df = pd.DataFrame(gaussian_mixture, columns=['data']) 

# non-parametric pdf 
nparam_density = stats.kde.gaussian_kde(df.values.ravel()) 
x = np.linspace(-20, 10, 200) 
nparam_density = nparam_density(x) 

# parametric fit: assume normal distribution 
loc_param, scale_param = stats.norm.fit(df) 
param_density = stats.norm.pdf(x, loc=loc_param, scale=scale_param) 

fig, ax = plt.subplots(figsize=(10, 6)) 
ax.hist(df.values, bins=30, normed=True) 
ax.plot(x, nparam_density, 'r-', label='non-parametric density (smoothed by Gaussian kernel)') 
ax.plot(x, param_density, 'k--', label='parametric density') 
ax.set_ylim([0, 0.15]) 
ax.legend(loc='best') 

enter image description here

Из графика мы видим, что плотность непараметрический не что иное, как сглаженный вариант гистограммы. В гистограмме для конкретного наблюдения x=x0 мы используем бар для его представления (положим всю массу вероятности на эту единственную точку x=x0 и нуль в другом месте), тогда как при непараметрической оценке плотности мы используем колоколообразную кривую (гауссовское ядро) для представления этой точки (распространяется по ее окрестности). И результат - сглаженная кривая плотности. Это внутреннее гауссовское ядро ​​не имеет никакого отношения к вашему предположению о распределении по базовым данным x. Его единственная цель - сглаживание.

Чтобы получить режим непараметрической плотности, нам необходимо выполнить исчерпывающий поиск, так как плотность не гарантируется единым режимом. Как показано в приведенном выше примере, если вы выбрали алгоритм оптимизации квази-Ньютона между [5,10], он, скорее всего, получит локальную оптимальную точку, а не глобальную.

# get mode: exhastive search 
x[np.argsort(nparam_density)[-1]] 
Смежные вопросы