Матричное умножение возвращает неверное значение
Всем Привет,
Я вычисляю значения, используя веса и смещение из MATLAB trained ANN. пытаясь закодировать сигмоидное уравнение моделирования, но по какой-то причине вычисления C# слишком сильно отличаются от вычислений MATLAB. т. е. ошибка слишком высока. Я попытался проверить каждый шаг уравнения и выяснил конкретную часть, которая создает проблему (подчеркнутая часть), но я не знаю, как решить эту проблему, если бы кто-то мог помочь, было бы огромным одолжением.
1+(purelin(чистая.ДВ{2}×(tansig(чистая.В IW{1}×(1-(АБС(2×([входы]-1)))))+сетка.Б{1}))+сетка.Б{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; }
Member1x
Вы нормализуете свой результат?
AizazRizvi
Я денормализирую результаты, потому что входные значения уже нормализованы.
Peter_in_2780
Почему вы округляете PnCalc2[.] перед вычислением FinalCalc из них? Это отбрасывает точность.
AizazRizvi
это не имеет большого значения, но ваше предложение ценно. Спасибо.
Patrice T
Чтобы обсудить и ответить на комментарий, используйте кнопку "ответить" справа от имени участника.
Преимущество, член уведомляется.
AizazRizvi
Хорошо.