はじめに
この実験では、scikit-learn ライブラリを使って次元削減におけるランダム射影を調べます。ランダム射影は、サンプル間のペアワイズ距離を保ちながら、データの次元を削減するために使うことができる手法です。これは、機械学習アルゴリズムの計算速度を上げ、メモリ使用量を削減するのに役立ちます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
この実験に必要なライブラリをインポートして始めましょう。
import numpy as np
from sklearn import random_projection
ランダムなデータを生成する
次に、次元削減に使用できるいくつかのランダムなデータを生成しましょう。
X = np.random.rand(100, 10000)
ここでは、100 個のサンプルと 10,000 個の特徴を持つ 2 次元配列 X を生成します。これが、元の高次元データになります。
ガウス型ランダム射影
次に、データの次元を削減するためにガウス型ランダム射影を適用しましょう。
transformer = random_projection.GaussianRandomProjection()
X_new = transformer.fit_transform(X)
このステップでは、GaussianRandomProjection クラスのインスタンスを作成し、データ X に適合させます。その後、fit_transform メソッドを呼び出すことで変換を適用します。結果は X_new 変数に格納されます。
疎ランダム射影
次に、疎ランダム射影と呼ばれる別の種類のランダム射影を試してみましょう。
transformer = random_projection.SparseRandomProjection()
X_new = transformer.fit_transform(X)
ここでは、SparseRandomProjection クラスのインスタンスを作成し、fit_transform メソッドを使ってデータ X に適用します。結果は X_new 変数に格納されます。
逆変換
ランダム射影変換器には、射影行列の逆行列を計算するオプションがあります。射影されたデータに逆変換を適用することで、この機能を調べてみましょう。
transformer = random_projection.SparseRandomProjection(compute_inverse_components=True)
X_new = transformer.fit_transform(X)
## Compute the inverse transform
X_new_inversed = transformer.inverse_transform(X_new)
このステップでは、compute_inverse_components パラメータを True に設定して SparseRandomProjection クラスのインスタンスを作成します。その後、変換器をデータ X に適合させて変換を適用します。最後に、射影されたデータ X_new に対して inverse_transform メソッドを呼び出すことで逆変換を計算します。
検証
逆変換の正確性を検証するために、元のデータ X と逆変換の結果を比較することができます。
X_new_again = transformer.transform(X_new_inversed)
np.allclose(X_new, X_new_again)
ここでは、逆変換されたデータ X_new_inversed に変換を適用し、np.allclose 関数を使ってそれが元の射影データ X_new と等しいかどうかを確認します。
まとめ
この実験では、scikit-learn ライブラリを使って次元削減のためのランダム射影を行う方法を学びました。ガウス型ランダム射影と疎ランダム射影の両方の手法を調べました。また、射影されたデータの逆変換を計算して元のデータを復元する方法も学びました。ランダム射影は、機械学習のタスクにおいて高次元データの次元を削減するための便利なツールになり得ます。