【发布时间】:2018-06-12 06:27:18
【问题描述】:
我正在使用来自MATLAB 训练有素的 ANN 的权重和偏差来计算值。试图编写一个 sigmoid 模拟方程,但由于某种原因,C# 计算与 MATLAB 相比变化太大。即错误太高。我试图检查方程式的每一步,并找出造成问题的特定部分(强调部分),但我不知道如何解决这个问题,如果有人可以提供帮助,那将是一个巨大的帮助。
1+(purelin(net.LW{2}×(tansig(net.IW{1}×(1-(abs(2×([输入]-1)))))+net.b{1 }))+net.b{2}))/2
//Normalization of Data
public double Normalization(double x, double xMAx, double xMin)
{
double xNorm = 0.0;
xNorm = (x - xMin) / (xMAx - xMin);
if (xNorm < 0)
xNorm = 0;
if (xNorm > 1)
xNorm = 1;
xNorm = Math.Round(xNorm, 4);
return xNorm;
}
// Equation to calculate ANN based Output Values
public double MetrixCalc(double[] Pn, double[,] W1, double[] W2, double[] b1, double b2, double maxValue, double minValue)
{
double FinalValue = 0;
double[] PnCalc1 = new double[Pn.Length];
double[] PnCalc2 = new double[W1.Length / Pn.Length];
for (int i = 0; i < Pn.Length; i++)
{
PnCalc1[i] = 1 - Math.Abs(2 * (Pn[i] - 1));
}
for (int i = 0; i < (W1.Length / Pn.Length); i++)
{
double PnCalc = 0.0;
for (int j = 0; j < Pn.Length; j++)
{
PnCalc = PnCalc + (W1[i, j] * PnCalc1[j]);
}
PnCalc2[i] = PnCalc;
}
for (int i = 0; i < PnCalc2.Length; i++)
{
//PnCalc2[i] = Math.Tanh(PnCalc2[i] + b1[i]);
PnCalc2[i] = PnCalc2[i] + b1[i];
PnCalc2[i] = 2.0 / (1 + Math.Exp(-2 * (PnCalc2[i]))) - 1;
PnCalc2[i] = Math.Round(PnCalc2[i], 4);
}
double FinalCalc = 0.0;
for (int i = 0; i < PnCalc2.Length; i++)
{
*FinalCalc = FinalCalc + (W2[i] * (PnCalc2[i]));*
//FinalValue = FinalCalc;
}
FinalValue = FinalCalc + b2;
FinalValue = 1 + FinalValue;
FinalValue = (1 + FinalValue) / 2.0;
FinalValue = (FinalValue * (maxValue - minValue)) + minValue;
FinalValue = Math.Round(FinalValue, 4);
FinalValue = Math.Abs(FinalValue);
return FinalValue;
}
【问题讨论】:
-
c# 和 MATLAB 都使用 64 位 IEEE 754 浮点作为其
double数据类型,因此精度应该没有差异。您可能犯了编码错误或逻辑上存在一些差异。不能告诉你什么,因为我没有什么可以比较你的代码。 -
谢谢。不过这很烦人。我无法发现错误。
-
去过那里。休息一下。如果这不起作用,请考虑完全重写(不要偷看)。如果可以,请更改 c# 程序的结构以匹配 MATLAB 程序的结构,并尽可能使用完全相同的变量名称,以便更轻松地进行 1:1 比较。一旦你有一个已知的好的算法,你总是可以把它改回 c# 风格的代码。
-
能否请您发布基线 MATLAB 代码?或者至少是您尝试在 C# 中复制的函数的名称?
-
其实 ANN 是通过 MATLAB 中的 nftool 开发的,所以我只是使用生成的权重和偏差来实现这个方程。这是模拟方程,我正在尝试编码。 1+(purelin(net.LW{2}×(tansig(net.IW{1}×(1-(abs(2×([输入]-1)))))+net.b{1})) +net.b{2}))/2
标签: c# matlab neural-network matrix-multiplication