[英]What solver should I use to replace the minFunc when porting MATLAB Sparse Filtering to F#
我有以下稀疏過濾MATLAB代碼 ,我想移植到F#。 我知道MATLAB的F#Type Provider,但是不能在這里使用它因為它會在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條件的點計算步進方向。 在線搜索中,(安全保護的)三次插值用於生成試驗值,並且該方法切換到Armijo反向跟蹤線搜索迭代,其中目標函數進入參數不產生實值輸出的區域
鑒於以上信息,任何人都可以確認Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonModel是正確的方法嗎?
此外,將上述代碼移植到F#時還有其他明顯的“陷阱”嗎? (這種類型的端口新)
我認為CompactQuasiNewtonSolver是你最好的選擇。 如果你看一下SolverFoundation的樣本 ,就會有CQN
示例演示如何實現和解決Rosenbrock函數。 它的結果與我在minFunc的Rosenbrock示例中看到的結果一致 。 上面的示例是C#; 但它應該很容易翻譯成F#。
此外,將上述代碼移植到F#時還有其他明顯的“陷阱”嗎? (這種類型的端口新手)?
你可能需要一個好的線性代數包來接近MATLAB代碼。 Math.Net似乎是一個理想的選擇,因為它具有良好的F#支持。
或者,您可以使用Accord.NET框架重新實現代碼。 該框架具有L-BFGS算法的實現,用於機器學習中的優化,因此它更接近您的目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.