Esempio n. 1
0
        public void InvertMatrix()
        {
            Console.WriteLine("Testowanie odwracania macierzy");
            //mat.Inverted * mat = mat.Identity
            //Jeśli A ma odwrotną A to odwrotna A jest równa A
            MatrixMB mat = new MatrixMB(2,2);
            mat.Data[0][0] = 4;
            mat.Data[0][1] = 7;
            mat.Data[1][0] = 2;
            mat.Data[1][1] = 6;
            Console.WriteLine("Macierz odwracana");
            Console.WriteLine(mat.MatrixToString());

            double det = mat.Determinant;
            Assert.AreNotEqual(0, det);
            Assert.AreEqual(10, det);

            var inv = mat.Inverted;
            Console.WriteLine("Macierz odwrócona");
            Console.WriteLine(inv.MatrixToString());

            Assert.AreEqual(0.6000, Math.Round(inv.Data[0][0],4));
            Assert.AreEqual(-0.7000, Math.Round(inv.Data[0][1],4));
            Assert.AreEqual(-0.2000, Math.Round(inv.Data[1][0],4));
            Assert.AreEqual(0.4000, Math.Round(inv.Data[1][1],4));

            var A = inv.Inverted;
            Console.WriteLine("Odwrócenie macierzy odwróconej");
            Console.WriteLine(inv.MatrixToString());

            int accuracy = 15;
            for (int i = 0; i < A.Rows; i++)
            {
                for (int j = 0; j < A.Cols; j++)
                {
                    decimal o = Math.Round((decimal)mat[i, j], accuracy);
                    decimal a = Math.Round((decimal)A[i, j], accuracy);
                    Console.WriteLine(string.Format("Orginał: {0}\tPorównywana: {1}", o, a));
                }
            }

            for (int i = 0; i < A.Rows; i++)
            {
                for (int j = 0; j < A.Cols; j++)
                {
                    decimal o = Math.Round((decimal)mat[i, j], accuracy);
                    decimal a = Math.Round((decimal)A[i, j], accuracy);
                    Assert.AreEqual(o, a);
                }
            }

            var identity = inv * mat;
            Assert.AreEqual(1, Math.Round(identity.Data[0][0], accuracy));
            Assert.AreEqual(0, Math.Round(identity.Data[0][1], accuracy));
            Assert.AreEqual(0, Math.Round(identity.Data[1][0], accuracy));
            Assert.AreEqual(1, Math.Round(identity.Data[1][1], accuracy));
        }
