向量数学
本节介绍向量数学和向量操作函数。
数组
可以使用 array
函数创建数组。
例如,下面的表达式创建一个包含三个元素的数字数组
array(1, 2, 3)
当此表达式发送到 /stream
处理程序时,它会以 JSON 数组的形式响应
{
"result-set": {
"docs": [
{
"return-value": [
1,
2,
3
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
可视化
可以使用 zplot
函数使用 Zeppelin-Solr 可视化向量。
让我们首先看看将数组函数可视化为表格时会发生什么。
它显示为一行,其中包含以逗号分隔的值列表。您会发现无法使用任何绘图工具可视化此输出。
要绘制数组,您需要 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
}
]
}
}
现在我们有三个带有 x
和 y
字段的元组。
让我们看看 Zeppelin-Solr 如何以表格格式处理此输出
现在我们已经定义了 x
和 y
列,我们可以简单地切换到其中一个折线图,并使用图表设置插入要绘制的字段
每个图表都有设置,可以通过单击设置进行浏览。
您可以切换图表类型以进行不同类型的可视化。下面是条形图的示例
数组操作
数组可以作为参数传递给对数组进行操作的函数。
例如,可以使用 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
(右修剪)函数修剪数组的元素。 ltrim
和 rtrim
函数从数组的左侧或右侧删除特定数量的元素。
下面的示例显示 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
}
]
}
}
向量汇总和范数
这里有一组用于执行汇总并返回数组范数的函数。这些函数对数组进行操作并返回单个值。以下向量汇总和范数函数可用:mult
、add
、sumSq
、mean
、l1norm
、l2norm
、linfnorm
。
下面的示例展示了 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
}
]
}
}
标量向量数学运算
标量向量数学运算函数将一个标量值与向量中的每个值相加、相减、相乘或相除。以下函数执行这些操作:scalarAdd
、scalarSubtract
、scalarMultiply
和 scalarDivide
。
下面是 scalarMultiply
函数的示例,它将标量值 3
与数组的每个值相乘。
scalarMultiply(3, array(1,2,3))
当此表达式发送到 /stream
处理程序时,它会响应
{
"result-set": {
"docs": [
{
"return-value": [
3,
6,
9
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
逐元素向量数学运算
可以使用逐元素向量数学运算函数对两个向量进行加、减、乘和除。可用的逐元素向量数学运算函数有:ebeAdd
、ebeSubtract
、ebeMultiply
、ebeDivide
。
下面的表达式执行两个数组的逐元素减法。
ebeSubtract(array(10, 15, 20), array(1,2,3))
当此表达式发送到 /stream
处理程序时,它会响应
{
"result-set": {
"docs": [
{
"return-value": [
9,
13,
17
]
},
{
"EOF": true,
"RESPONSE_TIME": 5
}
]
}
}
点积和余弦相似度
dotProduct
和 cosineSimilarity
函数通常用作两个稀疏向量之间的相似度度量。 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
}
]
}
}