#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
будет достаточно эффективной.