public override double Train(List <Signature> signatures) { if (signatures == null) { throw new ArgumentNullException(nameof(signatures)); } if (signatures.Count == 0) { throw new ArgumentException("'sigantures' can not be empty", nameof(signatures)); } originals = signatures; List <double> costs = new List <double>(originals.Count); double avg = 0; double max = -1; int n = 0; List <object[]> debugInfo = new List <object[]>(); //object[,] debugInfo = new object[originals.Count+1, originals.Count+1]; var debugRow = new object[signatures.Count + 1]; for (int i = 0; i < originals.Count; i++) { debugRow[i + 1] = signatures[i].ID; } debugInfo.Add(debugRow); for (int i = 0; i < originals.Count - 1; i++) { debugRow = new object[signatures.Count + 1]; debugRow[0] = signatures[i].ID; for (int j = i + 1; j < originals.Count; j++) { //double cost = new Dtw(originals[i], originals[j], InputFeatures).CalculateDtwScore(); double cost = DtwHelper.GetCost(originals[i], originals[j], DtwType, InputFeatures); debugRow[j + 1] = cost; avg += cost; costs.Add(cost); if (cost > max) { max = cost; } n++; } debugInfo.Add(debugRow); } avg /= n; double dev = Measures.StandardDeviation(costs.ToArray(), false); threshold = avg + 0.8 * dev; // + Math.Abs(avg - max) / 2 ; //TODO: rendesen beállítani, valami adaptívabbat kitaláltni Logger.Info(this, signatures[0].Signer.ID + "-dtwclassifier-distances", debugInfo); return(threshold); }
public override double Test(Signature signature) { var debugInfo = (List <object[]>)Logger.ObjectEntries[signature.Signer.ID + "-dtwclassifier-distances"]; var debugRow = new object[originals.Count + 1]; debugRow[0] = signature.ID; double avgDist = 0; foreach (var original in originals) { //var dist = new Dtw(original, signature, InputFeatures).CalculateDtwScore(); var dist = DtwHelper.GetCost(original, signature, DtwType, InputFeatures); avgDist += dist; debugRow[originals.IndexOf(original) + 1] = dist; } debugInfo.Add(debugRow); avgDist /= originals.Count; return(CalculateTestResult(avgDist, threshold)); }
private double GetAvgDistFromReferences(Signature sig) { double avgDist = 0; int count = referenceSignatures.Count; foreach (var refSig in referenceSignatures) { if (sig == refSig) { count--; } else { //var dist = new Dtw(sig, refSig, InputFeatures).CalculateDtwScore(); var dist = DtwHelper.GetCost(sig, refSig, DtwType, InputFeatures); avgDist += dist; debugInfo[trainSignatures.IndexOf(sig) + 1, referenceSignatures.IndexOf(refSig) + 1] = dist; } } avgDist /= count; return(avgDist); }