SciPy 空間データ

空間データは幾何学的データとも呼ばれ、座標上の点など、オブジェクトの位置、形状、サイズ分布、およびその他の情報を表すために使用されます。

SciPyは、scipy.spatialモジュールによって空間データを処理します。例えば、点が範囲内にあるかどうかの判断、特定の点の周りに最も近い点、または特定の距離内のすべての点の計算などです。

三角測量

三角測量は、三角法と幾何学の観点から、ターゲットポイントと固定参照線の既知の端点との間の角度を測定することによってターゲットの距離を測定する方法です。

ポリゴンの三角測量は、ポリゴンを複数の三角形に分割することであり、これらの三角形を使用してポリゴンの面積を計算できます。

位相幾何学(トポロジー)の概念から、任意の曲面にも三角形分割があることを示しています。

仮に、曲面に三角形分割があり、すべての三角形の頂点の総数をpにし(共通の頂点を1つにする)、辺の数をaにし、三角形の数をnにします。e=p-a+nは、曲面の位相不変量です。つまり、細分化が何であっても、eは常に同じ値を取得します。 eはオイラー標数と呼ばれます。

一連の点を三角形分割するには、Delaunay()メソッドを使用します。

実例

指定された点によって三角形を作成します。

import numpy as np
from scipy.spatial import Delaunay
import matplotlib.pyplot as plt

points = np.array([
  [2, 4],
  [3, 4],
  [3, 0],
  [2, 2],
  [4, 1]
])

simplices = Delaunay(points).simplices    # 三角形の頂点のインデックス

plt.triplot(points[:, 0], points[:, 1], simplices)
plt.scatter(points[:, 0], points[:, 1], color='r')

plt.show()

出力結果を次の図に示します。

ヒント:三角形の頂点のidは、三角形分割オブジェクトのsimplices属性に格納されます。

凸包

凸包(Convex Hull)は、計算幾何学(グラフ学)の概念です。

実ベクトル空間Vでは、特定の集合Xに対して、Xを含むすべての凸集合の共通部分SはXの凸包と呼ばれます。Xの凸包は、X内のすべての点(X1,…Xn)の凸結合によって構築できます。

ConvexHull()メソッドを使用して凸包を作成できます。

実例

特定の点によって凸包を作成します。

import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt

points = np.array([
  [2, 4],
  [3, 4],
  [3, 0],
  [2, 2],
  [4, 1],
  [1, 2],
  [5, 0],
  [3, 1],
  [1, 2],
  [0, 2]
])

hull = ConvexHull(points)
hull_points = hull.simplices

plt.scatter(points[:,0], points[:,1])
for simplex in hull_points:
  plt.plot(points[simplex,0], points[simplex,1], 'k-')

plt.show()

出力結果を次の図に示します。

kd木

kd-tree(k-dimensional木の略語)は、インスタンスポイントをk次元空間に格納してすばやく取得できる木構造です。主に多次元空間でのキーデータの検索(範囲検索や最近傍探索など)で使用されます。

kd木は、多次元キー値検索(範囲検索や最近傍探索など)など、さまざまな場合に使用できます。

最近傍探索は、木内の入力された点に最近傍の点を見つけるために使用されます。

KDTree()メソッドはKDTreeオブジェクトを返します。

query()メソッドは、最近傍の距離と最近傍の位置を返します。

実例

(1,1)に最近傍の距離を見つけます。

from scipy.spatial import KDTree

points = [(1, -1), (2, 3), (-2, 3), (2, -3)]

kdtree = KDTree(points)

res = kdtree.query((1, 1))

print(res)

出力結果を次の図に示します。

(2.0, 0)

距離行列

数学から言うと、距離行列は、要素が点の間の距離である行列(2次元配列)です。仮に、ユークリッド空間にN個の点がある場合、その距離行列は、要素として非負の実数を持つN×N対称行列になります。距離行列の概念は、隣接行列に似ています。その区別はただ、隣接行列が、要素(点)の間に接続距離に関する情報がなく、エッジがあるかどうかのみが含まれています。これにより、距離行列は隣接行列の加重と見なすことができます。

