diff --git a/src/main/java/net/seninp/jmotif/sax/TSProcessor.java b/src/main/java/net/seninp/jmotif/sax/TSProcessor.java index ae12c1b..37d3ce9 100644 --- a/src/main/java/net/seninp/jmotif/sax/TSProcessor.java +++ b/src/main/java/net/seninp/jmotif/sax/TSProcessor.java @@ -271,11 +271,26 @@ public double stDev(double[] series) { /** * Z-Normalize routine. + * Single parameter version is for actual distance calculation. + * Double parameter version (include normalizationThreshold) is for SAX. * * @param series the input timeseries. * @param normalizationThreshold the zNormalization threshold value. * @return Z-normalized time-series. */ + + public double[] znorm(double[] series) { + double[] res = new double[series.length]; + double mean = mean(series); + double sd = stDev(series); + + for (int i = 0; i < res.length; i++) { + res[i] = (series[i] - mean) / sd; + } + return res; + + } + public double[] znorm(double[] series, double normalizationThreshold) { double[] res = new double[series.length]; double mean = mean(series); diff --git a/src/main/java/net/seninp/jmotif/sax/discord/HOTSAXImplementation.java b/src/main/java/net/seninp/jmotif/sax/discord/HOTSAXImplementation.java index a81391a..e18ede9 100644 --- a/src/main/java/net/seninp/jmotif/sax/discord/HOTSAXImplementation.java +++ b/src/main/java/net/seninp/jmotif/sax/discord/HOTSAXImplementation.java @@ -233,7 +233,7 @@ private static DiscordRecord findBestDiscordWithMagic(double[] series, int windo // fix the current subsequence trace double[] currentCandidateSeq = tp - .znorm(tp.subseriesByCopy(series, currentPos, currentPos + windowSize), nThreshold); + .znorm(tp.subseriesByCopy(series, currentPos, currentPos + windowSize)); // let the search begin .. double nearestNeighborDist = Double.MAX_VALUE; @@ -254,7 +254,7 @@ private static DiscordRecord findBestDiscordWithMagic(double[] series, int windo // nextOccurrence + windowSize); // double dist = ed.distance(currentCandidateSeq, occurrenceSubsequence); double dist = distance(currentCandidateSeq, series, nextOccurrence, - nextOccurrence + windowSize, nThreshold); + nextOccurrence + windowSize); distanceCalls++; // keep track of best so far distance @@ -309,8 +309,7 @@ private static DiscordRecord findBestDiscordWithMagic(double[] series, int windo // double[] randomSubsequence = tp.subseriesByCopy(series, randomPos, // randomPos + windowSize); // double dist = ed.distance(currentCandidateSeq, randomSubsequence); - double dist = distance(currentCandidateSeq, series, randomPos, randomPos + windowSize, - nThreshold); + double dist = distance(currentCandidateSeq, series, randomPos, randomPos + windowSize); distanceCalls++; // keep track @@ -668,16 +667,15 @@ private static ArrayList hashToFreqEntries( * Calculates the Euclidean distance between two points. Don't use this unless you need that. * * @param subseries The first subsequence -- ASSUMED TO BE Z-normalized. - * @param series The second point. + * @param series The second subsequence. * @param from the initial index of the range to be copied, inclusive * @param to the final index of the range to be copied, exclusive. (This index may lie outside the * array.) * @param nThreshold z-Normalization threshold. * @return The Euclidean distance between z-Normalized versions of subsequences. */ - private static double distance(double[] subseries, double[] series, int from, int to, - double nThreshold) throws Exception { - double[] subsequence = tp.znorm(tp.subseriesByCopy(series, from, to), nThreshold); + private static double distance(double[] subseries, double[] series, int from, int to) throws Exception { + double[] subsequence = tp.znorm(tp.subseriesByCopy(series, from, to)); Double sum = 0D; for (int i = 0; i < subseries.length; i++) { double tmp = subseries[i] - subsequence[i];