{"id":19267024,"url":"https://github.com/mljs/distance","last_synced_at":"2025-04-08T04:14:04.077Z","repository":{"id":22356151,"uuid":"25692172","full_name":"mljs/distance","owner":"mljs","description":"Distance functions to compare vectors","archived":false,"fork":false,"pushed_at":"2024-10-21T08:37:12.000Z","size":319,"stargazers_count":70,"open_issues_count":5,"forks_count":4,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-04-01T03:34:21.039Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://mljs.github.io/distance/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mljs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-10-24T14:24:33.000Z","updated_at":"2025-02-19T05:22:27.000Z","dependencies_parsed_at":"2024-06-18T15:19:04.730Z","dependency_job_id":"6999520d-00f1-45d0-8e82-c2d0ce15df38","html_url":"https://github.com/mljs/distance","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mljs%2Fdistance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mljs%2Fdistance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mljs%2Fdistance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mljs%2Fdistance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mljs","download_url":"https://codeload.github.com/mljs/distance/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247773719,"owners_count":20993639,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T20:09:30.421Z","updated_at":"2025-04-08T04:14:04.056Z","avatar_url":"https://github.com/mljs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ml-distance\n\n\u003ch3 align=\"center\"\u003e\n  \n  \u003ca href=\"https://www.zakodium.com\"\u003e\n   \u003cimg src=\"https://www.zakodium.com/brand/zakodium-logo-white.svg\" width=\"50\" alt=\"Zakodium logo\" /\u003e\n  \u003c/a\u003e\n  \n  \u003cp\u003e\n    Maintained by \u003ca href=\"https://www.zakodium.com\"\u003eZakodium\u003c/a\u003e\n  \u003c/p\u003e\n  \n[![NPM version][npm-image]][npm-url]\n[![Node.js CI](https://github.com/mljs/distance/actions/workflows/nodejs.yml/badge.svg)](https://github.com/mljs/distance/actions/workflows/nodejs.yml)\n[![Test coverage][codecov-image]][codecov-url]\n[![npm download][download-image]][download-url]\n  \n\u003c/h3\u003e\n\nDistance functions to compare vectors.\n\n## Installation\n\n`$ npm i ml-distance`\n\n## Methods\n\n### Distances\n\n- `euclidean(p, q)`\n\nReturns the [euclidean distance](http://en.wikipedia.org/wiki/Euclidean_distance#n_dimensions) between vectors p and q\n\n$d(p,q)=\\sqrt{\\sum\\limits_{i=1}^{n}(p_i-q_i)^2}$\n\n- `manhattan(p, q)`\n\nReturns the [city block distance](http://en.wikipedia.org/wiki/Taxicab_geometry) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}$\n\n- `minkowski(p, q, d)`\n\nReturns the [Minkowski distance](http://en.wikipedia.org/wiki/Minkowski_distance) between vectors p and q for order d\n\n- `chebyshev(p, q)`\n\nReturns the [Chebyshev distance](http://en.wikipedia.org/wiki/Chebyshev_distance) between vectors p and q\n\n$d(p,q)=\\max\\limits_i(|p_i-q_i|)$\n\n- `sorensen(p, q)`\n\nReturns the [Sørensen distance](http://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}}{\\sum\\limits_{i=1}^{n}{p_i+q_i}}$\n\n- `gower(p, q)`\n\nReturns the [Gower distance](https://stat.ethz.ch/education/semesters/ss2012/ams/slides/v4.2.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}}{n}$\n\n- `soergel(p, q)`\n\nReturns the [Soergel distance](http://www.orgchm.bas.bg/~vmonev/SimSearch.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}}{max(p_i,q_i)}$\n\n- `kulczynski(p, q)`\n\nReturns the [Kulczynski distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}}{min(p_i,q_i)}$\n\n- `canberra(p, q)`\n\nReturns the [Canberra distance](http://en.wikipedia.org/wiki/Canberra_distance) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}\\frac{\\left|{p_i-q_i}\\right|}{p_i+q_i}$\n\n- `lorentzian(p, q)`\n\nReturns the [Lorentzian distance](https://stat.ethz.ch/education/semesters/ss2012/ams/slides/v4.2.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}\\ln(\\left|{p_i-q_i}\\right|+1)$\n\n- `intersection(p, q)`\n\nReturns the [Intersection distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=1-\\sum\\limits_{i=1}^{n}min(p_i,q_i)$\n\n- `waveHedges(p, q)`\n\nReturns the [Wave Hedges distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}\\left(1-\\frac{min(p_i,q_i)}{max(p_i,q_i)}\\right)$\n\n- `czekanowski(p, q)`\n\nReturns the [Czekanowski distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=1-\\frac{2\\sum\\limits_{i=1}^{n}{min(p_i,q_i)}}{\\sum\\limits_{i=1}^{n}{p_i+q_i}}$\n\n- `motyka(p, q)`\n\nReturns the [Motyka distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=1-\\frac{\\sum\\limits_{i=1}^{n}{min(p_i,q_i)}}{\\sum\\limits_{i=1}^{n}{p_i+q_i}}$\n\nNote: distance between 2 identical vectors is 0.5 !\n\n- `ruzicka(p, q)`\n\nReturns the [Ruzicka similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{max(p_i,q_i)}}{\\sum\\limits_{i=1}^{n}{min(p_i,q_i)}}$\n\n- `tanimoto(p, q, [bitVector])`\n\nReturns the [Tanimoto distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q, and accepts the bitVector use, see the test case for an example\n\n- `innerProduct(p, q)`\n\nReturns the [Inner Product similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$s(p,q)=\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}$\n\n- `harmonicMean(p, q)`\n\nReturns the [Harmonic mean similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=2\\sum\\limits_{i=1}^{n}\\frac{p_i\\cdot{q_i}}{p_i+q_i}$\n\n- `cosine(p, q)`\n\nReturns the [Cosine similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}}{\\sum\\limits_{i=1}^{n}{p_i^2}\\sum\\limits_{i=1}^{n}{q_i^2}}$\n\n- `kumarHassebrook(p, q)`\n\nReturns the [Kumar-Hassebrook similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}}{\\sum\\limits_{i=1}^{n}{p_i^2}+\\sum\\limits_{i=1}^{n}{q_i^2}-\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}}$\n\n- `jaccard(p, q)`\n\nReturns the [Jaccard distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=1-\\frac{\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}}{\\sum\\limits_{i=1}^{n}{p_i^2}+\\sum\\limits_{i=1}^{n}{q_i^2}-\\sum\\limits_{i=1}^{n}{p_i\\cdot{q_i}}}$\n\n- `dice(p,q)`\n\nReturns the [Dice distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=1-\\frac{\\sum\\limits_{i=1}^{n}{(p_i-q_i)^2}}{\\sum\\limits_{i=1}^{n}{p_i^2}+\\sum\\limits_{i=1}^{n}{q_i^2}}$\n\n- `fidelity(p, q)`\n\nReturns the [Fidelity similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\sqrt{p_i\\cdot{q_i}}}$\n\n- `bhattacharyya(p, q)`\n\nReturns the [Bhattacharyya distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=-\\ln\\left(\\sum\\limits_{i=1}^{n}{\\sqrt{p_i\\cdot{q_i}}}\\right)$\n\n- `hellinger(p, q)`\n\nReturns the [Hellinger distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=2\\cdot\\sqrt{1-\\sum\\limits_{i=1}^{n}{\\sqrt{p_i\\cdot{q_i}}}}$\n\n- `matusita(p, q)`\n\nReturns the [Matusita distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sqrt{2-2\\cdot\\sum\\limits_{i=1}^{n}{\\sqrt{p_i\\cdot{q_i}}}}$\n\n- `squaredChord(p, q)`\n\nReturns the [Squared-chord distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{(\\sqrt{p_i}-\\sqrt{q_i})^2}$\n\n- `squaredEuclidean(p, q)`\n\nReturns the [squared euclidean distance](http://en.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{(p_i-q_i)^2}$\n\n- `pearson(p, q)`\n\nReturns the [Pearson distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2}{q_i}}$\n\n- `neyman(p, q)`\n\nReturns the [Neyman distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2}{p_i}}$\n\n- `squared(p, q)`\n\nReturns the [Squared distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2}{p_i+q_i}}$\n\n- `probabilisticSymmetric(p, q)`\n\nReturns the [Probabilistic Symmetric distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=2\\cdot\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2}{p_i+q_i}}$\n\n- `divergence(p, q)`\n\nReturns the [Divergence distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=2\\cdot\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2}{(p_i+q_i)^2}}$\n\n- `clark(p, q)`\n\nReturns the [Clark distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sqrt{\\sum\\limits_{i=1}^{n}{\\left(\\frac{\\left|p_i-q_i\\right|}{(p_i+q_i)}\\right)^2}}$\n\n- `additiveSymmetric(p, q)`\n\nReturns the [Additive Symmetric distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\frac{(p_i-q_i)^2\\cdot(p_i+q_i)}{p_i\\cdot{q_i}}}$\n\n- `kullbackLeibler(p, q)`\n\nReturns the [Kullback-Leibler distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{p_i\\cdot\\ln\\frac{p_i}{q_i}}$\n\n- `jeffreys(p, q)`\n\nReturns the [Jeffreys distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left((p_i-q_i)\\ln\\frac{p_i}{q_i}\\right)}$\n\n- `kdivergence(p, q)`\n\nReturns the [K divergence distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left(p_i\\cdot\\ln\\frac{2p_i}{p_i+q_i}\\right)}$\n\n- `topsoe(p, q)`\n\nReturns the [Topsøe distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left(p_i\\cdot\\ln\\frac{2p_i}{p_i+q_i}+q_i\\cdot\\ln\\frac{2q_i}{p_i+q_i}\\right)}$\n\n- `jensenShannon(p, q)`\n\nReturns the [Jensen-Shannon distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\frac{1}{2}\\left[\\sum\\limits_{i=1}^{n}{p_i\\cdot\\ln\\frac{2p_i}{p_i+q_i}}+\\sum\\limits_{i=1}^{n}{q_i\\cdot\\ln\\frac{2q_i}{p_i+q_i}}\\right]$\n\n- `jensenDifference(p, q)`\n\nReturns the [Jensen difference distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left[\\frac{p_i\\ln{p_i}+q_i\\ln{q_i}}{2}-\\left(\\frac{p_i+q_i}{2}\\right)\\ln\\left(\\frac{p_i+q_i}{2}\\right)\\right]}$\n\n- `taneja(p, q)`\n\nReturns the [Taneja distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\left[\\frac{p_i+q_i}{2}\\ln\\left(\\frac{p_i+q_i}{2\\sqrt{p_i\\cdot{q_i}}}\\right)\\right]}$\n\n- `kumarJohnson(p, q)`\n\nReturns the [Kumar-Johnson distance](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n$d(p,q)=\\sum\\limits_{i=1}^{n}{\\frac{\\left(p_i^2-q_i^2\\right)^2}{2(p_i\\cdot{q_i})^{3/2}}}$\n\n- `avg(p, q)`\n\nReturns the average of city block and Chebyshev distances between vectors p and q\n\n$d(p,q)=\\frac{\\sum\\limits_{i=1}^{n}{\\left|p_i-q_i\\right|}+\\max\\limits_i(|p_i-q_i|)}{2}$\n\n### Similarities\n\n- `intersection(p, q)`\n\nReturns the [Intersection similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `czekanowski(p, q)`\n\nReturns the [Czekanowski similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `motyka(p, q)`\n\nReturns the [Motyka similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `kulczynski(p, q)`\n\nReturns the [Kulczynski similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `squaredChord(p, q)`\n\nReturns the [Squared-chord similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `jaccard(p, q)`\n\nReturns the [Jaccard similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `dice(p, q)`\n\nReturns the [Dice similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q\n\n- `tanimoto(p, q, [bitVector])`\n\nReturns the [Tanimoto similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q, and accepts the bitVector use, see the test case for an example\n\n- `tree(a,b, from, to, [options])`\n\nRefer to [ml-tree-similarity](https://github.com/mljs/tree-similarity)\n\n## Contributing\n\nA new metric should normally be in its own file in the src/dist directory. There should be a corresponding test file in test/dist.  \nThe metric should be then added in the exports of src/index.js with a relatively small but understandable name (use camelCase).  \nIt should also be added to this README with either a link to the formula or an inline description.\n\n## Authors\n\n- [Michaël Zasso](https://github.com/targos)\n- [Miguel Angel Asencio Hurtado](https://github.com/maasencioh)\n\n## License\n\n[MIT](./LICENSE)\n\n[npm-image]: https://img.shields.io/npm/v/ml-distance.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/ml-distance\n[codecov-image]: https://img.shields.io/codecov/c/github/mljs/distance.svg\n[codecov-url]: https://codecov.io/gh/mljs/distance\n[download-image]: https://img.shields.io/npm/dm/ml-distance.svg?style=flat-square\n[download-url]: https://npmjs.org/package/ml-distance\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmljs%2Fdistance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmljs%2Fdistance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmljs%2Fdistance/lists"}