7

世界の特定の地域の地理データからの X 座標と Y 座標のリストがあります。グラフ内の位置に基づいて、各座標、重みを割り当てたいと思います。

例: ポイントが周囲に他の多くのノードがある場所にある場合、そのポイントは高密度領域にあるため、重みが高くなります。

私が考えることができる最も直接的な方法は、各ポイントの周りに単位半径の円を描き、他のポイントがその中にあるかどうかを計算し、関数を使用してそのポイントに重みを割り当てることです。しかし、これは原始的なようです。

pySAL と NetworkX を見てきましたが、グラフで動作するようです。グラフにはエッジがなく、ノードだけです。

4

4 に答える 4

6

標準的な解決策は、KDE(カーネル密度推定)を使用することです。
Webで検索:「KDE推定」には膨大なリンクがあります。Googleのタイプ:KDE推定ext:pdf
また、ScipyにはKDEがあります。これは、 http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.htmlに従ってください。そこに実用的なサンプルコードがあります;)

于 2012-12-28T14:26:22.563 に答える
4

ポイントが多い場合は、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_treepointsは、最近傍の(の)インデックスを返します。たとえば、[0,1](インデックス0で)はpoints[0]、からの距離points[1]内にあることを意味します。(インデックス1で)は、を意味し、からの距離内にあります。radiuspoints[0][0,1,2]points[0]points[1]points[2]radiuspoints[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]
于 2012-12-28T14:19:47.393 に答える
1

はい、エッジがあります。それらはノード間の距離です。あなたの場合、重み付けされたエッジを持つ完全なグラフがあります。

各ノードから他の各ノードまでの距離を導出するだけO(N^2)で、時間の複雑さが得られます。ノードとエッジの両方を、見つけたこれらのアプローチのいずれかへの入力として使用します。

あなたの問題は、他の何よりもむしろ分析の問題のように見えますが、発生します。K-meansのように、距離関数に基づいてノードをクラスター化するクラスター化アルゴリズムをデータに対して実行するようにしてください。このアルゴリズムでは、単純にユークリッド距離を使用できます。

このアルゴリズムの結果はまさにあなたが必要としているものです。近接する要素のクラスターがあり、各グループに割り当てられている要素とその数がわかり、これらの値に従ってできるようになります。 、各ノードに割り当てる係数を生成します。

ここで指摘する価値のある唯一の懸念は、作成する数を決定する必要があるということclustersですk-means, k-clusters

于 2012-12-28T14:14:47.833 に答える
1

各ポイントの周りに円を描き、その円内の他のポイントの数をカウントする最初の傾向は良いものであり、unutbu が述べたように、KDTree はこの問題を解決するための迅速な方法です。

これは、内部で scipy の kdtree を使用する PySAL で非常に簡単に実行できます。

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 に置き換えるだけです。詳細についてはドキュメントを参照してください。

于 2013-01-04T23:29:16.213 に答える