使用 BPNN 进行水质管理是否有点矫枉过正?
Is employing BPNN for water quality management an overkill?
我正在开发一种淡水质量管理设备,可用于湖泊和河流等淡水水体。该项目分为三个部分:
- 第一部分涉及获取 pH、浊度等参数
- 第二部分是根据参数采取纠正措施。例如,如果 pH 值太低,设备将注入碱性溶液以保持 pH 值在 7-7.5。
- 现在第三部分涉及根据获取的参数(pH/Turbidity 等)预测湖泊的健康状况。预测算法应考虑参数并建立它们之间的相关性以解释湖泊将维持多长时间。为实现这一目标,我目前偏向于使用反向传播神经网络 (BPNN),因为我发现其他多个 people/institutes 更喜欢使用神经网络进行水质管理。*
现在我担心的是使用 BPNN 是否对这个项目来说是一种矫枉过正?如果是,我应该选择哪个 method/tool?
按照 "it used to be" is not always the best idea 的方式做某事。一般来说,如果你没有 选择神经网络的分析理由 你 永远不应该从它开始 。神经网络难以训练,具有大量超参数,具有不确定性和计算成本。 总是 从最简单的模型开始,只有当它产生不好的结果时才转向更复杂的模型。从理论的角度来看,它是由 Vapnik 定理强烈证明的,从实践的角度来看,它类似于编程中的敏捷方法。
那么从哪里开始呢?
- 线性回归(岭回归、Lasso)
- 多项式回归
- KNN 回归
- RBF 网络
- 随机森林回归
如果它们都失败了 - 考虑 "classical" 神经网络。但是机会相当……小。
反向传播(BP)是一种使用梯度下降学习人工神经网络模型参数的方法。它以有效的方式计算梯度。还有其他方法可以训练此类模型,但由于多种原因,BP 更常用。我对项目的规模和收集的数据量一无所知,但如果示例数量很多,神经网络会更有效。例如,如果您有 10 个属性(pH 值、浊度...)和可能超过 2-3k 个示例,那么神经网络可能会有所帮助。
但是,您不应该认为神经网络是有史以来 BEST 模型。您需要尝试不同的模型并选择给您最佳性能的模型。
神经网络是一个函数逼近器。如果你有一个 real-valued 输入向量,并且与每个向量相关联,你就有一个目标实数或分类,例如 "good"、"bad"、"red"等,那么神经网络可以用来解决你的问题。
神经网络的最简单形式是 n(x) := g(Wh(Ax + b)+ c) 形式的函数,其中 A 和 W 是矩阵,b 和 c 是向量,h 是 a component-wise 非线性函数,通常是一个 sigmoid 函数,g 是一个与你的目标取相同值的函数 space。
在您的情况下,您的输入向量(在上面表示为 x)将包含 pH 值、浊度等,而您的目标将是湖泊将维持多长时间。如果您的网络 "trained" 正确,它将能够在给定一个看不见的输入 u(pH 值和浊度等的新测量值)的情况下,计算出湖泊将维持多长时间的良好近似值。
"Training" 神经网络包括为 A、W、b、c 选择参数。这些参数有多少取决于您为 A 和 W 选择了多少列(因此也为 b 和 c)。选择这些参数的一种方法是使函数 n(x) 接近您拥有的所有历史(训练)示例的实际测量目标。更具体地说,选择 A,W,b,c 以最小化 E(A,W,b,c) := (n(x) - t(x))^2 其中 t(x) 是您的历史测量目标(当 pH 值和浊度以 x 为单位测量时,湖泊持续了多长时间)。尝试在 A、W、b、c 上最小化 E 的一种方法是计算 E 关于每个参数的梯度,然后通过称为 back-propagation 的算法向梯度的负方向迈出一步。
我想指出,当参数固定时,神经网络的计算是确定性的,但是有一些计算 E 梯度的算法不是确定性的。其他一些算法是确定性的。
那么,以所有这些为背景,神经网络对您的项目来说是否过大了?这取决于您试图从观察到您试图预测的输出的近似函数。神经网络能否为您提供良好的预测准确性取决于许多因素,其中最重要的可能是您必须训练多少样本。如果相对于预测变量的数量,您没有很多训练示例,神经网络可能不是您要找的,但在大多数情况下,这是一个经验问题,而不是理论问题。
好的一点是,如果您愿意使用 python,有很好的库可以让您轻松完成所有这些测试。如果您尝试神经网络但它没有给您很好的预测,您可以尝试许多其他回归方法。例如,您可以尝试线性回归(这是神经网络的特例)或随机森林。如果您将 sklearn 用于线性回归和随机森林,所有这些都可以很容易地在 python 中编码。有一些用于神经网络的库也使得使用它们变得非常容易。我推荐用于神经网络的 tensorflow。
我的建议是花一点时间尝试几种方法。对于像这样相对简单的预测问题,训练网络的时间应该很短。您可能听说过的更长的几天或几周的时间是针对具有数百万或数十亿个训练示例和数百万个参数的海量数据集。
这里 http://pastebin.com/KrUAX9je 是我创建的玩具神经网络 "learn" 来逼近函数 f(a,b,c) = abc .
我正在开发一种淡水质量管理设备,可用于湖泊和河流等淡水水体。该项目分为三个部分:
- 第一部分涉及获取 pH、浊度等参数
- 第二部分是根据参数采取纠正措施。例如,如果 pH 值太低,设备将注入碱性溶液以保持 pH 值在 7-7.5。
- 现在第三部分涉及根据获取的参数(pH/Turbidity 等)预测湖泊的健康状况。预测算法应考虑参数并建立它们之间的相关性以解释湖泊将维持多长时间。为实现这一目标,我目前偏向于使用反向传播神经网络 (BPNN),因为我发现其他多个 people/institutes 更喜欢使用神经网络进行水质管理。*
现在我担心的是使用 BPNN 是否对这个项目来说是一种矫枉过正?如果是,我应该选择哪个 method/tool?
按照 "it used to be" is not always the best idea 的方式做某事。一般来说,如果你没有 选择神经网络的分析理由 你 永远不应该从它开始 。神经网络难以训练,具有大量超参数,具有不确定性和计算成本。 总是 从最简单的模型开始,只有当它产生不好的结果时才转向更复杂的模型。从理论的角度来看,它是由 Vapnik 定理强烈证明的,从实践的角度来看,它类似于编程中的敏捷方法。
那么从哪里开始呢?
- 线性回归(岭回归、Lasso)
- 多项式回归
- KNN 回归
- RBF 网络
- 随机森林回归
如果它们都失败了 - 考虑 "classical" 神经网络。但是机会相当……小。
反向传播(BP)是一种使用梯度下降学习人工神经网络模型参数的方法。它以有效的方式计算梯度。还有其他方法可以训练此类模型,但由于多种原因,BP 更常用。我对项目的规模和收集的数据量一无所知,但如果示例数量很多,神经网络会更有效。例如,如果您有 10 个属性(pH 值、浊度...)和可能超过 2-3k 个示例,那么神经网络可能会有所帮助。
但是,您不应该认为神经网络是有史以来 BEST 模型。您需要尝试不同的模型并选择给您最佳性能的模型。
神经网络是一个函数逼近器。如果你有一个 real-valued 输入向量,并且与每个向量相关联,你就有一个目标实数或分类,例如 "good"、"bad"、"red"等,那么神经网络可以用来解决你的问题。 神经网络的最简单形式是 n(x) := g(Wh(Ax + b)+ c) 形式的函数,其中 A 和 W 是矩阵,b 和 c 是向量,h 是 a component-wise 非线性函数,通常是一个 sigmoid 函数,g 是一个与你的目标取相同值的函数 space。 在您的情况下,您的输入向量(在上面表示为 x)将包含 pH 值、浊度等,而您的目标将是湖泊将维持多长时间。如果您的网络 "trained" 正确,它将能够在给定一个看不见的输入 u(pH 值和浊度等的新测量值)的情况下,计算出湖泊将维持多长时间的良好近似值。 "Training" 神经网络包括为 A、W、b、c 选择参数。这些参数有多少取决于您为 A 和 W 选择了多少列(因此也为 b 和 c)。选择这些参数的一种方法是使函数 n(x) 接近您拥有的所有历史(训练)示例的实际测量目标。更具体地说,选择 A,W,b,c 以最小化 E(A,W,b,c) := (n(x) - t(x))^2 其中 t(x) 是您的历史测量目标(当 pH 值和浊度以 x 为单位测量时,湖泊持续了多长时间)。尝试在 A、W、b、c 上最小化 E 的一种方法是计算 E 关于每个参数的梯度,然后通过称为 back-propagation 的算法向梯度的负方向迈出一步。
我想指出,当参数固定时,神经网络的计算是确定性的,但是有一些计算 E 梯度的算法不是确定性的。其他一些算法是确定性的。
那么,以所有这些为背景,神经网络对您的项目来说是否过大了?这取决于您试图从观察到您试图预测的输出的近似函数。神经网络能否为您提供良好的预测准确性取决于许多因素,其中最重要的可能是您必须训练多少样本。如果相对于预测变量的数量,您没有很多训练示例,神经网络可能不是您要找的,但在大多数情况下,这是一个经验问题,而不是理论问题。
好的一点是,如果您愿意使用 python,有很好的库可以让您轻松完成所有这些测试。如果您尝试神经网络但它没有给您很好的预测,您可以尝试许多其他回归方法。例如,您可以尝试线性回归(这是神经网络的特例)或随机森林。如果您将 sklearn 用于线性回归和随机森林,所有这些都可以很容易地在 python 中编码。有一些用于神经网络的库也使得使用它们变得非常容易。我推荐用于神经网络的 tensorflow。
我的建议是花一点时间尝试几种方法。对于像这样相对简单的预测问题,训练网络的时间应该很短。您可能听说过的更长的几天或几周的时间是针对具有数百万或数十亿个训练示例和数百万个参数的海量数据集。
这里 http://pastebin.com/KrUAX9je 是我创建的玩具神经网络 "learn" 来逼近函数 f(a,b,c) = abc .