Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ENH] Implement DTW with Global alignment #2565

Merged
merged 23 commits into from
Mar 19, 2025

Conversation

tanishy7777
Copy link
Contributor

@tanishy7777 tanishy7777 commented Feb 22, 2025

Fixes #444

Added DTW with global invariance in aeon

Changes

  • Implentation of DTW with GI added
  • Uses Numba for JIT compilation

TODO:

  • Add Tests

Comparision of dtw_gi implentations:

first implementation is implented in aeon
second implementation taken from https://rtavenar.github.io/hdr/parts/01/dtw/dtw_gi.html

The cost of 2nd is square root of the 1st cost($18.95^2$ = 359.20) because tslearn uses the Euclidean_distance but aeon uses squared Euclidean_distance
image

For all contributions
  • I've added myself to the list of contributors. Alternatively, you can use the @all-contributors bot to do this for you after the PR has been merged.
  • The PR title starts with either [ENH], [MNT], [DOC], [BUG], [REF], [DEP] or [GOV] indicating whether the PR topic is related to enhancement, maintenance, documentation, bugs, refactoring, deprecation or governance.
For new estimators and functions
  • I've added the estimator/function to the online API documentation.
  • (OPTIONAL) I've added myself as a __maintainer__ at the top of relevant files and want to be contacted regarding its maintenance. Unmaintained files may be removed. This is for the full file, and you should not add yourself if you are just making minor changes or do not want to help maintain its contents.
For developers with write access
  • (OPTIONAL) I've updated aeon's CODEOWNERS to receive notifications about future changes to these files.

@aeon-actions-bot aeon-actions-bot bot added distances Distances package enhancement New feature, improvement request or other non-bug code enhancement labels Feb 22, 2025
@aeon-actions-bot
Copy link
Contributor

Thank you for contributing to aeon

I have added the following labels to this PR based on the title: [ $\color{#FEF1BE}{\textsf{enhancement}}$ ].
I have added the following labels to this PR based on the changes made: [ $\color{#5209C9}{\textsf{distances}}$ ]. Feel free to change these if they do not properly represent the PR.

The Checks tab will show the status of our automated tests. You can click on individual test runs in the tab or "Details" in the panel below to see more information if there is a failure.

If our pre-commit code quality check fails, any trivial fixes will automatically be pushed to your PR unless it is a draft.

Don't hesitate to ask questions on the aeon Slack channel if you have any.

PR CI actions

These checkboxes will add labels to enable/disable CI functionality for this PR. This may not take effect immediately, and a new commit may be required to run the new configuration.

  • Run pre-commit checks for all files
  • Run mypy typecheck tests
  • Run all pytest tests and configurations
  • Run all notebook example tests
  • Run numba-disabled codecov tests
  • Stop automatic pre-commit fixes (always disabled for drafts)
  • Disable numba cache loading
  • Push an empty commit to re-run CI checks

@chrisholder
Copy link
Contributor

Generally this looks good but we need to add a couple things to make it compatible with the rest of our distances.

First you need to define a function for:

  • dtw_gi_distance - this returns the distance between two time series using dtw_gi distance
  • dtw_gi_cost_matrix - this returns the cost matrix used to produce the distance measure
  • dtw_gi_pairwise_distance - this returns a pairwise distance matrix for a single dataset or between two dataset if y specified
  • dtw_gi_alignment_path - this should return the optimal alignment path between two time series for dtw_gi

We spoke on slack earlier about this as well. While you mentioned it would introduce very little new logic it's still nice to have these as defined functions. For example DDTW essentially just returns the same thing as DTW see https://github.com/aeon-toolkit/aeon/blob/main/aeon/distances/elastic/_ddtw.py#L328. When adding the above look at the DTW distance measure and just copy and paste the code is my recommendation.

Once you have added the above you can add your distance to our DISTANCE list which will mean the tests will automatically run for this distances. See: https://github.com/aeon-toolkit/aeon/blob/main/aeon/distances/_distance.py#L688. Once the functions above are defined you will add this to the list:

{
    "name": "dtw_gi",
    "distance": dtw_gi_distance,
    "pairwise_distance": dtw_gi_pairwise_distance,
    "cost_matrix": dtw_gi_cost_matrix,
    "alignment_path": dtw_gi_alignment_path,
    "type": DistanceType.ELASTIC,
    "symmetric": True,
    "unequal_support": True,
}

Once you're at this point give me a ping as then we can start sorting some further tests out which is a bit more fiddly to do so I'll help you with that. You can also run some tests locally to ensure your implementation is equivalent to the original.

Looks good overall though!

@tanishy7777
Copy link
Contributor Author

Once you have added the above you can add your distance to our DISTANCE list which will mean the tests will automatically run for this distances. See: https://github.com/aeon-toolkit/aeon/blob/main/aeon/distances/_distance.py#L688. Once the functions above are defined you will add this to the list:

@chrisholder Thanks for the detailed comment! I will start working on this first thing tomorrow. I was going through the paper for the MVM distance today and made some progress on that. I should be done with the PR for MVM soon(atleast the initial draft).

I'll follow your suggestions for DTW-GI, refer to the DDTW implementation, and ensure everything is properly added into the DISTANCE list.

@tanishy7777
Copy link
Contributor Author

I checked equivalence with this source https://rtavenar.github.io/hdr/parts/01/dtw/dtw_gi.html for multivariate, univariate and unequal length

image

Copy link
Contributor

@chrisholder chrisholder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great addition thanks for your hard work on this!

@chrisholder chrisholder merged commit ee0b6bf into aeon-toolkit:main Mar 19, 2025
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
distances Distances package enhancement New feature, improvement request or other non-bug code enhancement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[ENH] wrap/implement Global Alignment DTW
2 participants