Умножение матриц, возвращающее неправильное значение - PullRequest
0 голосов
/ 12 июня 2018

Я рассчитываю значения, используя веса и смещения из MATLAB обученного ANN.пытаюсь закодировать сигма-симуляционное уравнение, но по какой-то причине вычисления на C # отличаются слишком сильно, чем в MATLAB.т.е. ошибка слишком высока.Я попытался проверить каждый шаг уравнения и выяснил конкретную часть, которая создает проблему (выделенная часть), но я не знаю, как решить эту проблему, если кто-то может помочь, было бы огромной пользой.

1 + (purelin (net.LW {2} × (тансиг (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;
        }

1 Ответ

0 голосов
/ 14 июня 2018

Проблема решена.Проблема была с матрицей весов, скопированной из MATLAB.Режим отладки спас мне жизнь.:)

...