当移植MATLAB稀疏滤波到f#时,我应该用什么来代替minFunc ?

时间:2021-08-07 06:02:33

I have the following Sparse Filtering MATLAB code that I would like to port to F#. I am aware of F# Type Provider for MATLAB but can't use it here because it would create a dependency on MATLAB (I can use it for testing)

我有如下的稀疏滤波的MATLAB代码,我想把它移植到f#。我知道f#类型的提供程序,但不能在这里使用,因为它会在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

I understand most of the MATLAB code, but I'm not sure what the equivalent of MATLAB's minFunc is in .Net. I believe I want one of the Microsoft.SolverFoundation.Solvers. According to MATLAB's site

我理解大部分的MATLAB代码,但我不知道在。net中,MATLAB的minFunc是什么。我想要一个微软的。solverfoundation。solvers。根据MATLAB的网站

...the default parameters of minFunc call a quasi-Newton strategy, where limited-memory BFGS updates with Shanno-Phua scaling are used in computing the step direction, and a bracketing line-search for a point satisfying the strong Wolfe conditions is used to compute the step direction. In the line search, (safeguarded) cubic interpolation is used to generate trial values, and the method switches to an Armijo back-tracking line search on iterations where the objective function enters a region where the parameters do not produce a real valued output

…minFunc的缺省参数称为准牛顿策略,在计算步骤方向时,使用了有限内存BFGS更新和Shanno-Phua缩放,并使用了一个带括号的线搜索来满足强大的Wolfe条件,用于计算步骤方向。在行搜索中,(安全保护)三次插值用于生成试验值,方法切换到Armijo反向跟踪行搜索,在迭代中目标函数进入一个区域,其中参数不产生实值输出。

Given the above information, can anyone confirm that the Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonModel is the right way to go?

根据以上的信息,任何人都可以确认微软的软件。CompactQuasiNewtonModel是正确的选择吗?

Also, are there any other obvious "gotchas" when porting the above code to F#? (new to this type of port)

在将上述代码移植到f#时,还有其他明显的“gotchas”吗?(新到这类港口)

1 个解决方案

#1


4  

I think CompactQuasiNewtonSolver is your best bet. If you take a look at SolverFoundation's samples, there is CQN sample which demonstrates how to implement and solve the Rosenbrock function. Its results are inline with what I see in minFunc's Rosenbrock example. The sample above is in C#; but it should be easy to translate to F#.

我认为CompactQuasiNewtonSolver是你最好的选择。如果你看一下SolverFoundation的样本,就会发现CQN样本,它演示了如何实现和解决Rosenbrock函数。它的结果与我在minFunc的Rosenbrock示例中看到的一致。上面的示例在c#中;但它应该很容易翻译成f#。

Also, are there any other obvious "gotchas" when porting the above code to F#? (new to this type of port)?

在将上述代码移植到f#时,还有其他明显的“gotchas”吗?(对这类港口来说是新的吗?)

You probably need a good linear algebra package to get close to MATLAB code. Math.Net seems to be an ideal choice since it has good F# support.

你可能需要一个好的线性代数包来接近MATLAB代码。数学。Net似乎是一个理想的选择,因为它有良好的f#支持。

Alternatively, you can reimplement the code using Accord.NET framework. The framework has an implementation of L-BFGS algorithm for optimization in Machine Learning, so it is closer to your purpose.

或者,您可以使用Accord重新实现代码。净框架。该框架在机器学习中实现了L-BFGS算法的优化,使其更接近你的目标。

#1


4  

I think CompactQuasiNewtonSolver is your best bet. If you take a look at SolverFoundation's samples, there is CQN sample which demonstrates how to implement and solve the Rosenbrock function. Its results are inline with what I see in minFunc's Rosenbrock example. The sample above is in C#; but it should be easy to translate to F#.

我认为CompactQuasiNewtonSolver是你最好的选择。如果你看一下SolverFoundation的样本,就会发现CQN样本,它演示了如何实现和解决Rosenbrock函数。它的结果与我在minFunc的Rosenbrock示例中看到的一致。上面的示例在c#中;但它应该很容易翻译成f#。

Also, are there any other obvious "gotchas" when porting the above code to F#? (new to this type of port)?

在将上述代码移植到f#时,还有其他明显的“gotchas”吗?(对这类港口来说是新的吗?)

You probably need a good linear algebra package to get close to MATLAB code. Math.Net seems to be an ideal choice since it has good F# support.

你可能需要一个好的线性代数包来接近MATLAB代码。数学。Net似乎是一个理想的选择,因为它有良好的f#支持。

Alternatively, you can reimplement the code using Accord.NET framework. The framework has an implementation of L-BFGS algorithm for optimization in Machine Learning, so it is closer to your purpose.

或者,您可以使用Accord重新实现代码。净框架。该框架在机器学习中实现了L-BFGS算法的优化,使其更接近你的目标。