Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

refit

分類用の近傍成分分析 (NCA) モデルの再当てはめ

構文

mdlrefit = refit(mdl,Name,Value)

説明

mdlrefit = refit(mdl,Name,Value) は、1 つ以上の Name,Value ペア引数で指定された修正パラメーターを使用して、モデル mdl を再度当てはめます。

入力引数

すべて展開する

分類用の近傍成分分析モデル。FeatureSelectionNCAClassification オブジェクトとして指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

当てはめオプション

すべて展開する

モデルの当てはめ方式。'FitMethod' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'exact' — すべてのデータを使用して当てはめを実行します。

  • 'none' — 当てはめを行いません。fscnca を呼び出すときに指定した特徴量の重みの初期値を使用して NCA モデルの汎化誤差を評価する場合に、このオプションを使用します。

  • 'average' — データをサブセットに分割し、exact 法を使用して各分割を当てはめ、特徴量の重みの平均を返します。名前と値のペアの引数 NumPartitions を使用して分割数を指定できます。

例: 'FitMethod','none'

正則化パラメーター。'Lambda' と非負のスカラー値から構成されるコンマ区切りのペアとして指定します。

n 個の観測値がある場合、NCA モデルの汎化誤差を最小化する最良の Lambda の値は 1/n の整数倍であると考えられます。

例: 'Lambda',0.01

データ型: double | single

特徴量の重みを推定するソルバーのタイプ。'Solver' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'lbfgs' — メモリ制限 BFGS (Broyden-Fletcher-Goldfarb-Shanno) アルゴリズム (LBFGS アルゴリズム)

  • 'sgd' — 確率的勾配降下法

  • 'minibatch-lbfgs' — LBFGS アルゴリズムをミニバッチに適用した確率的勾配降下

例: 'solver','minibatch-lbfgs'

特徴量の重みの初期値。'InitialFeatureWeights' と正の実数スカラー値による p 行 1 列のベクトルから構成されるコンマ区切りのペアとして指定します。

データ型: double | single

収束概要表示の詳細レベルのインジケーター。'Verbose' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 0 — 収束概要なし

  • 1 — 反復回数、勾配のノルム、目的関数の値を含む収束概要。

  • 1 より大きい値 — 当てはめたアルゴリズムに応じたより多くの収束情報

    ソルバー 'minibatch-lbfgs' を使用する場合に詳細レベルを 1 より大きい値にすると、中間的なミニバッチ LBFGS の当てはめによる反復ログが収束情報に含まれます。

例: 'Verbose',2

データ型: double | single

LBFGS またはミニバッチ LBFGS のオプション

すべて展開する

ソルバーが lbfgs である場合の、勾配ノルムに対する収束の相対許容誤差。'GradientTolerance' と正の実数スカラー値から構成されるコンマ区切りのペアとして指定します。

例: 'GradientTolerance',0.00001

データ型: double | single

SGD またはミニバッチ LBFGS のオプション

すべて展開する

ソルバーが sgd である場合の初期学習率。'InitialLearningRate' と正のスカラー値から構成されるコンマ区切りのペアとして指定します。

ソルバー タイプとして 'sgd' を使用する場合、学習率は 'InitialLearningRate' で指定された値から始まって反復ごとに減衰します。

例: 'InitialLearningRate',0.8

データ型: double | single

ソルバーが 'sgd' (確率的勾配降下) である場合の通過の最大回数。'PassLimit' と正の整数から構成されるコンマ区切りのペアとして指定します。1 回通過するごとに、size(mdl.X,1) 個の観測値が処理されます。

例: 'PassLimit',10

データ型: double | single

SGD、LBFGS またはミニバッチ LBFGS のオプション

すべて展開する

最大反復回数。'IterationLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。

例: 'IterationLimit',250

データ型: double | single

出力引数

すべて展開する

分類用の近傍成分分析モデル。FeatureSelectionNCAClassification オブジェクトとして返されます。結果を新しいモデルとして保存するか、mdl = refit(mdl,Name,Value) として既存のモデルを更新することができます。

すべて展開する

関数 generateCheckerBoardData.m を使用してチェッカーボード データを生成します。

rng(2016,'twister'); % For reproducibility
pps = 1375;
[X,y] = generateCheckerBoardData(pps);
X = X + 2;

データをプロットする。

figure
plot(X(y==1,1),X(y==1,2),'rx')
hold on
plot(X(y==-1,1),X(y==-1,2),'bx')

[n,p] = size(X)
n =

       22000


p =

     2

無関係な予測子をデータに追加します。

Q = 98;
Xrnd = unifrnd(0,4,n,Q);
Xobs = [X,Xrnd];

このコードにより、すべてが 0 と 4 の間で均等に分散している 98 個の追加予測子が作成されます。

データを学習セットとテスト セットに分割します。層化区分を作成し、各分割が似たクラス比率を持つようにするため、分割基準として length(y) ではなく y を使用します。

cvp = cvpartition(y,'holdout',2000);

cvpartition は、テスト セットに追加する 2000 個の観測値を無作為に選択します。残りのデータは学習セットに追加されます。cvpartition オブジェクト cvp に格納されている割り当てを使用して、学習セットと検証セットを作成します。

Xtrain = Xobs(cvp.training(1),:);
ytrain = y(cvp.training(1),:);

Xval = Xobs(cvp.test(1),:);
yval = y(cvp.test(1),:);

特徴選択を行わない場合の誤分類誤差を計算します。

nca = fscnca(Xtrain,ytrain,'FitMethod','none','Standardize',true, ...
    'Solver','lbfgs');
loss_nofs = loss(nca,Xval,yval)
loss_nofs =

    0.5165

'FitMethod','none' オプションでは、既定の重み (すべてが 1) が使用されます。つまり、すべての特徴量が同じ重要度になります。

次に、分類用の近傍成分分析を使用して、$\lambda = 1/n$ で特徴選択を実行します。

w0 = rand(100,1);
n = length(ytrain)
lambda = 1/n;
nca = refit(nca,'InitialFeatureWeights',w0,'FitMethod','exact', ...
       'Lambda',lambda,'solver','sgd');
n =

       20000

目的関数の値と反復回数をプロットします。

figure()
plot(nca.FitInfo.Iteration,nca.FitInfo.Objective,'ro')
hold on
plot(nca.FitInfo.Iteration,movmean(nca.FitInfo.Objective,10),'k.-')
xlabel('Iteration number')
ylabel('Objective value')

特徴選択を行った場合の誤分類誤差を計算します。

loss_withfs = loss(nca,Xval,yval)
loss_withfs =

    0.0115

選択された特徴量をプロットします。

figure
semilogx(nca.FeatureWeights,'ro')
xlabel('Feature index')
ylabel('Feature weight')
grid on

特徴量の重みおよび相対的なしきい値を使用して、特徴量を選択します。

tol = 0.15;
selidx = find(nca.FeatureWeights > tol*max(1,max(nca.FeatureWeights)))
selidx =

     1
     2

特徴選択により結果が改善され、fscnca は 2 つの正しい特徴量が関連することを判別します。

バージョン履歴

R2016b で導入