向量数学

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

数组

可以使用 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 函数生成数字序列作为数组。下面的示例返回一个包含 10 个数字的序列,从 0 开始,步长为 2。

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。

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
      }
    ]
  }
}