SciPy 空间数据

处理空间数据

空间数据是指在几何空间中表示的数据。

例如坐标系上的点。

我们在许多任务中处理空间数据问题。

例如,查找点是否在边界内。

SciPy 为我们提供了模块 scipy.spatial,该模块具有处理空间数据的功能。


三角测量法

多边形的三角剖分是将多边形分成多个角度,我们可以用这些角度计算多边形的面积。

带点的 三角剖分表示创建由三角形组成的曲面,其中所有给定点至少位于曲面中任何三角形的一个顶点上。

通过点生成这些三角剖分的一种方法是 Delaunay()

实例

从以下几点创建三角剖分:

  1. import sys
  2. import matplotlib
  3. matplotlib.use('Agg')
  4. import numpy as np
  5. from scipy.spatial import Delaunay
  6. import matplotlib.pyplot as plt
  7. points = np.array([
  8. [2, 4],
  9. [3, 4],
  10. [3, 0],
  11. [2, 2],
  12. [4, 1]
  13. ])
  14. simplices = Delaunay(points).simplices
  15. plt.triplot(points[:, 0], points[:, 1], simplices)
  16. plt.scatter(points[:, 0], points[:, 1], color='r')
  17. plt.show()
  18. plt.savefig(sys.stdout.buffer)
  19. sys.stdout.flush()
结果:

注意:simplices 属性创建三角形符号的泛化。

凸包 - Convex Hull

凸包(Convex Hull)是一个计算几何(图形学)中的概念。

凸包是指覆盖所有给定点的最小多边形。

使用 ConvexHull() 方法创建凸包。

实例

用如下点来创建一个凸包:

  1. import sys
  2. import matplotlib
  3. matplotlib.use('Agg')
  4. import numpy as np
  5. from scipy.spatial import ConvexHull
  6. import matplotlib.pyplot as plt
  7. points = np.array([
  8. [2, 4],
  9. [3, 4],
  10. [3, 0],
  11. [2, 2],
  12. [4, 1],
  13. [1, 2],
  14. [5, 0],
  15. [3, 1],
  16. [1, 2],
  17. [0, 2]
  18. ])
  19. hull = ConvexHull(points)
  20. hull_points = hull.simplices
  21. plt.scatter(points[:,0], points[:,1])
  22. for simplex in hull_points:
  23. plt.plot(points[simplex,0], points[simplex,1], 'k-')
  24. plt.show()
  25. #Two lines to make our compiler able to draw:
  26. plt.savefig(sys.stdout.buffer)
  27. sys.stdout.flush()
结果:


KDTrees

kd-tree(k-dimensional树的简称),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。

例如,在使用 KDTrees 的一组点中,我们可以有效地询问哪些点离某个给定点最近。

KDTree() 返回一个 KDTree 对象。

query() 方法返回最邻近的距离 最邻近的位置。

实例

查找到点(1,1)的最邻近的位置:

  1. from scipy.spatial import KDTree
  2. points = [(1, -1), (2, 3), (-2, 3), (2, -3)]
  3. kdtree = KDTree(points)
  4. res = kdtree.query((1, 1))
  5. print(res)
结果:
  1. (2.0, 0)

距离矩阵

在数据科学中,有许多距离度量用于寻找两点之间的各种类型的距离,如欧几里德距离、余弦距离等。

两个向量之间的距离不仅可以是它们之间直线的长度,还可以是它们与原点之间的角度,或所需的单位步数等。

许多机器学习算法的性能在很大程度上取决于距离度量。例如 近邻算法(K-Nearest Neighbors),或 K-Means 算法等。

让我们看看一些距离度量:


欧几里德距离

在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间 "普通"(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。

求给定点之间的欧几里德距离。

实例
  1. from scipy.spatial.distance import euclidean
  2. p1 = (1, 0)
  3. p2 = (10, 2)
  4. res = euclidean(p1, p2)
  5. print(res)
结果:
  1. 9.21954445729

城市街区距离(曼哈顿距离)

城市街区距离(曼哈顿距离)是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。它使用 4 度移动计算的距离。

我们只能移动:向上、向下、向右或向左,不能对角移动。

实例

查找给定点之间的曼哈顿距离:

  1. from scipy.spatial.distance import cityblock
  2. p1 = (1, 0)
  3. p2 = (10, 2)
  4. res = cityblock(p1, p2)
  5. print(res)
结果:
  1. 11

余弦距离

余弦距离,也称为余弦相似度,通过测量两个向量的夹角的余弦值来度量它们之间的相似性。

比如两点 A 和 B 之间的余弦角值。

实例

计算以下给定点的余弦距离:

  1. from scipy.spatial.distance import cosine
  2. p1 = (1, 0)
  3. p2 = (10, 2)
  4. res = cosine(p1, p2)
  5. print(res)
结果:
  1. 0.019419324309079777

汉明距离

汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以 d(x,y)表示两个字 x , y 之间的汉明距离。对两个字符串进行异或运算,并统计结果为 1 的个数,那么这个数就是汉明距离。

这是一种测量二进制序列距离的方法。

实例

计算以下给定点的汉明距离:

  1. from scipy.spatial.distance import hamming
  2. p1 = (True, False, True)
  3. p2 = (False, True, True)
  4. res = hamming(p1, p2)
  5. print(res)
结果:
  1. 0.666666666667