feat(visualizer): add cosine similarity computation for image comparison

This commit is contained in:
2026-02-07 15:05:12 +08:00
parent d6bb233651
commit 051bae5483
4 changed files with 362 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ import io
import numpy as np
from PIL import Image
from sklearn.metrics.pairwise import cosine_similarity
class TestImageUploadSimilaritySearch:
@@ -33,3 +34,44 @@ class TestImageUploadSimilaritySearch:
# Verify the image is valid
assert parsed_img.size == (224, 224)
assert parsed_img.mode == "RGB"
class TestCosineSimilarity:
"""Test suite for cosine similarity computation between feature vectors."""
def test_identical_vectors_return_one(self):
"""Identical vectors should have cosine similarity of 1.0."""
vec = np.random.randn(1024).tolist()
similarity = cosine_similarity([vec], [vec])[0][0]
assert np.isclose(similarity, 1.0)
def test_orthogonal_vectors_return_zero(self):
"""Orthogonal vectors should have cosine similarity of 0.0."""
vec_a = [1.0, 0.0]
vec_b = [0.0, 1.0]
similarity = cosine_similarity([vec_a], [vec_b])[0][0]
assert np.isclose(similarity, 0.0)
def test_opposite_vectors_return_negative_one(self):
"""Opposite vectors should have cosine similarity of -1.0."""
vec_a = [1.0, 0.0, 0.0]
vec_b = [-1.0, 0.0, 0.0]
similarity = cosine_similarity([vec_a], [vec_b])[0][0]
assert np.isclose(similarity, -1.0)
def test_similarity_range(self):
"""Cosine similarity should always be within [-1, 1]."""
# Random vectors
for _ in range(10):
vec_a = np.random.randn(1024).tolist()
vec_b = np.random.randn(1024).tolist()
similarity = cosine_similarity([vec_a], [vec_b])[0][0]
assert -1.0 <= similarity <= 1.0
def test_similarity_with_list_input(self):
"""Cosine similarity should work with Python list inputs (as stored in dcc.Store)."""
# Simulate feature vectors stored as Python lists in dcc.Store
vec_a = [0.1, 0.2, 0.3, 0.4, 0.5]
vec_b = [0.1, 0.2, 0.3, 0.4, 0.5]
similarity = cosine_similarity([vec_a], [vec_b])[0][0]
assert np.isclose(similarity, 1.0)