Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,6 @@ $d(p,q)=1-\frac{\sum\limits_{i=1}^{n}{min(p_i,q_i)}}{\sum\limits_{i=1}^{n}{p_i+q

Note: distance between 2 identical vectors is 0.5 !

- `ruzicka(p, q)`

Returns the [Ruzicka similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q. The matching distance is `soergel`.

$s(p,q)=\frac{\sum\limits_{i=1}^{n}{min(p_i,q_i)}}{\sum\limits_{i=1}^{n}{max(p_i,q_i)}}$

- `tanimoto(p, q, [bitVector])`

Returns 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
Expand Down Expand Up @@ -331,6 +325,12 @@ $s(p,q)=\frac{\sum\limits_{i=1}^{n}{p_i\cdot{q_i}}}{\sum\limits_{i=1}^{n}{p_i^2}

Returns the [Pearson correlation](https://en.wikipedia.org/wiki/Pearson_correlation_coefficient) between vectors p and q, i.e. the cosine similarity of the mean-centred vectors

- `ruzicka(p, q)`

Returns the [Ruzicka similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf), also known as the [weighted Jaccard similarity](https://en.wikipedia.org/wiki/Jaccard_index#Weighted_Jaccard_similarity_and_distance), between vectors p and q. The matching distance is `soergel`.

$s(p,q)=\frac{\sum\limits_{i=1}^{n}{min(p_i,q_i)}}{\sum\limits_{i=1}^{n}{max(p_i,q_i)}}$

- `dice(p, q)`

Returns the [Dice similarity](http://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf) between vectors p and q
Expand Down
2 changes: 1 addition & 1 deletion scripts/similarity.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ let v10 = [-0.4, 0.4];
let v11 = [-0.6, 0.7];

for (let algorithm in distance) {
if (algorithm.match(/fidelity|harmonicMean|innerProduct|ruzicka/)) continue;
if (algorithm.match(/fidelity|harmonicMean|innerProduct/)) continue;
if (algorithm.match(/minkowski/) && algorithm.match(/motyka/)) continue; // does not give a 0 with identical vector
let result = { algorithm };
let callback = distance[algorithm];
Expand Down
2 changes: 0 additions & 2 deletions src/distances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ export * from './distances/pearson.ts';

export * from './distances/probabilisticSymmetric.ts';

export * from './distances/ruzicka.ts';

export * from './distances/soergel.ts';

export * from './distances/sorensen.ts';
Expand Down
2 changes: 2 additions & 0 deletions src/similarities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ export * from './similarities/motyka.ts';

export * from './similarities/pearson.ts';

export * from './similarities/ruzicka.ts';

export * from './similarities/squaredChord.ts';

export * from './similarities/tanimoto.ts';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,42 @@
import { expect, test } from 'vitest';

import { distance } from '../../index.ts';
import { distance, similarity } from '../../index.ts';

const v1 = [0.2, 0.4, 0.3, 0.1];
const v2 = [0.3, 0.2, 0.3, 0.2];

test('should be correct', () => {
expect(distance.ruzicka(v1, v2)).toBe(2 / 3);
expect(similarity.ruzicka(v1, v2)).toBe(2 / 3);
});

test('should be 1 for identical vectors, not 0 as a distance would be', () => {
expect(distance.ruzicka(v1, v1)).toBe(1);
expect(similarity.ruzicka(v1, v1)).toBe(1);
expect(distance.soergel(v1, v1)).toBe(0);
});

test('should grow as the vectors get more similar', () => {
const far = distance.ruzicka([1, 0], [0, 1]);
const near = distance.ruzicka([1, 0], [0.9, 0.1]);
const far = similarity.ruzicka([1, 0], [0, 1]);
const near = similarity.ruzicka([1, 0], [0.9, 0.1]);

expect(far).toBe(0);
expect(near).toBeCloseTo(0.818181, 5);
expect(near).toBeGreaterThan(far);
});

test('should be the complement of the soergel distance', () => {
expect(1 - distance.ruzicka(v1, v2)).toBeCloseTo(
expect(1 - similarity.ruzicka(v1, v2)).toBeCloseTo(
distance.soergel(v1, v2),
10,
);
});

test('should be the complement of the tanimoto distance', () => {
expect(1 - distance.ruzicka(v1, v2)).toBeCloseTo(
expect(1 - similarity.ruzicka(v1, v2)).toBeCloseTo(
distance.tanimoto(v1, v2),
10,
);
});

test('should not be exported as a distance', () => {
expect(distance).not.toHaveProperty('ruzicka');
});
5 changes: 4 additions & 1 deletion src/distances/ruzicka.ts → src/similarities/ruzicka.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import type { NumberArray } from 'cheminfo-types';
/**
*Returns the Ruzicka similarity between vectors a and b
*Returns the Ruzicka similarity between vectors a and b, also known as the
* weighted Jaccard similarity. It is 1 for identical vectors; the matching
* distance is `soergel`.
* @link [Ruzicka algorithm](https://www.naun.org/main/NAUN/ijmmas/mmmas-49.pdf)
* @link [Weighted Jaccard similarity](https://en.wikipedia.org/wiki/Jaccard_index#Weighted_Jaccard_similarity_and_distance)
* @param a - first vector
* @param b - second vector
*/
Expand Down
Loading