我开始采用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/