向量数学
本节介绍向量数学和向量操作函数。
数组
可以使用 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
函数可用于生成一个数字序列作为数组。以下示例返回一个由 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
}
]
}
}
向量汇总和范数
有一组函数执行汇总并返回数组的范数。这些函数对数组进行操作并返回一个值。以下向量汇总和范数函数可用: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
}
]
}
}