Case 2. Why Euclidean distance is worse than cosine similarity
Comparing Euclidean distance and cosine similarity on the same vectors
In this case, we compare Euclidean distance and cosine similarity on exactly the same vectors. You will see that Euclidean distance is sensitive to vector magnitude, while cosine similarity preserves semantic closeness even when one vector is a scaled version of another.
Example of use
<?php
include 'code-en.php';
// Query: We want to find documents about speeding up email sending
$query = [
'text' => 'speed up email sending',
'embedding' => [0.10, 0.82, 0.31, 0.60, 0.70],
];
// Part 1. Calculating the Euclidean distance (smaller = better)
$euclideanDocuments = $documents;
foreach ($euclideanDocuments as &$document) {
$document['euclidean'] = euclideanDistance($query['embedding'], $document['embedding']);
}
unset($document);
usort($euclideanDocuments, function ($a, $b) {
return $a['euclidean'] <=> $b['euclidean'];
});
echo 'Part 1. Euclidean distance' . PHP_EOL;
foreach ($euclideanDocuments as $document) {
echo $document['title'] . ' => ' . round($document['euclidean'], 3) . PHP_EOL;
}
echo PHP_EOL;
// Part 2. Calculating cosine similarity (bigger = better)
$cosineDocuments = $documents;
foreach ($cosineDocuments as &$document) {
$document['cosine'] = cosineSimilarity($query['embedding'], $document['embedding']);
}
unset($document);
usort($cosineDocuments, function ($a, $b) {
return $b['cosine'] <=> $a['cosine'];
});
echo 'Part 2. Cosine similarity' . PHP_EOL;
foreach ($cosineDocuments as $document) {
echo $document['title'] . ' => ' . round($document['cosine'], 3) . PHP_EOL;
}
Documents:
Query: speed up email sending
Email campaign optimization
Scaling PHP workers
Monitoring email delivery
Scaled email embedding
How to make coffee
Result:
Memory: 0.012 Mb
Time running: 0.001 sec.
Part 1. Euclidean distance
Email campaign optimization => 0.036
Scaling PHP workers => 0.063
Monitoring email delivery => 0.108
How to make coffee => 1.422
Scaled email embedding => 11.422
Part 2. Cosine similarity
Email campaign optimization => 1
Scaled email embedding => 1
Scaling PHP workers => 0.999
Monitoring email delivery => 0.998
How to make coffee => 0.196
What went wrong
This is a very important point.
The document Scaled email embedding is almost identical to the query in meaning.
But Euclidean distance treats it as very far away only because its vector magnitude is much larger.