计算几何

数学表达式用户指南的这一部分介绍了计算几何函数。

凸包

凸包是包含数据集的最小凸点集。数学表达式支持计算 2D 数据集的凸包。计算出凸包后,可以将一组数学表达式函数应用于几何描述和可视化凸包。

可视化

convexHull 函数可用于可视化一组 2D 点周围的边界。边界可视化对于理解数据点相对于边界的位置非常有用。

在下面的示例中,convexHull 函数用于可视化 NYC311 投诉数据库中老鼠目击事件的一组经度和纬度点周围的边界。可以对老鼠目击事件周围的边界进行调查,以更好地了解老鼠可能如何进入或离开特定区域。

散点图

在可视化凸包之前,通常将 2D 点可视化为散点图会很有用。

在此示例中,random 函数从 NYC311(投诉数据库)集合中抽取样本记录,其中投诉描述与“老鼠目击事件”匹配,邮政编码为 11238。然后将经度和纬度字段向量化,并以经度为 x 轴,纬度为 y 轴绘制为散点图。

convex0

从散点图中可以看出,许多点似乎位于绘图的边界附近。

凸包图

convexHull 函数可用于可视化边界。该示例使用从 NYC311 数据库中提取的相同点。但是,纬度和经度点不是直接绘制点,而是作为行添加到矩阵中。然后使用 transpose 函数转置矩阵,以便矩阵的每一行都包含一个纬度和经度点。

然后使用 convexHull 函数计算点矩阵的凸包。凸包被设置为名为 hull 的变量。

创建凸包后,可以使用 getVertices 函数检索散点图中构成散点图周围凸包边界的点矩阵。然后可以使用 colAt 函数从矩阵中检索纬度和经度向量,以便可以通过 zplot 函数进行可视化。在下面的示例中,凸包点被可视化为散点图。

hullplot

请注意,散点图中的 15 个点描述了凸包的纬度和经度点。

投影和聚类

计算出凸包后,可以使用 projectToBorder 将点投影到边界上最近的点。在下面的示例中,projectToBorder 函数用于将原始散点图点投影到最近的边界。

projectToBorder 函数返回边界投影的纬度/经度点矩阵。在该示例中,然后使用 k 均值聚类将边界点矩阵聚类为 7 个聚类。然后使用 zplot 函数绘制聚类后的边界点。

convex1

在可视化中,很容易看到边界上哪些点的密度最高。对于老鼠目击事件,此信息有助于了解老鼠最接近进入或离开的边界点。

绘制质心

一旦边界点被聚类,很容易提取聚类的质心并在地图上绘制它们。下面的示例使用 getCentroids 函数从聚类中提取质心。getCentroids 返回表示边界聚类质心的纬度/经度点矩阵。然后可以使用 colAt 函数提取纬度/经度向量,以便可以使用 zplot 将其绘制在地图上。

convex2

上图显示了边界聚类的质心。现在可以放大并以地理空间方式调查最高密度聚类的质心,以确定开始边界调查的最佳位置。

外接圆盘

enclosingDisk 函数用于查找包围 2D 数据集的最小外接圆。一旦计算出外接圆盘,就可以应用一组数学表达式函数来几何描述该外接圆盘。

在下面的示例中,为一个随机生成的包含 1000 个 2D 观测值的数据集计算外接圆盘。

然后,对外接圆盘调用以下函数:

  • getCenter:返回圆盘中心的 2D 点。

  • getRadius:返回圆盘的半径。

  • getSupportPoints:返回圆盘的支持点。

let(echo="center, radius, support",
    x=sample(normalDistribution(0, 20), 1000),
    y=sample(normalDistribution(0, 20), 1000),
    observations=transpose(matrix(x,y)),
    disk=enclosingDisk(observations),
    center=getCenter(disk),
    radius=getRadius(disk),
    support=getSupportPoints(disk))

当此表达式发送到 /stream 处理程序时,它会响应:

{
  "result-set": {
    "docs": [
      {
        "center": [
          -6.668825009733749,
          -2.9825450908240025
        ],
        "radius": 72.66109546907208,
        "support": [
          [
            20.350992271739464,
            64.46791279377014
          ],
          [
            33.02079953093981,
            57.880978456420365
          ],
          [
            -44.7273247899923,
            -64.87911518353323
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 8
      }
    ]
  }
}