例えば、以下の2次元の点aからfを分析します。ここでは、点のピクセルの間のユークリッド距離を距離計量とします。

距離行列は次のとおりです。

これらの距離行列データは、グラフィカルなヒートマップと見なすことができます。(下の図に示すように)ここの黒は距離がゼロであることを表し、白は最大距離を表します。

バイオインフォマティクスでは、距離行列は、座標系と関係なしのタンパク質構造、およびシーケンス空間内の2つのシーケンス間の距離を表現するために使用されます。これらの表現は、構造アラインメント、配列アラインメント、および核磁気共鳴、X線、および結晶学におけるタンパク質構造の決定に使用されます。

ユークリッド距離

数学では、ユークリッド距離またはユークリッドメトリックは、ユークリッド空間の2点間の「通常」(つまり直線)の距離です。この距離を使用すると、ユークリッド空間が距離空間になります。関連するノルムはユークリッドノルムと呼ばれます。 初期の資料では、これをピタゴラス計量と呼んでいました。

ユークリッド距離(euclidean metric)(ユークリッド距離とも呼ばれます)は、一般的に使用される距離の定義であり、m次元空間内の2点間の実際の距離、またはベクトルの長さ(つまり、原点までの距離)を指します。2次元および3次元空間でのユークリッド距離は、2点間の実際の距離です。

次の実例では、指定された点の間のユークリッド距離を確認します。

実例

from scipy.spatial.distance import euclidean

p1 = (1, 0)
p2 = (10, 2)

res = euclidean(p1, p2)

print(res)

出力結果を次の図に示します。

9.21954445729

マンハッタン距離

マンハッタン距離(Manhattan Distance)は、19世紀にヘルマンミンコフスキーによって作成された語彙です。これは、2点が標準座標系にあることを示すために、幾何学的測定空間で使用される専門用語です。絶対ホイールベースの合計の表示に使用されます。

マンハッタン距離は上、下、左、右にしか移動できず、2点間のマンハッタン距離は2点間の最短距離です。

マンハッタン距離とユークリッド距離:赤、青、黄色の線はそれぞれ、すべてのマンハッタン距離の長さ(12)が同じであることを示し、緑の線はユークリッド距離の長さが6×√2 ≈ 8.48であることを示します。

次の実例では、指定された点によってマンハッタン距離を計算します。

実例

from scipy.spatial.distance import cityblock

p1 = (1, 0)
p2 = (10, 2)

res = cityblock(p1, p2)

print(res)

出力結果は次のとおりです。

11

コサイン距離

コサイン類似度とも呼ばれるコサイン距離は、2つのベクトル間の角度の余弦を測定することにより、2つのベクトル間の類似性を測定します。

0度の角度の余弦は1であり、その他の角度の余弦は1以下であり、その最小値は-1です。

次の実例では、点Aと点Bの間のコサイン距離を計算します。

実例

from scipy.spatial.distance import cosine

p1 = (1, 0)
p2 = (10, 2)

res = cosine(p1, p2)

print(res)

出力結果は次のとおりです。

0.019419324309079777

ハミング距離

情報理論では、同じ長さの2つの文字列間のハミング距離(英語:Hamming distance)は、2つの文字列の対応する位置にある異なる文字の個数です。 つまり、ある文字列を別の文字列に変換するために置き換える必要のある文字数です。

ハミング重みは、同じ長さのゼロ文字列に対する文字列のハミング距離です。つまり、文字列内のゼロ以外の要素の数です。バイナリ文字列の場合は1の個数であるため、11101ハミング重みは4です。

  • 1011101と1001001の間のハミング距離は2です。
  • 2143896と2233796の間のハミング距離は3です。
  • “toned”と”roses”の間のハミング距離は3です。

次の実例では、2点間のハミング距離を計算します。

実例

from scipy.spatial.distance import hamming

p1 = (True, False, True)
p2 = (False, True, True)

res = hamming(p1, p2)

print(res)

出力結果は次のとおりです。

0.666666666667
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です