我正在尝试在java(小型)中实现神经网络,并且我正在使用学习算法的反向传播。这需要找到一般的衍生物。如何在java中找到常规衍生物?
答案 0 :(得分:3)
尝试Helmut Dersch的Jasymca 2 http://webuser.hs-furtwangen.de/~dersch/jasymca2/。它是一个提供GNU Octave / Matlab功能的Java API。它包括符号数学。
Jasymca最近一直在努力。该文档是从2009年3月开始的,它需要Java 1.5 +。
CAVEAT:Jasymca是GPL,所以在将其用于商业产品之前请咨询律师。
答案 1 :(得分:1)
取决于您是否拥有连续或离散数据。我猜你有离散数据,因为我们在讨论神经网络。
有限差分是近似导数的一种方法。另一种方法可能是进行某种拟合并区分拟合函数,假设它是一个众所周知的函数,具有易于计算的导数(例如,多项式)。
您的数据有多少个自变量?一个变量的功能很容易;两个或两个以上更难,因为你需要偏导数。
答案 2 :(得分:1)
好吧,如果你正在做神经网络,你很可能不需要只使用一些任意函数的一般导数。这就是你需要一个通用的微积分库。 Backprop要求您使用激活函数的衍生物。通常,您的激活函数将是sigmoid函数或双曲线tan函数。这两个你可以从维基百科得到衍生物,并简单地为你的神经网络训练提供这个功能。您不需要每次都实际解决导数。
还有其他常见的激活功能,但实际上只有少数实际使用过。只需查看衍生物并使用您想要的那个。大多数神经网络框架只是构建常规激活函数,并衍生成您使用的某种基类。以下是一些最常见的:
http://www.heatonresearch.com/online/programming-neural-networks-encog-java/chapter-3/page2.html
答案 3 :(得分:1)
您应该尝试对其进行硬编码
double derivative = (f(x+h) - f(x-h)) / (2*h);
答案 4 :(得分:0)
我很确定java没有用于微积分功能的内置库。但是,它可以在任何地方从微不足道到非常具有挑战性的自己实现差异化。
如果您已经具备存储和分析功能的能力,那么获取衍生物就像编写(非常有限的)区分规则一样简单。
但是,如果您正在考虑基于DATAsets(非抽象函数)的区分,那么您可以使用各种近似技术,例如simpsons规则。
答案 5 :(得分:0)
如果您可以向万维网发出HTTP请求,则可以创建SaturnAPI集成脚本。
披露:我参与了SaturnAPI
答案 6 :(得分:0)
如果是java,请查看DMelt math program。它是免费的。在手册中,您可以找到如何进行推导。