向量数学

本节介绍向量数学和向量操作函数。

数组

可以使用 array 函数创建数组。

例如,下面的表达式创建了一个包含三个元素的数字数组

array(1, 2, 3)

当此表达式发送到 /stream 处理程序时,它会响应一个 JSON 数组

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          1,
          2,
          3
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

可视化

可以使用 zplot 函数使用 Zeppelin-Solr 可视化向量。

我们首先来看看当我们将数组函数可视化为表格时会发生什么。

array

它显示为一行,其中包含用逗号分隔的值列表。你会发现你无法使用任何绘图工具可视化此输出。

要绘制数组,你需要 zplot 函数。我们首先来看看 zplot 输出在 JSON 格式中的样子。

zplot(x=array(1, 2, 3))

当此表达式发送到 /stream 处理程序时,它会响应一个 JSON 数组

{
  "result-set": {
    "docs": [
      {
        "x": 1
      },
      {
        "x": 2
      },
      {
        "x": 3
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

zplot 已将数组转换为三个元组,其中包含字段 x

让我们添加另一个数组

zplot(x=array(1, 2, 3), y=array(10, 20, 30))

当此表达式发送到 /stream 处理程序时,它会响应一个 JSON 数组

{
  "result-set": {
    "docs": [
      {
        "x": 1,
        "y": 10
      },
      {
        "x": 2,
        "y": 20
      },
      {
        "x": 3,
        "y": 30
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

现在我们有三个元组,其中包含 xy 字段。

让我们看看 Zeppelin-Solr 如何以表格格式处理此输出

xy

现在我们已经定义了 xy 列,我们可以简单地切换到其中一个折线图,并使用图表设置插入要使用该字段绘制的图表

line1

每个图表都有可以通过单击设置进行探索的设置。

你可以针对不同类型的可视化在图表类型之间切换。下面是一个条形图示例

bar

数组操作

数组可以作为参数传递给对数组进行操作的函数。

例如,可以使用 rev 函数反转数组

rev(array(1, 2, 3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          3,
          2,
          1
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

另一个示例是 length 函数,它返回数组的长度

length(array(1, 2, 3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 3
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

可以使用 copyOfRange 函数获取数组的一部分,该函数从开始和结束范围复制数组的元素。

copyOfRange(array(1,2,3,4,5,6), 1, 4)

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          2,
          3,
          4
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

可以使用 ltrim(左修剪)和 rtrim(右修剪)函数修剪数组的元素。ltrimrtrim 函数从数组的左侧或右侧删除特定数量的元素。

以下示例显示了 lrtim 函数修剪数组的前 2 个元素

ltrim(array(0,1,2,3,4,5,6), 2)

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          2,
          3,
          4,
          5,
          6,
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 1
      }
    ]
  }
}

按索引获取值

可以使用 valueAt 函数按索引从向量中检索值。

valueAt(array(0,1,2,3,4,5,6), 2)

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 2
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

序列

sequence 函数可用于生成一个数字序列作为数组。以下示例返回一个由 0 开始、步长为 2 的 10 个数字序列。

sequence(10, 0, 2)

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          0,
          2,
          4,
          6,
          8,
          10,
          12,
          14,
          16,
          18
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 7
      }
    ]
  }
}

natural 函数可用于创建从零开始的自然数序列。自然数是正整数。

以下示例创建一个从零开始的序列,其中包含所有小于 10 但不包括 10 的自然数。

natural(10)

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

向量排序

可以使用 asc 函数按自然升序对数组进行排序。

以下示例显示 asc 函数对数组进行排序

asc(array(10,1,2,3,4,5,6))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          1,
          2,
          3,
          4,
          5,
          6,
          10
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 1
      }
    ]
  }
}

向量汇总和范数

有一组函数执行汇总并返回数组的范数。这些函数对数组进行操作并返回一个值。以下向量汇总和范数函数可用:multaddsumSqmeanl1norml2normlinfnorm

以下示例显示 mult 函数,它会将数组的所有值相乘。

mult(array(2,4,8))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 64
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

向量范数函数提供用于计算向量幅度的不同公式。

以下示例计算数组的 l2norm

l2norm(array(2,4,8))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 9.16515138991168
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

标量向量数学

标量向量数学函数对向量中的每个值添加、减去、乘以或除以标量值。以下函数执行这些操作:scalarAddscalarSubtractscalarMultiplyscalarDivide

以下是 scalarMultiply 函数的示例,它将标量值 3 与数组的每个值相乘。

scalarMultiply(3, array(1,2,3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          3,
          6,
          9
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

逐元素向量数学

可以使用逐元素向量数学函数对两个向量进行加法、减法、乘法和除法。可用的逐元素向量数学函数有:ebeAddebeSubtractebeMultiplyebeDivide

以下表达式执行两个数组的逐元素减法。

ebeSubtract(array(10, 15, 20), array(1,2,3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          9,
          13,
          17
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 5
      }
    ]
  }
}

点积和余弦相似性

dotProductcosineSimilarity 函数通常用作两个稀疏向量之间的相似性度量。dotProduct 是角度和幅度的度量,而 cosineSimilarity 仅是角度的度量。

以下是 dotProduct 函数的示例

dotProduct(array(2,3,0,0,0,1), array(2,0,1,0,0,3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 7
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 15
      }
    ]
  }
}

以下是 cosineSimilarity 函数的示例

cosineSimilarity(array(2,3,0,0,0,1), array(2,0,1,0,0,3))

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

{
  "result-set": {
    "docs": [
      {
        "return-value": 0.5
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 7
      }
    ]
  }
}