Гауссова оценка плотности ядра (KDE) больших чисел в Python - PullRequest
3 голосов
/ 22 марта 2012

У меня 1000 больших чисел, случайно распределенных в диапазоне от 37231 до 56661.

Я пытаюсь использовать stats.gaussian_kde, но что-то не работает.(может быть из-за моих плохих знаний в области статистики?).

Вот код:

from scipy import stats.gaussian_kde
import matplotlib.pyplot as plt

# 'data' is a 1D array that contains the initial numbers 37231 to 56661
xmin = min(data)
xmax = max(data)   

# get evenly distributed numbers for X axis.
x = linspace(xmin, xmax, 1000)   # get 1000 points on x axis
nPoints = len(x)

# get actual kernel density.
density = gaussian_kde(data)
y = density(x)

# print the output data
for i in range(nPoints):
    print "%s   %s" % (x[i], y[i])

plt.plot(x, density(x))
plt.show()

В распечатке я получаю значения x в столбце 1 и нули в столбце2. На графике изображена плоская линия.

Я просто не могу найти решение.Я пробовал очень широкий диапазон X-es, тот же результат.

В чем проблема?Что я делаю неправильно?Могут ли большие числа быть причиной?

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

Я думаю, что ваш массив данных состоит из целых чисел, что приводит к проблемам:

>>> import numpy, scipy.stats
>>> 
>>> data = numpy.random.randint(37231, 56661,size=10)
>>> xmin, xmax = min(data), max(data)
>>> x = numpy.linspace(xmin, xmax, 10)
>>> 
>>> density = scipy.stats.gaussian_kde(data)
>>> density.dataset
array([[52605, 45451, 46029, 40379, 48885, 41262, 39248, 38247, 55987,
        44019]])
>>> density(x)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

, но если мы используем числа с плавающей запятой:

>>> density = scipy.stats.gaussian_kde(data*1.0)
>>> density.dataset
array([[ 52605.,  45451.,  46029.,  40379.,  48885.,  41262.,  39248.,
         38247.,  55987.,  44019.]])
>>> density(x)
array([  4.42201513e-05,   5.51130237e-05,   5.94470211e-05,
         5.78485526e-05,   5.21379448e-05,   4.43176188e-05,
         3.66725694e-05,   3.06297511e-05,   2.56191024e-05,
         2.01305127e-05])
2 голосов
/ 26 апреля 2013

Я сделал функцию для этого.Вы можете изменить пропускную способность как параметр функции.То есть меньшее число = более острое, большее число = более гладкое.По умолчанию установлено значение 0,3.

. Работает в IPython notebook --pylab=inline

Количество бинов оптимизировано и закодировано, поэтому будет зависеть от количества переменных в ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...