public void Test__WeightCorrectionCalculation() { //this is just check of calculation: ((hessian+mu*I)\gradient)' if is correct /* * >> %((hessian+mu*I)\gradient)' * >> hessian = [1 2; 3 4] * hessian = * * 1 2 * 3 4 * >> mu = 2 * mu = * 2 * >> I = eye(2) * I = * 1 0 * 0 1 * >> gradient=[1;2] * gradient = * 1 * 2 * >> res=((hessian+mu*I)\gradient)' * res = * 0.1667 0.2500 */ var hessian = new MatrixMB(2, 2); //no matter if its hessian result or not hessian[0, 0] = 1; hessian[0, 1] = 2; hessian[1, 0] = 3; hessian[1, 1] = 4; double mu = 2; var I = MatrixMB.Eye(2); var gradient = new MatrixMB(2, 1); gradient[0, 0] = 1; gradient[1, 0] = 2; // var diff = ((hessian.HessianMat + (I * setting.MU)).Inverted * hessian.GradientMat).Transposed; var add = hessian + I * mu; var inv = add.Inverted; var div = inv * gradient; var res = div.Transposed; Assert.AreEqual(1, res.Rows); Assert.AreEqual(2, res.Cols); Assert.AreEqual(0.1667, Math.Round(res[0, 0], 4)); Assert.AreEqual(0.25, Math.Round(res[0, 1], 4)); }
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); } }