Skip to content

Commit 4d507b7

Browse files
authored
Added new normalization options (#3)
* Updated language version to use latest Updated target frameworks to widen the range Added a bunch of new metrics such as R2, Std Deviation, Std Error, etc * Added normalization code structure and examples Added log normalization and decimal normalization Updated example code Cleaned up exceptions to include more info Added some code documentation * Added a ZScore Normalization option Added a MinMax Normalization option --------- Signed-off-by: Franklin Moormann <cheatcountry@gmail.com>
1 parent d21fa5a commit 4d507b7

File tree

5 files changed

+72
-6
lines changed

5 files changed

+72
-6
lines changed

src/AiDotNet.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
8-
<Version>0.0.3-preview</Version>
8+
<Version>0.0.4-preview</Version>
99
<Title>Ai for .Net</Title>
1010
<Description>This is a preview library that will eventually showcase the latest and greatest in ai breakthroughs and bring them to the .net community</Description>
1111
<Company>Ooples Finance</Company>
@@ -14,7 +14,7 @@
1414
<PackageProjectUrl>https://github.com/ooples/AiDotNet</PackageProjectUrl>
1515
<RepositoryType>git</RepositoryType>
1616
<RepositoryUrl>https://github.com/ooples/AiDotNet</RepositoryUrl>
17-
<PackageTags>ai; regression; machine learning; artificial; intelligence; machine; chatgpt; learning; algorithm; algo; chatgpt-4</PackageTags>
17+
<PackageTags>ai; ai.net; aidotnet; regression; machine learning; artificial; intelligence; machine; chatgpt; learning; algorithm; algo; chatgpt-4</PackageTags>
1818
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
1919
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
2020
<LangVersion>latest</LangVersion>

src/Metrics/Metrics.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AiDotNet;
1+
namespace AiDotNet.Metrics;
22

33
public sealed class Metrics : IMetrics
44
{
@@ -53,7 +53,7 @@ internal override double CalculateRootMeanSquaredError()
5353
internal override double CalculateR2()
5454
{
5555
double residualSumSquares = 0, totalSumSquares = 0;
56-
for (int i = 0; i < SampleSize; i++)
56+
for (var i = 0; i < SampleSize; i++)
5757
{
5858
residualSumSquares += Math.Pow(OosActualValues[i] - OosPredictions[i], 2);
5959
totalSumSquares += Math.Pow(OosActualValues[i] - OosActualValuesAvg, 2);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace AiDotNet.Normalization;
2+
3+
internal class MinMaxNormalization : INormalization
4+
{
5+
private double InputsMin { get; set; }
6+
private double InputsMax { get; set; }
7+
8+
internal override double[] Normalize(double[] rawValues)
9+
{
10+
var normalizedValues = new double[rawValues.Length];
11+
for (var i = 0; i < rawValues.Length; i++)
12+
{
13+
normalizedValues.SetValue(Math.Abs(InputsMax - InputsMin) > 0 ? (rawValues[i] - InputsMin) / (InputsMax - InputsMin) : double.NaN, i);
14+
}
15+
16+
if (normalizedValues.Contains(double.NaN))
17+
{
18+
throw new ArgumentException("Normalized values can't contain NaN values. " +
19+
"MinMax Normalization creates NaN values when the training data has all of the same values or invalid data.", nameof(rawValues));
20+
}
21+
22+
return normalizedValues;
23+
}
24+
25+
internal override (double[] trainingInputs, double[] trainingOutputs, double[] oosInputs, double[] oosOutputs) PrepareData(
26+
double[] inputs, double[] outputs, int trainingSize)
27+
{
28+
var (trainingInputs, trainingOutputs, oosInputs, oosOutputs) = NormalizationHelper.SplitData(inputs, outputs, trainingSize);
29+
InputsMin = trainingInputs.Min();
30+
InputsMax = trainingInputs.Max();
31+
32+
return (Normalize(trainingInputs), Normalize(trainingOutputs), Normalize(oosInputs), Normalize(oosOutputs));
33+
}
34+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
namespace AiDotNet.Normalization;
2+
3+
internal class ZScoreNormalization : INormalization
4+
{
5+
internal override double[] Normalize(double[] rawValues)
6+
{
7+
var normalizedValues = new double[rawValues.Length];
8+
9+
var rawValuesAvg = rawValues.Average();
10+
var rawValuesStdDev = Math.Sqrt(rawValues.Select(x => Math.Pow(x - rawValuesAvg, 2)).Sum() / rawValues.Length);
11+
12+
for (var i = 0; i < rawValues.Length; i++)
13+
{
14+
normalizedValues.SetValue(rawValuesStdDev != 0 ? (rawValues[i] - rawValuesAvg) / rawValuesStdDev : double.NaN, i);
15+
}
16+
17+
if (normalizedValues.Contains(double.NaN))
18+
{
19+
throw new ArgumentException("Normalized values can't contain NaN values. " +
20+
"Z-Score Normalization creates NaN values when the training data has all of the same values or invalid data.", nameof(rawValues));
21+
}
22+
23+
return normalizedValues;
24+
}
25+
26+
internal override (double[] trainingInputs, double[] trainingOutputs, double[] oosInputs, double[] oosOutputs) PrepareData(double[] inputs, double[] outputs, int trainingSize)
27+
{
28+
var (trainingInputs, trainingOutputs, oosInputs, oosOutputs) = NormalizationHelper.SplitData(inputs, outputs, trainingSize);
29+
30+
return (Normalize(trainingInputs), Normalize(trainingOutputs), Normalize(oosInputs), Normalize(oosOutputs));
31+
}
32+
}

src/Regression/SimpleRegression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AiDotNet.Regression;
1+
namespace AiDotNet.Regression;
22

33
public sealed class SimpleRegression : IRegression
44
{
@@ -63,7 +63,7 @@ public SimpleRegression(double[] inputs, double[] outputs, double trainingPctSiz
6363
var (trainingInputs, trainingOutputs, oosInputs, oosOutputs) = PrepareData(inputs, outputs, trainingSize, normalization);
6464
Fit(trainingInputs, trainingOutputs);
6565
Predictions = Transform(oosInputs);
66-
Metrics = new Metrics(Predictions, oosOutputs, inputs.Rank);
66+
Metrics = new Metrics.Metrics(Predictions, oosOutputs, inputs.Rank);
6767
}
6868

6969
internal override void Fit(double[] x, double[] y)

0 commit comments

Comments
 (0)