我开始编写自己的机器学习包,采用ILNumerics。
我一定会进入神经网络,SVM,内核方法,然后我将开始进入更多的贝叶斯框架。
我知道ILNumerics已经提供了一些'机器学习工具箱',但是我想添加我的贡献并编写我自己的算法代码,还因为某些功能不存在(还有吗?)
首先,如果我理解得很好,截至目前还没有包含优化包。我希望我错了;如果不是这样的话,那么关于如何通过ILNumerics实现它的任何建议都将受到高度赞赏;为此,我只是说:混合预先存在的代码会影响性能?混合ILArray和其他载体/矩阵是否可取?坚持快速指南中提供的建议就足以利用出色的表现了吗?
或者,如果您愿意,您是否会建议任何预先构建的可用优化包/库与ILNumerics一起使用?
非常感谢任何提示/建议,照常建议,
GL
答案 0 :(得分:2)
你是对的。目前ILNumerics中没有可用的优化包。但是,正如您所知,.NET的一大优势是易于整合外部包。这里有几个选项:
由于大多数现有优化包都以本机模块形式存在,因此PInvoke是您的朋友。存在用于自动DLLImport签名生成的若干工具。就个人而言,我更喜欢创建这些签名manually。特别是,由于大多数科学软件包都暴露了一个简单的签名,很容易将其整合到.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内存管理中获利,并且代码最终将完全独立于平台。此外,这为您的算法所需的功能提供了最大的灵活性。
答案 1 :(得分:2)