我有以下MATLAB稀疏过滤代码,我想将其移植到F#。我知道F#的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)]);endfunction [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(:);endfunction [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);endfunction [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代码,但我不确定在.Net中MATLAB的minFunc
的等价物是什么。我认为我想要的是Microsoft.SolverFoundation.Solvers
中的一个。根据MATLAB的网站
…minFunc的默认参数调用了一种准牛顿策略,其中使用有限内存BFGS更新和Shanno-Phua缩放来计算步长方向,并使用满足强Wolfe条件的括号线搜索来计算步长方向。在线搜索中,使用(安全的)三次插值生成试验值,并且在目标函数进入参数不产生实值输出的区域时,方法会切换到Armijo回溯线搜索
根据上述信息,任何人能确认Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonModel是正确的选择吗?
此外,在将上述代码移植到F#时,还有其他明显的“陷阱”吗?(对这种类型的移植还不熟悉)
回答:
我认为CompactQuasiNewtonSolver是你最好的选择。如果你查看SolverFoundation的示例,有一个CQN
示例,展示了如何实现和求解Rosenbrock函数。它的结果与我在minFunc的Rosenbrock示例中看到的结果一致。上述示例是用C#编写的;但将其翻译成F#应该很容易。
此外,在将上述代码移植到F#时,还有其他明显的“陷阱”吗?(对这种类型的移植还不熟悉)?
你可能需要一个好的线性代数包来接近MATLAB代码。Math.Net似乎是一个理想的选择,因为它有很好的F#支持。
或者,你可以使用Accord.NET框架重新实现代码。该框架有一个用于机器学习优化的L-BFGS算法的实现,因此更接近你的目的。