logo

ユークリッドグラフ 📂グラフ理論

ユークリッドグラフ

定義 1

簡単な定義

ユークリッド空間有限部分集合 VRpV \subset \mathbb{R}^{p}カットオフδ0\delta \ge 0 が与えられているとする。ユークリッドグラフは、VV を頂点vertexとし、二点 u,vVu,v \in V の距離が δ\delta より小さい時、そしてその時に限りエッジedgeを結ぶグラフである。

難しい定義

ユークリッド空間有限部分集合 VRpV \subset \mathbb{R}^{p} に対し、EV×VE \subset V \times V で以下のように定義される関数 w:ERw : E \to \mathbb{R} が与えられたグラフ G:=(V,E)G := \left( V,E \right)ユークリッドグラフeuclidean graphとする。 w(u,v):=uv2u,vV w (u,v) := \left\| u - v \right\|_{2} \qquad u,v \in V ここで ww重みweightと呼ぶことができる。


  • 2\left\| \cdot \right\|_{2}ユークリッドノルムであり、ベクターの各成分を二乗してすべてを加算した後、ルート \sqrt{\cdot} を取る関数である。

説明

紹介された難しい定義は、簡単な定義を含んでいる。単に重みがカットオフより小さいことを基準にすればいい。

ユークリッドグラフがどのように見えるかは、直接見る方がずっと早い。以下は、正方形 [0,1]2[0,1]^2 の内部で 2020 点を均一分布に従ってランダムにサンプリングし、カットオフを δ=.2,.3,.5\delta = .2, .3, .5 に変えながらグラフを描いた例である。カットオフが比較的小さい時は、近い点同士が結ばれ、比較的大きい時は、もう少し遠い点同士も結ばれて、グラフの構造が決まることがわかる。

G2.png G3.png G5.png

データとランダムネットワーク

一般的にユークリッドネットワークはランダムネットワークである必要はないが、単に点間の距離を測ってグラフを作るという発想自体がそれほど面白くないため(点をグラフで表現する必要がほとんどないため)、必然的にデータに基づくユークリッドネットワークを考えることになる。任意に与えられた点ではなく、データとして与えられた点たちを、単に遠いか近いかではなく、ネットワーク的な性質に従って研究することができる。

データが適切でないために点がユークリッド空間に属していない場合でも、例えばカテゴリカルデータを含む場合であっても、とりあえずユークリッド空間にマッピングすることで、どうにかしてユークリッドネットワークを構築できる。簡単に言えば、適切な数字を割り当てることであり、洗練された言い方をすれば、エンベディングとも呼ばれる。

Rp\mathbb{R}^{p} を使ってエンベディングしてネットワークを作成し分析すればいいのではないですか?”

しかし、データに対する深い理解がないまま「エンベディング」を乱用するのはあまりプロフェッショナルな態度ではない。無知に見えたくなければ、慎重に使用すること。

一般化

距離空間

ユークリッドグラフでのユークリッド空間は、一般的な距離空間 (X,d)\left( X , d \right) に置き換えても定義には全く問題がない。他のすべてが同じであり、重みは次のように調整すればいい。 w(u,v):=d(u,v)u,vV w (u,v) := d \left( u, v \right) \qquad u,v \in V

ムービングネットワーク

ユークリッドネットワーク GG の頂点が時間 tt に従ってその位置が動く v=v(t)v = v(t) と表される場合、時間 tt に依存するユークリッドネットワークとして G(t)G(t) のようにムービングネットワークmoving Networkと呼ぶことができる。

コード

説明で述べられた視覚化のためのJuliaコードは以下の通りです。

using Graphs, Random
using Plots, GraphRecipes

Random.seed!(0)
V = rand(2,20)
G2, _ = euclidean_graph(V, cutoff = 0.2)
graphplot(G2, x = V[1,:], y = V[2,:], curves = false, size = (400,400), title = "δ = 0.2")
png("G2.png")
G3, _ = euclidean_graph(V, cutoff = 0.3)
graphplot(G3, x = V[1,:], y = V[2,:], curves = false, size = (400,400), title = "δ = 0.3")
png("G3.png")
G5, _ = euclidean_graph(V, cutoff = 0.5)
graphplot(G5, x = V[1,:], y = V[2,:], curves = false, size = (400,400), title = "δ = 0.5")
png("G5.png")

環境

  • OS: Windows
  • julia: v1.7.0

  1. Keil. (1992). Classes of Graphs Which approximate the Complete Euclidean Graph. https://doi.org/10.1007/BF02187821 ↩︎