Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }