SciPy Spatial Data

کار کردن با داده‌های فضایی

منظور از داده‌های فضایی (spatial data) داده‌هایی هستند که در یک فضای هندسی معرفی شده‌اند. مثلاً یک نقطه در یک سیستم مختصات.

در بسیاری از مسائل با داده‌های فضایی سر و کار داریم. مثلاً دانستن اینکه یک نقطه‌ داخل یک مرز مشخص شده قرار می‌گیرد یا خیر.

SciPy مدول scipy.spatial را جهت کار با داده‌های فضایی معرفی کرده است.

مثلث سازی

مثلث سازی (triangulation) از یک چند ضلعی، تقسیم چند ضلعی به چندین مثلث است که بوسیله آن بتوان مساحت چند ضلعی را محاسبه کرد.

مثلث سازی با نقاط به این معنی است که سطحی متشکل از مثلث‌ها بسازیم به طوریکه همه نقاط داده شده روی حداقل یک راس یکی از مثلث‌های موجود در سطح قرار گیرند.

یکی از روش‌های ایجاد مثلث از نقاط داده شده توسط تابع شیء 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()

خروجی:

تابع شیء ()ConvexHull

چارچوب محدب (Convex Hull) کوچکترین چند ضلعی است که همه نقاط داده شده را پوشش دهد. برای ایجاد آن از تابع شیء 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()

خروجی:

KDTrees

KDTrees یک ساختار داده بهینه شده جهت جستجو برای پیدا کردن نزدیک‌ترین همسایه است. به این معنی که در یک مجموعه نقاط داده شده KDTrees می‌تواند به صورت کارآمدی نزدیک‌ترین نقاط به نقطه مشخص شده را پیدا کند.

تابع شیء KDTree() یک شیء KDTree را برمی‌گرداند.

تابع شیء query() فاصله تا نزدیک‌ترین همسایه و محل همسایه‌ها را برمی‌گرداند.


from scipy.spatial import KDTree

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

kdtree = KDTree(points)

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

print(res)

خروجی:

ماتریس فاصله

ماتریس‌های فاصله (distance matrices) زیادی جهت پیدا کردن انواع فاصله (فاصله اقلیدسی، فاصله کسینوسی و ...) بین دو نقطه در علوم داده وجود دارد.

فاصله بین دو بردار تنها طول یک خط مستقیم بین آن‌ها نیست بلکه می‌تواند زاویه بین آن‌ها در مبداء یا تعداد قدم‌های واحد مورد نیاز یا ... باشد.

کارکرد بسیاری از الگوریتم‌های یادگیری ماشین تا حد زیادی به ماتریس‌های فاصله وابسته هستند. مانند الگوریتم K Nearest Neighbors یا الگوریتم K Means.

در ادامه به توضیح برخی از ماتریس‌های فاصله می‌پردازیم.

فاصله اقلیدسی

فاصله اقلیدسی بین نقاط داده شده را پیدا می‌کند.


from scipy.spatial.distance import euclidean

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

res = euclidean(p1, p2)

print(res)

خروجی:

Cityblock Distance (Manhattan Distance)

در محاسبه این نوع فاصله فقط 4 درجه آزادی وجود دارد. یعنی تنها می‌توانیم به بالا، پایین، چپ و راست حرکت کنیم و مجاز نیستیم به صورت قطری حرکت کنیم.


from scipy.spatial.distance import cityblock

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

res = cityblock(p1, p2)

print(res)

خروجی:

فاصله کسینوسی

مقدار کسینوس زاویه بین دو نقطه A و B است.


from scipy.spatial.distance import cosine

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

res = cosine(p1, p2)

print(res)

خروجی:

فاصله همینگ

فاصله همینگ (Hamming Distance) نسبت بیت‌هایی است که در آن دو بیت متفاوت هستند

راهی برای اندازه‌گیری فاصله برای دنباله‌های دودویی است.


from scipy.spatial.distance import hamming

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

res = hamming(p1, p2)

print(res)

خروجی: