Найти режим оценки плотности ядра в данных GPS

#python #scikit-learn #gis #kernel-density

#python #scikit-учиться #гис #плотность ядра

Вопрос:

Я анализирую данные о местоположении GPS с весами, указывающими «важность». Это можно легко отобразить в виде тепловой карты, например, в картах Google. Я хотел бы проанализировать это с помощью стека данных Python и, в частности, хочу найти режим оценки плотности ядра.

Как я могу вычислить режим KDE в python?

Очень конкретно, учитывая пример вhttps://scikit-learn.org/stable/auto_examples/neighbors/plot_species_kde.html как бы вы нашли местоположение с наибольшей вероятностью обнаружения вида «Bradypus variegatus»?

Ответ №1:

Давайте рассмотрим простой пример получения kde-оценки:

 import numpy as np
from scipy.stats import gaussian_kde
from pylab import plt

np.random.seed(10)

x = np.random.rand(100)
y = np.random.rand(100)
kde = gaussian_kde(np.vstack([x, y]))
X, Y = np.meshgrid(np.linspace(0, 1, 100), np.linspace(0, 1, 100))
Z = kde(np.vstack([X.ravel(), Y.ravel()])).reshape(X.shape)

plt.contourf(X, Y, Z)
plt.show()
  

введите описание изображения здесь

Теперь мы можем получить координаты X и Y, где Z принимает свое максимальное значение:

 X.ravel()[np.argmax(Z.ravel())]

0.3535353535353536

Y.ravel()[np.argmax(Z.ravel())]

0.5555555555555556
  

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

 Y.ravel()[Z.ravel() > np.percentile(Z, 90)]
X.ravel()[Z.ravel() > np.percentile(Z, 90)]
  

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

Комментарии:

1. Это решение выполняет выборку KDE в сетке и выбирает наибольшее значение — нормально, но не очень эффективно. Я думал, что должен быть какой-то метод градиентного подъема, который хорошо сходится, не ограничиваясь сеткой. Это может быть заполнено в разных местах, которые являются точками генерации KDE. Есть идеи о том, как это сделать?

2. Получение наибольших значений должно быть быстрым, np.argmax, [Z.ravel()>....] реализованы на C; Я подозреваю, что вычисление kde является узким местом; Может быть, Scikit-Learn оценка плотности ядра на основе cKDTree будет достаточно эффективной.