中心の経度(x)と緯度(y)のデータを使用しています。私の目標は、接続された場所をクラスタリングすることです。
earth_distance((x1、y1)、(x2、y2))<15 kmの場合、地球上の2つの場所(x1、y1)と(x2、y2)は接続されていると言われます。
RのdistHaversine関数を使用して、地球の距離を計算しています。
ここにいくつかのサンプルデータがあります、
x = c(1.000000、1.055672、1.038712、1.094459、1.133179、1.116241、1.126053、1.181824、1.377892、5.869881、5.925270、5.909721)
そして
y = c(1.333368,1.304790,1.347332,1.318743,1.332676,1.375229,1.572287,1.544174,2.371105,2.337032,2.383415)
また
距離<-distHaversine(c(x、y))
異なる接続されたポイントのセットによって形成された異なるクラスターを見つけたいと思います(接続された各ポイントのセットがクラスターを形成します)。
ポイントをクラスター化してプロットする方法を見ましたが、問題を解決できませんでした。
任意の参照、提案または回答は非常に高く評価されます。
多分これ。最初にいくつかの座標を作成します。
> x=c(1.000000, 1.055672, 1.038712, 1.094459, 1.133179, 1.116241, 1.126053, 1.181824 ,1.377892, 5.869881, 5.925270)
> y=c(1.333368, 1.304790, 1.347332, 1.318743, 1.332676, 1.375229, 1.572287, 1.544174, 2.371105 ,2.337032, 2.383415)
データフレームにする
> xy = data.frame(x=x,y=y)
次に、を使用outer
して行と列のすべてのペアをループし、完全な距離行列を計算します。これは、すべてとに対して計算するi
ためj
、実際に必要な作業の2倍の作業j
を実行i
します。とにかく、それは私たちに距離行列を取得します:i
j
> dmat = outer(1:nrow(xy), 1:nrow(xy), function(i,j)distHaversine(xy[i,],xy[j,]))
ここで、15,000メートルより近い任意のペアである接続マトリックスが必要です。
> cmat = dmat < 15000
次に、igraph
パッケージを使用して接続グラフオブジェクトを作成します。
> require(igraph)
> cgraph = graph.adjacency(cmat)
これをプロットしてクラスター形成を確認できますが、これらはxy空間にプロットされていないことに注意してください。
> plot(cgraph)
次に、接続されたクラスターを取得します。
> clusters(cgraph)
$membership
[1] 1 1 1 1 1 1 2 2 3 4 4
$csize
[1] 6 2 1 2
$no
[1] 4
したがって、データフレームに追加できるものは次のとおりです。
> xy$cluster = clusters(cgraph)$membership
> xy
x y cluster
1 1.000000 1.333368 1
2 1.055672 1.304790 1
3 1.038712 1.347332 1
4 1.094459 1.318743 1
5 1.133179 1.332676 1
6 1.116241 1.375229 1
7 1.126053 1.572287 2
8 1.181824 1.544174 2
9 1.377892 2.371105 3
10 5.869881 2.337032 4
11 5.925270 2.383415 4
そしてプロット:
> plot(xy$x,xy$y,col=xy$cluster)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加