将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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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