Почему KernelDensity.score_samples вычисляет расстояние для каждого узла?

Я использую оценку KD с пользовательской метрикой. Метрика явно медленнее, чем встроенное евклидово расстояние, но работает нормально. При выполнении

kde=KernelDensity(...)
kde.fit(X)

Я получаю результат в разумные сроки.

Когда я вычисляю

surface=np.exp(kde.score_samples(meshgrid))

где mehsgrid — это массив размером (около) 64000x2, kde вычисляет расстояние в каждой точке сетки. Кажется, я в корне неправильно понимаю, зачем это нужно... Плотность уже рассчитана с помощью метода .fit(), и score_samples "должен" просто оценивать плотность в каждой точке сетки - верно? Я что-то упускаю из виду?

Когда я делаю все расчеты со встроенной евклидовой метрикой, вычисления выполняются довольно быстро, нет намека на то, что .score_samples будет перебирать миллионы точек...

Любая подсказка приветствуется.


person Community    schedule 15.05.2015    source источник


Ответы (1)


Вам нужно вычислить плотность в точках meshgrid, если вы хотите оценить выборки. В зависимости от того, как вы передаете метрику, это будет сделано с использованием подхода грубой силы, что означает вычисление расстояний до всех точек.

Вы можете использовать свою метрику со встроенным BallTree, что может сэкономить вам некоторые вычисления, но это зависит от вашего набора данных и используемой метрики.

person Andreas Mueller    schedule 15.05.2015
comment
Что именно вы имеете в виду под тем, как вы проходите метрику? Я написал класс, который выполняет некоторые предварительные вычисления (а также вычисляет расстояние), а затем передает один метод этого класса в dict в metric_params в KernelDensity. Я также использую встроенное дерево шаров. Звонок что-то вроде KernelDensity(...metric="pyfunc",metric_params={"func":fancyClass.distanceMethod,"more_metric params":more_values},algorithm=ball_tree) - person ; 16.05.2015
comment
Ну это именно то, что я имел в виду. Это лучшее, что вы можете сделать, я думаю. - person Andreas Mueller; 18.05.2015