F# に移植したい次のSparse Filtering MATLAB コードがあります。F# Type Provider for MATLAB は知っていますが、MATLAB への依存関係が作成されるため、ここでは使用できません (テストに使用できます)。
function [optW] = SparseFiltering(N, X);
% N = # features to learn, X = input data (examples in column)
% You should pre-process X by removing the DC component per example,
% before calling this function.
% e.g., X = bsxfun(@minus, X, mean(X));
addpath minFunc/ % Add path to minFunc optimization package
optW = randn(N, size(X, 1));
optW = minFunc(@SparseFilteringObj, optW(:), struct('MaxIter', 100), X, N);
optW = reshape(optW, [N, size(X, 1)]);
end
function [Obj, DeltaW] = SparseFilteringObj (W, X, N)
% Reshape W into matrix form
W = reshape(W, [N, size(X,1)]);
% Feed Forward
F = W*X; % Linear Activation
Fs = sqrt(F.ˆ2 + 1e-8); % Soft-Absolute Activation
[NFs, L2Fs] = l2row(Fs); % Normalize by Rows
[Fhat, L2Fn] = l2row(NFs'); % Normalize by Columns
% Compute Objective Function
Obj = sum(sum(Fhat, 2), 1);
% Backprop through each feedforward step
DeltaW = l2grad(NFs', Fhat, L2Fn, ones(size(Fhat)));
DeltaW = l2grad(Fs, NFs, L2Fs, DeltaW');
DeltaW = (DeltaW .* (F ./ Fs)) * X';
DeltaW = DeltaW(:);
end
function [Y,N] = l2row(X) % L2 Normalize X by rows
% We also use this to normalize by column with l2row(X')
N = sqrt(sum(X.ˆ2,2) + 1e-8);
Y = bsxfun(@rdivide,X,N);
end
function [G] = l2grad(X,Y,N,D) % Backpropagate through Normalization
G = bsxfun(@rdivide, D, N) - bsxfun(@times, Y, sum(D.*X, 2) ./ (N.ˆ2));
end
私は MATLAB コードのほとんどを理解していますが、MATLAB に相当するコードがminFunc
.Net にあるかどうかはわかりません。のいずれかが欲しいと思いMicrosoft.SolverFoundation.Solvers
ます。MATLABのサイトによると
... minFunc のデフォルト パラメータは準ニュートン戦略を呼び出します。ここでは、Shanno-Phua スケーリングを使用した限られたメモリの BFGS 更新がステップ方向の計算に使用され、強い Wolfe 条件を満たす点のブラケット ライン検索が使用されます。ステップ方向を計算します。ライン サーチでは、(保護された) 3 次補間を使用して試行値を生成し、目的関数がパラメーターが実数値の出力を生成しない領域に入る繰り返しで、メソッドは Armijo バック トラッキング ライン サーチに切り替わります。
上記の情報を考慮して、 Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonModelが正しい方法であると誰でも確認できますか?
また、上記のコードを F# に移植する際に、他に明らかな「落とし穴」はありますか? (このタイプのポートには新しい)