将MATLAB的稀疏过滤算法移植到F#时,应使用哪种求解器来替代minFunc?

我有以下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算法的实现,因此更接近你的目的。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注