次元削減 - RDDベースのAPI

次元削減 は検討中の変数の数を減らす処理です。生およびノイズがある特徴から隠れた特徴を抽出、あるいは構造を保ったままデータを圧縮するために使うことができます。spark.mllibRowMatrix クラス上の次元削減のサポートを提供します。

特異値分解 (SVD)

特異値分解 (SVD) はマトリックスを3つのマトリックスに因数分解します: 以下のような $U$, $\Sigma$, および $V$

\[ A = U \Sigma V^T, \]

ここで

大きなマトリックスに対して、通常は因数分解を完了する必要はありませんが、一番上の特異値とそれに関連する特異ベクトルには必要があります。これはストレージを節約し、ノイズをなくし、そしてマトリックスの低い階級構造を回復します。

一番上の $k$ 特異値を維持すると、結果の低い階級マトリックスの次元は以下のようになるでしょう:

パフォーマンス

$n$ が $m$ より小さいとします。特異値と右特異ベクトルは固有ベクトルとグラム行列 $A^T A$ の固有ベクトルから導かれます。もしcomputeUパラメータを使ってユーザによってリクエストされた場合は、左特異ベクトル $U$ を格納している行列は、$U = A (V S^{-1})$ として行列の掛け算から計算されます。使用する実際のメソッドは計算のコストに基づいて自動的に決定されます。

SVD の例

spark.mllibRowMatrix クラスで提供される、行指向のマトリックスへのSVD機能を提供します。

APIの詳細はSingularValueDecomposition Scala ドキュメント を参照してください。

import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.SingularValueDecomposition
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val data = Array(
  Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
  Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
  Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))

val rows = sc.parallelize(data)

val mat: RowMatrix = new RowMatrix(rows)

// Compute the top 5 singular values and corresponding singular vectors.
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true)
val U: RowMatrix = svd.U  // The U factor is a RowMatrix.
val s: Vector = svd.s     // The singular values are stored in a local dense vector.
val V: Matrix = svd.V     // The V factor is a local dense matrix.
例の完全なコードは Spark のリポジトリの "examples/src/main/scala/org/apache/spark/examples/mllib/SVDExample.scala" で見つかります。

もしUIndexedRowMatrixとして定義される場合は、同じコードがIndexedRowMatrix に適用されます。

APIの詳細はSingularValueDecomposition Java ドキュメント を参照してください。

import java.util.Arrays;
import java.util.List;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.SingularValueDecomposition;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;

List<Vector> data = Arrays.asList(
        Vectors.sparse(5, new int[] {1, 3}, new double[] {1.0, 7.0}),
        Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
        Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
);

JavaRDD<Vector> rows = jsc.parallelize(data);

// Create a RowMatrix from JavaRDD<Vector>.
RowMatrix mat = new RowMatrix(rows.rdd());

// Compute the top 5 singular values and corresponding singular vectors.
SingularValueDecomposition<RowMatrix, Matrix> svd = mat.computeSVD(5, true, 1.0E-9d);
RowMatrix U = svd.U();  // The U factor is a RowMatrix.
Vector s = svd.s();     // The singular values are stored in a local dense vector.
Matrix V = svd.V();     // The V factor is a local dense matrix.
例の完全なコードは Spark のリポジトリの "examples/src/main/java/org/apache/spark/examples/mllib/JavaSVDExample.java" で見つかります。

もしUIndexedRowMatrixとして定義される場合は、同じコードがIndexedRowMatrix に適用されます。

APIの詳細はSingularValueDecomposition Python ドキュメント を参照してください。

from pyspark.mllib.linalg import Vectors
from pyspark.mllib.linalg.distributed import RowMatrix

rows = sc.parallelize([
    Vectors.sparse(5, {1: 1.0, 3: 7.0}),
    Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
    Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
])

mat = RowMatrix(rows)

# Compute the top 5 singular values and corresponding singular vectors.
svd = mat.computeSVD(5, computeU=True)
U = svd.U       # The U factor is a RowMatrix.
s = svd.s       # The singular values are stored in a local dense vector.
V = svd.V       # The V factor is a local dense matrix.
例の完全なコードは Spark のリポジトリの "examples/src/main/python/mllib/svd_example.py" で見つかります。

