Skip to content

Commit a02c811

Browse files
committed
add gradient learn by multiple input to multiple output
1 parent 1c391ef commit a02c811

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

MLTests/GradientMulInMulOutTests.cs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using NUnit.Framework;
2+
3+
namespace MLTests
4+
{
5+
public class GradientMulInMulOutTests
6+
{
7+
private double[] MulVV(double[] vecA, double[] vecB)
8+
{
9+
var result = new double[vecA.Length];
10+
for (int i = 0; i < vecA.Length; i++)
11+
{
12+
result[i] = vecA[i] * vecB[i];
13+
}
14+
return result;
15+
}
16+
private double MulScalarVV(double[] vecA, double[] vecB)
17+
{
18+
double result = 0;
19+
for (int i = 0; i < vecA.Length; i++)
20+
{
21+
result = result + vecA[i] * vecB[i];
22+
}
23+
return result;
24+
}
25+
26+
public double[] MulScalarVM(double[] vecA, double[][] matrixA)
27+
{
28+
var result = new double[vecA.Length];
29+
for (var index = 0; index < result.Length; ++index)
30+
{
31+
result[index] = MulScalarVV(vecA, matrixA[index]);
32+
}
33+
return result;
34+
}
35+
36+
private double[] SubVV(double[] vecA, double[] vecB)
37+
{
38+
var result = new double[vecA.Length];
39+
for (int i = 0; i < vecA.Length; i++)
40+
{
41+
result[i] = vecA[i] - vecB[i];
42+
}
43+
return result;
44+
45+
}
46+
47+
private double[] SubVE(double[] vecA, double element)
48+
{
49+
var result = new double[vecA.Length];
50+
for (int i = 0; i < vecA.Length; i++)
51+
{
52+
result[i] = vecA[i] - element;
53+
}
54+
return result;
55+
56+
}
57+
58+
private double[] GradientLearnMulInOut(double[][] weights, double[] input, double[] predictionGoal, double alpha, int iterations)
59+
{
60+
var result = weights.Select(a => a.ToArray()).ToArray();
61+
for(var i = 0; i < iterations; ++i)
62+
{
63+
var prediction = MulScalarVM(input, result);
64+
var deltas = SubVV(prediction, predictionGoal);
65+
var derivatives = MulVV(deltas, input);
66+
result[0] = SubVE(result[0], derivatives[0] * alpha);
67+
result[1] = SubVE(result[1], derivatives[1] * alpha);
68+
result[2] = SubVE(result[2], derivatives[2] * alpha);
69+
}
70+
71+
return MulScalarVM(input, result);
72+
}
73+
74+
[Test]
75+
public void ShouldGradientLearnFromMulInToMulOut()
76+
{
77+
var weights = new double[][] {
78+
new double[] {0.1, 0.1, -0.3},
79+
new double[] {0.1, 0.2, 0.0},
80+
new double[] {0.0, 1.3, 0.1},
81+
};
82+
var alpha = 0.01;
83+
var iterations = 100;
84+
85+
var toes = new double[] { 8.5, 9.5, 9.9, 9.0 };
86+
var wlrec = new double[] { 0.65, 0.8, 0.8, 0.9 };
87+
var nfans = new double[] { 1.2, 1.3, 0.5, 1.0 };
88+
89+
var hurt = new double[] { 0.1, 0.0, 0.0, 0.1 };
90+
var win = new double[] { 1.0, 1.0, 0.0, 1.0 };
91+
var sad = new double[] { 0.1, 0.0, 0.1, 0.2 };
92+
93+
var input = new double[] { toes[0], wlrec[0], nfans[0] };
94+
var predictionGoal = new double[] { hurt[0], win[0], sad[0] };
95+
96+
var result = GradientLearnMulInOut(weights, input, predictionGoal, alpha, iterations);
97+
98+
Assert.That(Math.Round(result[0], 2), Is.EqualTo(predictionGoal[0]));
99+
Assert.That(Math.Round(result[1], 2), Is.EqualTo(predictionGoal[1]));
100+
Assert.That(Math.Round(result[2], 2), Is.EqualTo(predictionGoal[2]));
101+
}
102+
}
103+
}

0 commit comments

Comments
 (0)