-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathIQROutlierRemoval.cs
63 lines (53 loc) · 2.24 KB
/
IQROutlierRemoval.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
namespace AiDotNet.OutlierRemoval;
public class IQROutlierRemoval : IOutlierRemoval
{
public IQROutlierRemoval(IQuartile? quartile = null)
{
Quartile = quartile;
}
internal int[] DetermineIQR(double[] unfiltered)
{
//initializes new type StandardQuartile of class IQuartile only if type is null else leaves the same.
var (q1Value, _, q3Value) = QuartileHelper.FindQuartiles(unfiltered, Quartile ?? new StandardQuartile());
var iQR = q3Value - q1Value;
var factor = 1.5 * iQR;
var minLimit = q1Value - factor;
var maxLimit = q3Value + factor;
return QuartileHelper.FindIndicesToRemove(unfiltered, minLimit, maxLimit);
}
internal override (double[], double[]) RemoveOutliers(double[] rawInputs, double[] rawOutputs)
{
//Create Deep Copy
var sortedInputs = rawInputs.ToArray();
var sortedOutputs = rawOutputs.ToArray();
//Sort Both Arrays according to Input's ascending order
Array.Sort(sortedInputs, sortedOutputs);
var ignoredIndices = DetermineIQR(sortedInputs);
return QuartileHelper.FilterArraysWithIndices(sortedInputs, sortedOutputs, ignoredIndices);
}
internal override (double[][], double[]) RemoveOutliers(double[][] rawInputs, double[] rawOutputs)
{
var length = rawInputs[0].Length;
var finalInputs = Array.Empty<double[]>();
var finalOutputs = Array.Empty<double>();
for (var i = 0; i < length; i++)
{
var (cleanedInputs, cleanedOutputs) = RemoveOutliers(rawInputs[i], rawOutputs);
finalInputs[i] = cleanedInputs;
finalOutputs = cleanedOutputs;
}
return (finalInputs, finalOutputs);
}
internal override (double[][], double[][]) RemoveOutliers(double[][] rawInputs, double[][] rawOutputs)
{
var finalInputs = Array.Empty<double[]>();
var finalOutputs = Array.Empty<double[]>();
for (var i = 0; i < rawInputs.Length; i++)
{
var (cleanedInputs, cleanedOutputs) = RemoveOutliers(rawInputs[i], rawOutputs[i]);
finalInputs[i] = cleanedInputs;
finalOutputs[i] = cleanedOutputs;
}
return (finalInputs, finalOutputs);
}
}