Esempio n. 2
0
        public void Weigths___Correction___Test()
        {
            var gradient = new MatrixMB(7, 1);
            //gradient = [-0.839948683228052; 2.319597374905329; 2.319597374905329; -2.000000000000000; 5.523188311911530; 5.523188311911531; 6.889667569278484];
            gradient[0,0] = -0.839948683228052;
            gradient[1,0] = 2.319597374905329;
            gradient[2,0] = 2.319597374905329;
            gradient[3,0] = -2.000000000000000;
            gradient[4,0] =  5.523188311911530;
            gradient[5,0] =  5.523188311911531;
            gradient[6,0] =  6.889667569278484;

            /*
              hessian = [
            1.058270685684809  -0.705513790456539  -0.705513790456539 2.519846049684157  -1.679897366456105  -1.679897366456105 -0.639700008449225;
               -0.705513790456539   1.058270685684809   0.352756895228269  -1.679897366456105   2.519846049684157   0.839948683228052 1.279400016898449;
               -0.705513790456539   0.352756895228269   1.058270685684809  -1.679897366456105   0.839948683228052   2.519846049684157 1.279400016898449;
            2.519846049684157  -1.679897366456105 -1.679897366456105   6.000000000000000  -4.000000000000000  -4.000000000000000 -1.523188311911530;
               -1.679897366456105   2.519846049684157   0.839948683228052  -4.000000000000000   6.000000000000000   2.000000000000000 3.046376623823059;
               -1.679897366456105   0.839948683228052   2.519846049684157  -4.000000000000000   2.000000000000000   6.000000000000000 3.046376623823059;
               -0.639700008449225   1.279400016898449   1.279400016898449  -1.523188311911530   3.046376623823059   3.046376623823059 3.480153950315843
            ];
              */

            MatrixMB hessian = new MatrixMB(7, 7);
            //col 1
            hessian[0, 0] = 1.058270685684809;
            hessian[1, 0] = -0.705513790456539;
            hessian[2, 0] = -0.705513790456539;
            hessian[3, 0] = 2.519846049684157;
            hessian[4, 0] = -1.679897366456105;
            hessian[5, 0] = -1.679897366456105;
            hessian[6, 0] = -0.639700008449225;

            //col 2
            hessian[0, 1] = -0.705513790456539;
            hessian[1, 1] = 1.058270685684809;
            hessian[2, 1] = 0.352756895228269;
            hessian[3, 1] = -1.679897366456105;
            hessian[4, 1] = 2.519846049684157;
            hessian[5, 1] = 0.839948683228052;
            hessian[6, 1] = 1.279400016898449;

            //col 3
            hessian[0, 2] = -0.705513790456539;
            hessian[1, 2] = 0.352756895228269;
            hessian[2, 2] = 1.058270685684809;
            hessian[3, 2] = -1.679897366456105;
            hessian[4, 2] = 0.839948683228052;
            hessian[5, 2] = 2.519846049684157;
            hessian[6, 2] = 1.279400016898449;

            //col 4
            hessian[0, 3] = 2.519846049684157;
            hessian[1, 3] = -1.679897366456105;
            hessian[2, 3] = -1.679897366456105;
            hessian[3, 3] = 6.000000000000000;
            hessian[4, 3] = -4.000000000000000;
            hessian[5, 3] = -4.000000000000000;
            hessian[6, 3] = -1.523188311911530;

            //col 5
            hessian[0, 4] = -1.679897366456105;
            hessian[1, 4] = 2.519846049684157;
            hessian[2, 4] = 0.839948683228052;
            hessian[3, 4] = -4.000000000000000;
            hessian[4, 4] = 6.000000000000000;
            hessian[5, 4] = 2.000000000000000;
            hessian[6, 4] = 3.046376623823059;

            //col 6
            hessian[0, 5] = -1.679897366456105;
            hessian[1, 5] = 0.839948683228052;
            hessian[2, 5] = 2.519846049684157;
            hessian[3, 5] = -4.000000000000000;
            hessian[4, 5] = 2.000000000000000;
            hessian[5, 5] = 6.000000000000000;
            hessian[6, 5] = 3.046376623823059;

            //col 7
            hessian[0, 6] = -0.639700008449225;
            hessian[1, 6] = 1.279400016898449;
            hessian[2, 6] = 1.279400016898449;
            hessian[3, 6] = -1.523188311911530;
            hessian[4, 6] = 3.046376623823059;
            hessian[5, 6] = 3.046376623823059;
            hessian[6, 6] = 3.480153950315843;

            Weights weights = new Weights(7);
            weights.FillWithNumber(1);

            double mu = 0.01;
            var I = MatrixMB.Eye(weights.Length);

            Console.WriteLine("Testowanie obliczania korekty wag");
            Console.WriteLine("Hesjan:");
            Console.WriteLine(hessian.MatrixToString());
            Console.WriteLine("Gradient:");
            Console.WriteLine(gradient.MatrixToString());
            Console.WriteLine("Wagi początkowe:");
            Console.WriteLine(weights.MatrixToString());
            Console.WriteLine("MU = " + mu.ToString());
            Console.WriteLine("Macierz I");
            Console.WriteLine(I.MatrixToString());

            //korekta_wag =  ((hessian+mu*I)\gradient)';
            /*
             Lewa strona
              Columns 1 through 6

               1.068270685684809  -0.705513790456539  -0.705513790456539   2.519846049684157  -1.679897366456105  -1.679897366456105
              -0.705513790456539   1.068270685684809   0.352756895228269  -1.679897366456105   2.519846049684157   0.839948683228052
              -0.705513790456539   0.352756895228269   1.068270685684809  -1.679897366456105   0.839948683228052   2.519846049684157
               2.519846049684157  -1.679897366456105  -1.679897366456105   6.010000000000000  -4.000000000000000  -4.000000000000000
              -1.679897366456105   2.519846049684157   0.839948683228052  -4.000000000000000   6.010000000000000   2.000000000000000
              -1.679897366456105   0.839948683228052   2.519846049684157  -4.000000000000000   2.000000000000000   6.010000000000000
              -0.639700008449225   1.279400016898449   1.279400016898449  -1.523188311911530   3.046376623823059   3.046376623823059

              Column 7

              -0.639700008449225
               1.279400016898449
               1.279400016898449
              -1.523188311911530
               3.046376623823059
               3.046376623823059
               3.490153950315843
             */
            var lewa_strona_matlab = new MatrixMB(7, 7);
            lewa_strona_matlab[0, 0] = 1.06827068568480900000;
            lewa_strona_matlab[0, 1] = -0.70551379045653895000;
            lewa_strona_matlab[0, 2] = -0.70551379045653895000;
            lewa_strona_matlab[0, 3] = 2.51984604968415700000;
            lewa_strona_matlab[0, 4] = -1.67989736645610500000;
            lewa_strona_matlab[0, 5] = -1.67989736645610500000;
            lewa_strona_matlab[0, 6] = -0.63970000844922503000;
            lewa_strona_matlab[1, 0] = -0.70551379045653895000;
            lewa_strona_matlab[1, 1] = 1.06827068568480900000;
            lewa_strona_matlab[1, 2] = 0.35275689522826897000;
            lewa_strona_matlab[1, 3] = -1.67989736645610500000;
            lewa_strona_matlab[1, 4] = 2.51984604968415700000;
            lewa_strona_matlab[1, 5] = 0.83994868322805205000;
            lewa_strona_matlab[1, 6] = 1.27940001689844900000;
            lewa_strona_matlab[2, 0] = -0.70551379045653895000;
            lewa_strona_matlab[2, 1] = 0.35275689522826897000;
            lewa_strona_matlab[2, 2] = 1.06827068568480900000;
            lewa_strona_matlab[2, 3] = -1.67989736645610500000;
            lewa_strona_matlab[2, 4] = 0.83994868322805205000;
            lewa_strona_matlab[2, 5] = 2.51984604968415700000;
            lewa_strona_matlab[2, 6] = 1.27940001689844900000;
            lewa_strona_matlab[3, 0] = 2.51984604968415700000;
            lewa_strona_matlab[3, 1] = -1.67989736645610500000;
            lewa_strona_matlab[3, 2] = -1.67989736645610500000;
            lewa_strona_matlab[3, 3] = 6.00999999999999980000;
            lewa_strona_matlab[3, 4] = -4.00000000000000000000;
            lewa_strona_matlab[3, 5] = -4.00000000000000000000;
            lewa_strona_matlab[3, 6] = -1.52318831191152990000;
            lewa_strona_matlab[4, 0] = -1.67989736645610500000;
            lewa_strona_matlab[4, 1] = 2.51984604968415700000;
            lewa_strona_matlab[4, 2] = 0.83994868322805205000;
            lewa_strona_matlab[4, 3] = -4.00000000000000000000;
            lewa_strona_matlab[4, 4] = 6.00999999999999980000;
            lewa_strona_matlab[4, 5] = 2.00000000000000000000;
            lewa_strona_matlab[4, 6] = 3.04637662382305900000;
            lewa_strona_matlab[5, 0] = -1.67989736645610500000;
            lewa_strona_matlab[5, 1] = 0.83994868322805205000;
            lewa_strona_matlab[5, 2] = 2.51984604968415700000;
            lewa_strona_matlab[5, 3] = -4.00000000000000000000;
            lewa_strona_matlab[5, 4] = 2.00000000000000000000;
            lewa_strona_matlab[5, 5] = 6.00999999999999980000;
            lewa_strona_matlab[5, 6] = 3.04637662382305900000;
            lewa_strona_matlab[6, 0] = -0.63970000844922503000;
            lewa_strona_matlab[6, 1] = 1.27940001689844900000;
            lewa_strona_matlab[6, 2] = 1.27940001689844900000;
            lewa_strona_matlab[6, 3] = -1.52318831191152990000;
            lewa_strona_matlab[6, 4] = 3.04637662382305900000;
            lewa_strona_matlab[6, 5] = 3.04637662382305900000;
            lewa_strona_matlab[6, 6] = 3.49015395031584270000;

            var lewa_strona_csharp = hessian + (I * mu);

            Console.WriteLine("Lewa strona dzielenia - obliczanie korekty wag => (hessian+mu*I)");
            for (int i = 0; i < lewa_strona_csharp.Rows; i++)
            {
                for (int j = 0; j < lewa_strona_csharp.Cols; j++)
                {
                    var result = Math.Round(((decimal)lewa_strona_csharp[i, j]), 15);
                    var expected = Math.Round(((decimal)lewa_strona_matlab[i, j]), 15);
                    Console.WriteLine(string.Format("Poz[{0},{1}] => NBN C#: {2}\tMatLab NBN: {3}\t{4}", i,j,result, expected, result == expected ? "OK" : "źle"));
                }
            }

            for (int i = 0; i < lewa_strona_csharp.Rows; i++)
            {
                for (int j = 0; j < lewa_strona_csharp.Cols; j++)
                {
                    var result = Math.Round(((decimal)lewa_strona_csharp[i, j]), 15);
                    var expected = Math.Round(((decimal)lewa_strona_matlab[i, j]), 15);
                    Assert.AreEqual(expected, result);
                }
            }

            var diff = ((hessian + (I * mu)).Inverted * gradient).Transposed;
            /*
             Expected weights diff
             % Otrzymana korekta wag:
            %
            % 0.27954017281149085000
            % 0.21238647096009383000
            % 0.21238647096010940000
            % 0.66561250322368737000
            % 0.50571296842532187000
            % 0.50571296842531543000
            % 1.27722267527372440000
            % Koniec
             *
             */

            var diffMatLab = new double[]
            {
             0.27954017281149085000,
             0.21238647096009383000,
             0.21238647096010940000,
             0.66561250322368737000,
             0.50571296842532187000,
             0.50571296842531543000,
             1.27722267527372440000
            };

            /*
             Test matlabowy
             function obliczanie_korekty_wag()
            %ww = ww_backup - ((hessian+mu*I)\gradient)';
            clear();
            ww = [1 1 1 1 1 1 1];
            mu = 0.01;
            I = eye(size(ww,2));%tyle co wag
            format long;
            gradient = [-0.839948683228052; 2.319597374905329; 2.319597374905329; -2.000000000000000; 5.523188311911530; 5.523188311911531; 6.889667569278484];
            hessian = [
            1.058270685684809  -0.705513790456539  -0.705513790456539 2.519846049684157  -1.679897366456105  -1.679897366456105 -0.639700008449225;
               -0.705513790456539   1.058270685684809   0.352756895228269  -1.679897366456105   2.519846049684157   0.839948683228052 1.279400016898449;
               -0.705513790456539   0.352756895228269   1.058270685684809  -1.679897366456105   0.839948683228052   2.519846049684157 1.279400016898449;
            2.519846049684157  -1.679897366456105 -1.679897366456105   6.000000000000000  -4.000000000000000  -4.000000000000000 -1.523188311911530;
               -1.679897366456105   2.519846049684157   0.839948683228052  -4.000000000000000   6.000000000000000   2.000000000000000 3.046376623823059;
               -1.679897366456105   0.839948683228052   2.519846049684157  -4.000000000000000   2.000000000000000   6.000000000000000 3.046376623823059;
               -0.639700008449225   1.279400016898449   1.279400016898449  -1.523188311911530   3.046376623823059   3.046376623823059 3.480153950315843
            ];

            korekta_wag =  ((hessian+mu*I)\gradient)';
            fprintf('\nOtrzymana korekta wag:\n');
            for i=1:size(ww,2)
            fprintf('\n%.20f',korekta_wag(i));
            end
            fprintf('\nKoniec\n');
            end

            % Otrzymana korekta wag:
            %
            % 0.27954017281149085000
            % 0.21238647096009383000
            % 0.21238647096010940000
            % 0.66561250322368737000
            % 0.50571296842532187000
            % 0.50571296842531543000
            % 1.27722267527372440000
            % Koniec

             */

            Console.WriteLine("Korekta wag:");

            int accuracy = 15;
            for (int i = 0; i < diffMatLab.Length; i++)
            {
                decimal result = (decimal)diff[0, i];
                decimal expected = (decimal)diffMatLab[i];
                result = Math.Round(result, accuracy);
                expected = Math.Round(expected, accuracy);
                Console.WriteLine(string.Format("NBN C#: {0}\tMatLab NBN: {1}\t {2}", result, expected, result == expected ? "OK" : "źle"));
            }

            for (int i = 0; i < diffMatLab.Length; i++)
            {
                decimal result = (decimal)diff[0, i];
                decimal expected = (decimal)diffMatLab[i];
                result = Math.Round(result, accuracy);
                expected = Math.Round(expected, accuracy);
                Assert.AreEqual(expected, result);
            }
        }