ベクトル演算

このセクションでは、ベクトル演算とベクトル操作関数について説明します。

配列

配列は、`array`関数を使用して作成できます。

たとえば、以下の式は3つの要素を持つ数値配列を作成します

array(1, 2, 3)

この式を`/stream`ハンドラに送信すると、JSON配列で応答します

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

可視化

`zplot`関数を使用して、Zeppelin-Solrを使用してベクトルを可視化できます。

最初に、配列関数をテーブルとして可視化するとどうなるかを見てみましょう。

array

コンマ区切りの値のリストを持つ1行として表示されます。この出力は、どのプロットツールを使用していても可視化できないことがわかります。

配列をプロットするには、`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`を持つ3つのタプルに変換しました。

別の配列を追加してみましょう

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`フィールドを持つ3つのタプルができました。

Zeppelin-Solrがこの出力をテーブル形式でどのように処理するかを見てみましょう

xy

これで`x`と`y`の列が定義されたので、線チャートの1つに切り替えて、チャート設定を使用してプロットするフィールドをプラグインするだけです

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`(右トリミング)関数を使用してトリミングできます。 `ltrim`関数と`rtrim`関数は、配列の左または右から指定された数の要素を削除します。

以下の例は、`ltrim`関数を使用して配列の最初の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`。

以下は、スカラー値`3`を配列のすべての値に乗算する`scalarMultiply`関数の例です。

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

この式を`/stream`ハンドラに送信すると、次のようになります。

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

要素ごとのベクトル演算

2つのベクトルは、要素ごとのベクトル演算関数を使用して加算、減算、乗算、除算できます。使用可能な要素ごとのベクトル演算関数は次のとおりです:`ebeAdd`、`ebeSubtract`、`ebeMultiply`、`ebeDivide`。

以下の式は、2つの配列の要素ごとの減算を実行します。

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`関数は、多くの場合、2つの疎ベクトル間の類似度尺度として使用されます。 `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
      }
    ]
  }
}