矩阵和矩阵数学

矩阵既可用作许多数学函数的输入,也可用作输出。本用户指南的这一部分涵盖了矩阵创建、操作和矩阵数学的基础知识。

矩阵

可以使用 matrix 函数创建矩阵。matrix 函数传递一个 arrays 列表,其中每个数组表示矩阵中的一个

以下示例创建了一个 2x2 矩阵。

matrix(array(1, 2),
       array(4, 5))

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

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

行标签和列标签

矩阵可以有列和行标签。可以使用 setRowLabelssetColumnLabelsgetRowLabelsgetColumnLabels 函数来设置和获取标签。标签值使用字符串数组设置。

以下示例设置行标签和列标签。在用户指南的其他部分中,显示了函数返回已设置标签的矩阵的示例。

下面是一个在矩阵上设置和获取行标签和列标签的简单示例。

let(echo="d, e",
    a=matrix(array(1, 2),
             array(4, 5)),
    b=setRowLabels(a, array("rowA", "rowB")),
    c=setColumnLabels(b, array("colA", "colB")),
    d=getRowLabels(c),
    e=getColumnLabels(c))

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

{
  "result-set": {
    "docs": [
      {
        "d": [
          "rowA",
          "rowB"
        ],
        "e": [
          "colA",
          "colB"
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

可视化

zplot 函数可以使用 heat 命名参数将矩阵绘制为热图。热图是显示相关性距离矩阵(本指南后面介绍)的强大可视化工具。以下示例显示了使用 Apache Zeppelin 中的热图可视化绘制的 2x2 矩阵。

在下面的可视化中,行是从底部向上读取的,这是热图的常见惯例。
matrix

访问行和列

可以使用 rowAtcolAt 函数访问矩阵的行和列。

以下示例创建一个 2x2 矩阵并返回矩阵的第二列。请注意,在此示例中,矩阵传递的是变量,而不是直接传递数组列表。

let(a=array(1, 2),
    b=array(4, 5),
    c=matrix(a, b),
    d=colAt(c, 1))

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

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

矩阵属性

矩阵还可以具有与之关联的一组任意命名的属性。某些函数(例如 termVectors 函数)返回包含描述矩阵中数据的属性的矩阵。

可以使用 getAttribute 函数按名称检索属性,可以使用 getAttributes 函数返回整个属性映射。

矩阵维度

可以使用 rowCountcolumnCount 函数确定矩阵的维度。

下面的示例检索矩阵的维度。

let(echo="b,c",
    a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=rowCount(a),
    c=columnCount(a))

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

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

矩阵转置

可以使用 transpose 函数对矩阵进行转置

下面显示了矩阵转置的一个示例

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=transpose(a))

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

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            1,
            4
          ],
          [
            2,
            5
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 24
      }
    ]
  }
}

矩阵求和

可以使用 sumRowssumColumns 函数对矩阵的行和列求和。下面是 sumRows 函数的一个示例,它返回一个包含每行和的数组。

let(a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=sumRows(a))

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

{
  "result-set": {
    "docs": [
      {
        "b": [
          6,
          15
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 2
      }
    ]
  }
}

grandSum 函数返回矩阵中所有值的和。下面是 grandSum 函数的一个示例

let(a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=grandSum(a))

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

{
  "result-set": {
    "docs": [
      {
        "b": 21
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

标量矩阵数学

应用于向量的相同标量数学函数也可以应用于矩阵:scalarAddscalarSubtractscalarMultiplyscalarDivide

下面是 scalarAdd 函数的一个示例,它将一个标量值添加到矩阵中的每个元素。

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=scalarAdd(10, a))

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

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            11,
            12
          ],
          [
            14,
            15
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

矩阵加法和减法

可以使用 ebeAddebeSubtract 函数对两个矩阵进行加法和减法,这两个函数执行矩阵的逐元素加法和减法。

下面是一个简单的示例,说明如何使用 ebeAdd 对矩阵进行逐元素加法

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=ebeAdd(a, a))

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

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            2,
            4
          ],
          [
            8,
            10
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

矩阵乘法

可以使用 matrixMult 函数完成矩阵乘法。下面是矩阵乘法的一个简单示例

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=matrix(array(11, 12),
             array(14, 15)),
    c=matrixMult(a, b))

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

{
  "result-set": {
    "docs": [
      {
        "c": [
          [
            39,
            42
          ],
          [
            114,
            123
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}