もしUIndexedRowMatrixとして定義される場合は、同じコードがIndexedRowMatrix に適用されます。

主成分分析 (PCA)

主成分分析 (PCA) は、最初の軸がもっとも大きい確率の分散を持つような回転を見つけるための統計的な方法で、続く各軸が順番に大きな確率の分散を持ちます。回転行列のカラムは主成分と呼ばれます。PCA は次元削減で広く使われています。

spark.mllib は行指向の形式でベクトルの中に格納されているひょろりとしたマトリックスのためのPCAをサポートします。

以下のコードは RowMatrix 上の主成分をどうやって計算するか、それらを使ってベクトルを低次元空間に投影する方法を実演します。

APIの詳細はRowMatrix Scala ドキュメント を参照してください。

import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val data = Array(
  Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
  Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
  Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))

val rows = sc.parallelize(data)

val mat: RowMatrix = new RowMatrix(rows)

// Compute the top 4 principal components.
// Principal components are stored in a local dense matrix.
val pc: Matrix = mat.computePrincipalComponents(4)

// Project the rows to the linear space spanned by the top 4 principal components.
val projected: RowMatrix = mat.multiply(pc)
例の完全なコードは Spark のリポジトリの "examples/src/main/scala/org/apache/spark/examples/mllib/PCAOnRowMatrixExample.scala" で見つかります。

以下のコードは ソースのベクトル上の主成分をどうやって計算するか、それらを使って関係するラベルを維持したままベクトルを低次元空間に投影する方法を実演します:

APIの詳細はPCA Scala ドキュメント を参照してください。

import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD

val data: RDD[LabeledPoint] = sc.parallelize(Seq(
  new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 1)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)),
  new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0))))

// Compute the top 5 principal components.
val pca = new PCA(5).fit(data.map(_.features))

// Project vectors to the linear space spanned by the top 5 principal
// components, keeping the label
val projected = data.map(p => p.copy(features = pca.transform(p.features)))
例の完全なコードは Spark のリポジトリの "examples/src/main/scala/org/apache/spark/examples/mllib/PCAOnSourceVectorExample.scala" で見つかります。

以下のコードは RowMatrix 上の主成分をどうやって計算するか、それらを使ってベクトルを低次元空間に投影する方法を実演します。

APIの詳細はRowMatrix Java ドキュメント を参照してください。

import java.util.Arrays;
import java.util.List;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;

List<Vector> data = Arrays.asList(
        Vectors.sparse(5, new int[] {1, 3}, new double[] {1.0, 7.0}),
        Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
        Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
);

JavaRDD<Vector> rows = jsc.parallelize(data);

// Create a RowMatrix from JavaRDD<Vector>.
RowMatrix mat = new RowMatrix(rows.rdd());

// Compute the top 4 principal components.
// Principal components are stored in a local dense matrix.
Matrix pc = mat.computePrincipalComponents(4);

// Project the rows to the linear space spanned by the top 4 principal components.
RowMatrix projected = mat.multiply(pc);
例の完全なコードは Spark のリポジトリの "examples/src/main/java/org/apache/spark/examples/mllib/JavaPCAExample.java" で見つかります。

以下のコードは RowMatrix 上の主成分をどうやって計算するか、それらを使ってベクトルを低次元空間に投影する方法を実演します。

Refer to the RowMatrix Python docs for details on the API.

from pyspark.mllib.linalg import Vectors
from pyspark.mllib.linalg.distributed import RowMatrix

rows = sc.parallelize([
    Vectors.sparse(5, {1: 1.0, 3: 7.0}),
    Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
    Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
])

mat = RowMatrix(rows)
# Compute the top 4 principal components.
# Principal components are stored in a local dense matrix.
pc = mat.computePrincipalComponents(4)

# Project the rows to the linear space spanned by the top 4 principal components.
projected = mat.multiply(pc)
例の完全なコードは Spark のリポジトリの "examples/src/main/python/mllib/pca_rowmatrix_example.py" で見つかります。
TOP
inserted by FC2 system