11 CUR行列分解

属性重要度にCUR分解ベースのアルゴリズムを使用する方法を学習します。

11.1 CUR行列分解とは

CUR行列分解は、データ行列に含まれる少数の実際の列または実際の行(あるいはその両方)で明示的に表現される低ランクの行列分解アルゴリズムです。

CUR行列分解は、特異値分解(SVD)および主成分分析(PCA)の代替方法として開発されました。CUR行列分解では、データ行列から高い統計的レバレッジまたは大きな影響を示す列と行を選択します。CUR行列分解アルゴリズムを実装することで、元のデータ行列から少数の最も重要な属性や列を特定できます。そのため、CUR行列分解は探索的データ分析の重要なツールになります。CUR行列分解は様々な領域に適用可能で、回帰分類およびクラスタリングが容易になります。

関連トピック

11.2 特異ベクター

特異値分解(SVD)は、CUR行列分解の最初のステップです。

SVDは、列と行のレバレッジ・スコアを計算するために左右の特異ベクターを返します。次に示す行列に対してSVDを実行します。

A ε Rmxn

この行列は、次のように因数分解されます。

A=UΣVT

U = [u1 u2...um]およびV = [v1 v2...vn]は直交行列です。

Σは、対角上に負ではない実数σ1,...,σρを含むm ×nの対角行列です。ρ = min {m,n}σξは、Aξthの特異値です。

uξおよびvξAのξthの右および左特異ベクターとすると、Aのjthの列は、次に示すように、上位k個の特異ベクターおよび対応する単一値によって近似できます。

vξjは、ξthの右特異ベクターのjthの座標です。

11.3 統計的レバレッジ・スコア

統計的レバレッジ・スコアは、列(または属性)と行の重要度を表します。

すべての列の正規化された統計的レバレッジ・スコアは、次に示すように、上位k個の右特異ベクターから計算されます。

kはランク・パラメータと呼ばれるものです。jは、1,...,nです。πj>=0と仮定すると、 これらのスコアにより、n列にわたる確率分布が形成されます。

同様に、すべての行の正規化された統計的レバレッジ・スコアは、次に示すように、上位k個の左特異ベクターから計算されます。

iは、1,...,mです。

11.4 列(属性)選択と行選択

列(属性)選択と行選択は、CUR行列分解の最終段階です。

属性選択: レバレッジ・スコアが高い属性を選択して、その属性の名前、スコア(重要度として)およびランク(重要度による)を報告します。

行選択: レバレッジ・スコアが高い行を選択して、その列の名前、スコア(重要度として)およびランク(重要度による)を報告します。

  1. CUR行列分解では、まず、すべてのj ε {1,...,n}に対してpj= min {1,j}の確率でAjthの列(または属性)が選択されます。

  2. ユーザーが行選択を有効にしていると、すべてのi ε {1,...,m}に対してi = min {1,rπˊi}の確率でAithの行が選択されます。

  3. 選択したすべての属性(行の重要度が無効化されている場合)または選択したすべての属性と行(行の重要度が有効化されている場合)の名前(またはID)とレバレッジ・スコア(重要度として)が報告されます。

cはユーザーが選択する列の概算(見込)数です。また、rはユーザーが選択する行の概算(見込)数です。

列選択および行選択を実現するには、それぞれの列と行を選択する確率を計算する必要があります。

列ごとの確率は、次のように計算します。

pj = min {1,cπj}

行ごとの確率は、次のように計算します。

i = min{1, cπˊi}

あるしきい値よりも確率が高い場合に、列または行が選択されます。

11.5 CUR行列分解アルゴリズムの構成

CUR行列分解アルゴリズムの構成について学習します。

例11-1 例

この例は、CUR行列分解アルゴリズムの構築方法についての説明です。設定表が作成され、CUR行列分解に関連する設定が移入されたときに、設定表にアルゴリズムを指定する行を挿入します。

INSERT INTO SETTINGS_TABLE (setting_name, setting_value) VALUES
('ALGO_NAME', 'ALGO_CUR_DECOMPOSITION');

次のようにモデルを構築します。

BEGIN
DBMS_DATA_MINING.CREATE_MODEL(
model_name          	=> 'model-name',
mining_function     	=> dbms_data_mining.attribute_importance,
data_table_name     	=> 'test_table',
case_id_column_name 	=> 'id',
settings_table_name 	=> 'settings_table');
END;
/

行選択

この機能を使用するには、行の重要度が有効であることを指定する行を設定表に挿入します。

INSERT INTO SETTINGS_TABLE (setting_name, setting_value) VALUES ('CURS_ROW_IMPORTANCE', 'CURS_ROW_IMP_ENABLE'); 

ノート:

行選択は、行の重要度が有効であることをユーザーが指定していて、CASE_ID列が存在する場合にのみ実行されます。