我正在尝试在java(小)中实现一个神经网络,并且我正在使用反向传播来学习算法。这需要找到一般的导数。如何在 java 中找到一般的导数?
7 回答
试试 Helmut Dersch 的 Jasymca 2 http://webuser.hs-furtwangen.de/~dersch/jasymca2/。它是一个提供类似 GNU Octave/Matlab 功能的 Java API。它包括符号数学。
Jasymca 最近正在开发中。该文档来自 2009 年 3 月,它需要 Java 1.5+。
警告:Jasymca 是 GPL,因此在将其用于商业产品之前请咨询律师。
取决于您是否有连续数据或离散数据。我猜你有离散数据,因为我们在谈论神经网络。
有限差分是近似导数的一种方法。另一种方法可能是进行某种拟合并区分拟合函数,假设它是具有易于计算的导数(例如多项式)的众所周知的函数。
您的数据有多少个自变量?一个变量的函数很简单;两个或更多更难,因为您需要偏导数。
您应该尝试对其进行硬编码
double derivative = (f(x+h) - f(x-h)) / (2*h);
好的,如果您最有可能在做神经网络,您将不需要只取某个任意函数的一般导数。这就是您需要通用微积分库的目的。Backprop 要求您使用激活函数的导数。通常,您的激活函数将是 sigmoid 函数或双曲 tan 函数。这两者你都可以从 Wikipedia 中得到派生词,然后简单地将该函数提供给你的神经网络训练。您不需要每次都实际求解导数。
还有其他常见的激活函数,但实际上只有少数几个真正使用。只需查找导数并使用您想要的导数即可。大多数神经网络框架只是将常规激活函数和导数构建到您使用的某种基类中。以下是一些最常见的:
我很确定java没有内置的微积分功能库。但是,您自己实现差异化的过程可能从微不足道到非常具有挑战性。
如果您已经具备存储和分析函数的能力,那么获得导数就像编程(非常有限)数量的微分规则一样简单。
但是,如果您正在查看基于数据集(而不是抽象函数)的差异化,那么您可以使用各种近似技术,例如辛普森规则。
如果您可以向万维网发出 HTTP 请求,则可以创建SaturnAPI集成脚本。
披露:我在 SaturnAPI 工作
如果涉及到 java,请查看DMelt 数学程序。它是免费的。在手册中,您可以找到如何进行推导。