ILNumerics的推荐优化包

时间:2013-08-26 14:53:12

标签: c# optimization visual-studio-2012 svm ilnumerics

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

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

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

首先,如果我理解得很好,截至目前还没有包含优化包。我希望我错了;如果不是这样的话,那么关于如何通过ILNumerics实现它的任何建议都将受到高度赞赏;为此,我只是说:混合预先存在的代码会影响性能?混合ILArray和其他载体/矩阵是否可取?坚持快速指南中提供的建议就足以利用出色的表现了吗?

或者,如果您愿意,您是否会建议任何预先构建的可用优化包/库与ILNumerics一起使用?

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

GL

2 个答案:

答案 0 :(得分:2)

你是对的。目前ILNumerics中没有可用的优化包。但是,正如您所知,.NET的一大优势是易于整合外部包。这里有几个选项:

PInvoke(本机模块)

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

.NET模块

您可能会找到现有的.NET优化模块。请参阅此帖子(Free Optimization Library in C#)或尝试Microsoft Solver Foundation。更好的模块可能已经存在 - 我没有看过一段时间。除非非常谨慎地执行,否则由于(无)内存管理不佳,它们可能会或可能不会受到影响。 (据我所知,没有其他项目跟ILNumerics一样跟踪内存的效率如何?)。但是,连接这些库很容易:不需要DLLImport签名。但是为了从ILNumerics内存管理中获利,您必须在'ILNumerics'端管理阵列内存。因此,为某些其他.NET函数提供一些System.Array的模式将是:

 .... 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 ... ; 
 }

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

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

上面的内存方案也适用于(并推荐)用于连接本机库。

仅使用ILNumerics

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

答案 1 :(得分:2)