2013-08-26 29 views
2

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

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

我知道ILNumerics已经提供了一些“机器学习工具箱”,但我想补充我的贡献和代码我自己的算法,也因为一些功能是不存在的(没有?)

首先,如果我理解的很好,截至目前还没有优化软件包。我希望我错了;如果情况并非如此,那么有关如何通过ILNumerics实现它的任何建议都将受到高度赞赏;对此我只是表示:混合预先存在的代码会影响性能?混合ILArray和其他向量/矩阵是否可取?坚持快速指南中提供的建议足以充分发挥出色表现?或者,如果您愿意,您会推荐任何预先构建的可用优化软件包/库与ILNumerics结合使用吗?

非常感谢任何提示/意见,建议像往常一样,

GL

回答

2

你是对所有点。 ILNumerics目前没有优化软件包。但是,正如您所知,.NET的一大优势是易于整合外部封装。有几个选项存在这里:

的PInvoke(本机模块)

由于大多数现有的优化包存在作为本机模块,PInvoke的是你的朋友。存在几种自动DLLImport签名生成工具。我个人更喜欢创建这些签名manually。尤其是,由于大多数科学软件包都提供了一个简单的签名,该签名很容易并入.NET。但是,从本机到托管代码的回调和复杂结构的编组问题可能会出现。 (SO,我们将帮助您解决所有这些...

.NET模块

您可能会发现现有的.NET优化模块。看到这个职位(Free Optimization Library in C#)或尝试使用Microsoft求解基础,更好的模块可已经存在 - 我还没有找过一段时间,除非执行过程非常仔细,否则它们可能会因性能不佳(无)内存管理而受到影响(据我所知,没有其他项目会跟踪内存与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 ... ; 
} 

如果其它LIB从给定的阵列读取只,A.GetArrayForRead()可以给出更好的性能。通过使用该方案,可以确保最有效的内存使用 - 至少在实现的ILNumerics方面。

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

上述内存方案也适用于(并建议)接口本机库。当然 - -

使用ILNumerics只有

另一种方法是重新实现一些自己的模块,使用内置的功能和特性阵列ILNumerics。这种方式是强制性的,以便任何软件包都被纳入官方的ILNumerics发行版。它带来了几个优点:可以利用方便的ILNumerics语法,自动从高效的ILNumerics内存管理中获益,并且代码将在最终完全与平台无关。此外,这为您提供了关于算法所需功能的最大灵活性。

+0

感谢如常。我想我正走向艰难的道路:编码我自己的优化器。因此我想我还有一个问题:我可以使用并行化,即Parallel类,还是ILArrays?处理这个问题的最好方法是什么?我应该把它们当作任何数据结构吗?在此先感谢 –

+0

ILNumerics中的所有内置函数在内部自动并行化。但是,ILArray不*线程安全。在多线程场景中处理ILArray时,您将不得不使用通用同步选项。如果您有其他疑虑,请打开一个新问题。 –