SciPy 空间数据
处理空间数据
空间数据是指在几何空间中表示的数据。
例如坐标系上的点。
我们在许多任务中处理空间数据问题。
例如,查找点是否在边界内。
SciPy 为我们提供了模块 scipy.spatial
,该模块具有处理空间数据的功能。
三角测量法
多边形的三角剖分是将多边形分成多个角度,我们可以用这些角度计算多边形的面积。
带点的 三角剖分表示创建由三角形组成的曲面,其中所有给定点至少位于曲面中任何三角形的一个顶点上。
通过点生成这些三角剖分的一种方法是 Delaunay()
。
实例
从以下几点创建三角剖分:
import sys
import matplotlib
matplotlib.use('Agg')
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()
plt.savefig(sys.stdout.buffer)
sys.stdout.flush()
结果:
simplices
属性创建三角形符号的泛化。凸包 - Convex Hull
凸包(Convex Hull)是一个计算几何(图形学)中的概念。
凸包是指覆盖所有给定点的最小多边形。
使用 ConvexHull()
方法创建凸包。
实例
用如下点来创建一个凸包:
import sys
import matplotlib
matplotlib.use('Agg')
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()
#Two lines to make our compiler able to draw:
plt.savefig(sys.stdout.buffer)
sys.stdout.flush()
结果:
KDTrees
kd-tree(k-dimensional树的简称),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。
例如,在使用 KDTrees 的一组点中,我们可以有效地询问哪些点离某个给定点最近。
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)
距离矩阵
在数据科学中,有许多距离度量用于寻找两点之间的各种类型的距离,如欧几里德距离、余弦距离等。
两个向量之间的距离不仅可以是它们之间直线的长度,还可以是它们与原点之间的角度,或所需的单位步数等。
许多机器学习算法的性能在很大程度上取决于距离度量。例如 近邻算法(K-Nearest Neighbors),或 K-Means 算法等。
让我们看看一些距离度量:
欧几里德距离
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间 "普通"(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。
求给定点之间的欧几里德距离。
实例
from scipy.spatial.distance import euclidean
p1 = (1, 0)
p2 = (10, 2)
res = euclidean(p1, p2)
print(res)
结果:
9.21954445729
城市街区距离(曼哈顿距离)
城市街区距离(曼哈顿距离)是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。它使用 4 度移动计算的距离。
我们只能移动:向上、向下、向右或向左,不能对角移动。
实例
查找给定点之间的曼哈顿距离:
from scipy.spatial.distance import cityblock
p1 = (1, 0)
p2 = (10, 2)
res = cityblock(p1, p2)
print(res)
结果:
11
余弦距离
余弦距离,也称为余弦相似度,通过测量两个向量的夹角的余弦值来度量它们之间的相似性。
比如两点 A 和 B 之间的余弦角值。
实例
计算以下给定点的余弦距离:
from scipy.spatial.distance import cosine
p1 = (1, 0)
p2 = (10, 2)
res = cosine(p1, p2)
print(res)
结果:
0.019419324309079777
汉明距离
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以 d(x,y)表示两个字 x , y 之间的汉明距离。对两个字符串进行异或运算,并统计结果为 1 的个数,那么这个数就是汉明距离。
这是一种测量二进制序列距离的方法。
实例
计算以下给定点的汉明距离:
from scipy.spatial.distance import hamming
p1 = (True, False, True)
p2 = (False, True, True)
res = hamming(p1, p2)
print(res)
结果:
0.666666666667