2017-01-10 11 views
1

Прошу прощения за, наверное, глупый вопрос, но я пытаюсь теперь часами оценивать плотность из набора данных 2d. Предположим, что мои данные заданы массивом: sample = np.random.uniform(0,1,size=(50,2)). Я просто хочу, чтобы использовать scipys scikit узнать пакет для оценки плотности из массива образца (который здесь, конечно, 2d равномерная плотность), и я пытаюсь следующее:Как оценивается плотность ядра 2d в python (sklearn)?

import numpy as np 
from sklearn.neighbors.kde import KernelDensity 
from matplotlib import pyplot as plt 
sp = 0.01 

samples = np.random.uniform(0,1,size=(50,2)) # random samples 
x = y = np.linspace(0,1,100) 
X,Y = np.meshgrid(x,y)  # creating grid of data , to evaluate estimated density on 

kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(samples) # creating density from samples 

kde.score_samples(X,Y) # I want to evaluate the estimated density on the X,Y grid 

Но последний шаг всегда приводит к ошибке : score_samples() takes 2 positional arguments but 3 were given

Таким образом, возможно, что .score_samples не может принимать сетку в качестве входных данных, но нет учебников/документов для случая 2d, поэтому я не знаю, как исправить эту проблему. Было бы здорово, если бы кто-то мог помочь.

+1

Это потому, что 'kde.score_samples' принимает только один аргумент,' x'. Вы пытались прочитать документацию? С почти всеми моделями sklearn вам нужно вызвать 'model.fit (X, Y)', тогда вы можете использовать 'score_samples' только на' X' –

ответ

4

Действительно, у меня были проблемы с этой же проблемой уже несколько часов. В конце концов, мне удалось заставить его работать, глядя на пример Kernel Density Estimate of Species Distributions.

Вы должны упаковать данные x, y вместе (как данные обучения, так и новую сетку выборки). Ниже приведен фрагмент моего кода, который я использую.

from sklearn.neighbors import KernelDensity 

def kde2D(x, y, bandwidth, xbins=100j, ybins=100j, **kwargs): 
    """Build 2D kernel density estimate (KDE).""" 

    # create grid of sample locations (default: 100x100) 
    xx, yy = np.mgrid[x.min():x.max():xbins, 
         y.min():y.max():ybins] 

    xy_sample = np.vstack([yy.ravel(), xx.ravel()]).T 
    xy_train = np.vstack([y, x]).T 

    kde_skl = KernelDensity(bandwidth=bandwidth, **kwargs) 
    kde_skl.fit(xy_train) 

    # score_samples() returns the log-likelihood of the samples 
    z = np.exp(kde_skl.score_samples(xy_sample)) 
    return xx, yy, np.reshape(z, xx.shape) 

Это дает вам xx, yy, zz, необходимые для чего-то вроде разброса или участка pcolormesh. Я скопировал пример со скудной страницы в функции gaussian_kde.

import numpy as np 
import matplotlib.pyplot as plt 

m1 = np.random.rand(size=1000) 
m2 = np.random.rand(scale=0.5, size=1000) 

x, y = m1 + m2, m1 - m2 

xx, yy, zz = kde2d(x, y, 1.0) 

plt.pcolormesh(xx, yy, zz) 
plt.scatter(x, y, s=2, facecolor='white') 

example figure

+0

Большое спасибо, @geoff! – murph