gordonlesti / dynamic-time-warping Goto Github PK
View Code? Open in Web Editor NEWDynamic time warping for JavaScript
License: MIT License
Dynamic time warping for JavaScript
License: MIT License
Thanks for this great little library.
For my purposes I am not interested in a result if a distance is going to be greater than a certain boundary (a maxDistance
). For performance reasons I would therefore like to return prematurely if we know that the distance will be greater than this boundary.
I tried to change:
matrix[ i ][ j ] = cost + distFunc( ser1[ i ], ser2[ j ] );
to:
matrix[ i ][ j ] = cost + distFunc( ser1[ i ], ser2[ j ] );
if (matrix[ i ][ j ] > maxDistance) {
return matrix[ i ][ j ];
}
But this did not have the desired effect. I'm probably not fully understanding the algorithm. Do you have any pointers that could help?
At line https://github.com/GordonLesti/dynamic-time-warping/blob/master/src/dynamic-time-warping.js#L37 it seems as though only a subpart of the actual DTW distance is returned.
In DTW the distance is the sum of the optimal path in the distance matrix (greedy search). So, shouldn't you iterate over the distance matrix and return a sum instead? @GordonLesti
export default class DynamicTimeWarping {
constructor(ts1, ts2, distanceFunction) {
this.ser1 = ts1;
this.ser2 = ts2;
this.distFunc = distanceFunction;
this.distance = null;
this.matrix = null;
this.path = null;
}
getDistance() {
if (this.distance !== null) {
return this.distance;
}
this.matrix = [];
for (var i = 0; i < this.ser1.length; i++) {
this.matrix[i] = [];
for (var j = 0; j < this.ser2.length; j++) {
var cost = Infinity;
if (i > 0) {
cost = Math.min(cost, this.matrix[i - 1][j]);
if (j > 0) {
cost = Math.min(cost, this.matrix[i - 1][j - 1]);
cost = Math.min(cost, this.matrix[i][j - 1]);
}
} else {
if (j > 0) {
cost = Math.min(cost, this.matrix[i][j - 1]);
} else {
cost = 0;
}
}
this.matrix[i][j] = cost + this.distFunc(this.ser1[i], this.ser2[j]);
}
}
return this.matrix[this.ser1.length - 1][this.ser2.length - 1];
};
getPath() {
if (this.path !== null) {
return this.path;
}
if (this.matrix === null) {
this.getDistance();
}
var i = this.ser1.length - 1;
var j = this.ser2.length - 1;
this.path = [[i, j]];
while (i > 0 || j > 0) {
if (i > 0) {
if (j > 0) {
if (this.matrix[i - 1][j] < this.matrix[i - 1][j - 1]) {
if (this.matrix[i - 1][j] < this.matrix[i][j - 1]) {
this.path.push([i - 1, j]);
i--;
} else {
this.path.push([i, j - 1]);
j--;
}
} else {
if (this.matrix[i - 1][j - 1] < this.matrix[i][j - 1]) {
this.path.push([i - 1, j - 1]);
i--;
j--;
} else {
this.path.push([i, j - 1]);
j--;
}
}
} else {
this.path.push([i - 1, j]);
i--;
}
} else {
this.path.push([i, j - 1]);
j--;
}
}
this.path = this.path.reverse();
return this.path;
};
}
You create it via let dtw = new DynamicTimeWarping(...)
.
Can you think about integrating this and running your tests on it?
will it work for
mailtivarite time series classification for example mixture of categorical and continues data
for example at time t1 we have observation: red, 2.4 , 5, 12.456 and time t2: green, 3.5, 2, 45.78; time t3: black, 5.6, 7, 23.56; t4: red, 2.1, 5, 12.6 ?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.