Вычисление Плотности Пункта, используя Пайтона

У меня есть список X и координаты Y от geodata определенной части мира. Я хочу назначить каждую координату, вес, основанный на том, где она находится в графе.

Например: Если пункт находится в месте, где есть много других узлов вокруг этого, это находится в области высокой плотности, и поэтому имеет более высокий вес.

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

Я посмотрел на pySAL и NetworkX, но похоже, что они работают с графами. У меня нет краев в графе, просто узлы.

6
nl ja de
I' d говорят, что это должно пойти на математику. SE, вместо этого. Основная проблема - то, какую процедуру использовать, не, как осуществить его.
добавлено автор Lennart Regebro, источник

4 ответы

Если у вас есть много пунктов, можно вычислить самых близких соседей, более эффективно использующих a KDTree:

import numpy as np
import scipy.spatial as spatial
points = np.array([(1, 2), (3, 4), (4, 5), (100,100)])
tree = spatial.KDTree(np.array(points))
radius = 3.0

neighbors = tree.query_ball_tree(tree, radius)
print(neighbors)
# [[0, 1], [0, 1, 2], [1, 2], [3]]

tree.query_ball_tree returns indices (of points) of the nearest neighbors. For example, [0,1] (at index 0) means points[0] and points[1] are within radius distance from points[0]. [0,1,2] (at index 1) means points[0], points[1] and points[2] are within radius distance from points[1].

frequency = np.array(map(len, neighbors))
print(frequency)
# [2 3 2 1]
density = frequency/radius**2
print(density)
# [ 0.22222222  0.33333333  0.22222222  0.11111111]
3
добавлено

Стандартное решение использовало бы KDE (Ядерная оценка плотности).
Поиск в сети: "Оценка KDE" вы найдете огромные связи. в типе Google: Оценка KDE ext:pdf
Кроме того, у Scipy есть KDE, следуйте за этим http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html. Там работает примеры кода там;)

3
добавлено

Да, у вас действительно есть края, и они - расстояния между узлами. В вашем случае у вас есть полный граф со взвешенными краями.

Просто получите расстояние от каждого узла друг до друга узел - который дает вам O (N^2) во временной сложности - и используйте и узлы и края, как введено к одному из этих подходов, которые вы нашли.

Происходит, хотя ваша проблема кажется скорее аналитической проблемой кроме чего-либо еще; необходимо попытаться управлять некоторым группирующимся алгоритмом на данных, как K-средства , что узлы групп на основе функции расстояния, в которой можно просто использовать евклидово расстояние.

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

Единственное беспокойство, которое стоит указать здесь, - то, что необходимо будет определить, сколько группы - k-средства, k-группы - вы хотите создать.

1
добавлено

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

Это может быть сделано очень легко с PySAL, который, используя kdtree scipy под капотом.

import pysal
import numpy
pts = numpy.random.random((100,2)) #generate some random points
radius = 0.2 #pick an arbitrary radius

#Build a Spatial Weights Matrix
W = pysal.threshold_continuousW_from_array(pts, threshold=radius)
# Note: if your points are in Latitude and Longitude you can increase the accuracy by
#       passing the radius of earth to this function and it will use arc distances.
# W = pysal.threshold_continuousW_from_array(pts, threshold=radius, radius=pysal.cg.RADIUS_EARTH_KM)

print W.cardinalities
#{0: 10, 1: 15, ..... }

Если ваши данные находятся в Файле форм, просто замените threshold_continuousW_from_array threshold_continuousW_from_shapefile, посмотрите докторов для деталей.

1
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community