我开始采用ILNumerics编写自己的机器学习包。

我肯定会进入神经网络,SVM,内核方法,然后开始进入一个更加贝叶斯的框架。

我知道ILNumerics已经提供了一些“机器学习工具箱”,但是我想添加自己的贡献并编写自己的算法,这也是因为尚不存在某些功能(还好吗?)

首先,据我所知,到目前为止,还不包括优化程序包。我希望我错了;如果不是这种情况,将非常感谢有关通过ILNumerics实施它的任何建议;为此,我只是说:混合现有代码会影响性能吗?是否建议将ILArray和其他向量/矩阵混合使用?坚持快速指南中提供的建议就足以利用出色的性能了吗?

或者,如果您愿意,您是否建议将任何预先构建的可用优化程序包/库与ILNumerics结合使用?

非常感谢您的任何提示/建议,建议,

GL

最佳答案

您在所有方面都是正确的。 ILNumerics当前没有优化包。但是,如您所知,.NET的一大优势是易于合并外部软件包。这里有几种选择:

PInvoke(本机模块)

由于大多数现有的优化程序包都作为本机模块存在,因此PInvoke是您的朋友。存在几种用于自动生成DLLImport签名的工具。就个人而言,我更喜欢创建这些签名manually。特别是,由于大多数科学软件包都公开了一个简单的签名,因此很容易将其合并到.NET中。但是,从本机代码到托管代码的回调以及复杂结构的编组会出现问题。 (所以,我们将帮助您解决所有问题……

.NET模块

您可能会找到一个现有的.NET优化模块。请参阅此帖子(Free Optimization Library in C#)或尝试使用Microsoft Solver Foundation。更好的模块可能已经存在-我已经有一段时间了。除非实施非常仔细,否则它们可能会(或可能不会)因不良(无)内存管理而导致性能下降。 (据我所知,没有其他项目可以像ILNumerics一样有效地跟踪内存吗?)。但是,连接这些库很容易:不需要DLLImport签名。但是,为了从ILNumerics内存管理中受益,您将不得不在“ ILNumerics”侧管理阵列内存。因此,将一些System.Array赋予其他.NET函数的模式将是:

 .... inside ILNumerics function
 using (ILScope.Enter(inparameter1,inparameter2)) {
    ....
    ILArray<double> A = zeros(1000,1000);  // allocate memory for external use
    var aArray = A.GetArrayForWrite();     // fetch reference to underlying System.Array
    callOtherLib(aArray);                  // let other lib use and fill the array
    // proceed normally with A...
    return A + 1 * 2 ... ;
 }


如果另一个库仅从给定数组中读取,则A.GetArrayForRead()可能会提供更好的性能。通过使用该方案,可以确保最有效的内存使用-至少在实现的ILNumerics方面。

从两侧混合数据结构不会造成任何危害-但通常也不会带来太多好处:通常会减少方便的语法,因为没有混合矩阵实现的组合运算符。同样,您经常会被迫将矩阵访问分解为元素操作,这可能会导致性能降低的解决方案。因此,我建议采用带有明显分离的API的模块化设计。

上面的内存方案也适用于(建议使用)接口本机库。

仅使用ILNumerics

当然,另一种方法是使用ILNumerics内置函数和数组功能自行重新实现某些模块。为了使任何软件包都可以并入官方ILNumerics发行版,这种方法是强制性的。它具有几个优点:可以利用便捷的ILNumerics语法,自动从高效的ILNumerics内存管理中获利,并且最后该代码将完全独立于平台。而且,这为您提供了算法所需功能方面的最大灵活性。

关于c# - 推荐的ILNumerics优化软件包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18447022/

10-10 05:47