-
Notifications
You must be signed in to change notification settings - Fork 626
Closed
Labels
bugsomething is clearly wrong heresomething is clearly wrong here
Description
for
from typing import List, Union
import numpy as np
Matrix = Union[List[List[float]], List[np.ndarray], np.ndarray]
def cosine_similarity(X: Matrix, Y: Matrix) -> np.ndarray:
if len(X) == 0 or len(Y) == 0:
return np.array([])
X = np.array(X)
Y = np.array(Y)
if X.shape[1] != Y.shape[1]:
raise ValueError(
f"Number of columns in X and Y must be the same. X has shape {X.shape} "
f"and Y has shape {Y.shape}."
)
X_norm = np.linalg.norm(X, axis=1)
Y_norm = np.linalg.norm(Y, axis=1)
similarity = np.dot(X, Y.T) / np.outer(X_norm, Y_norm)
similarity[np.isnan(similarity) | np.isinf(similarity)] = 0.0
return similaritywe get
import main
from hypothesis import given, strategies as st
cosine_similarity_operands = st.one_of(
st.lists(st.lists(st.floats())),
st.lists(arrays(dtype=scalar_dtypes(), shape=array_shapes(max_dims=2))),
arrays(dtype=scalar_dtypes(), shape=array_shapes(max_dims=2)),
)
@given(
a=cosine_similarity_operands,
b=cosine_similarity_operands,
c=cosine_similarity_operands,
)
def test_associative_binary_operation_cosine_similarity(a, b, c) -> None:
left = main.cosine_similarity(X=a, Y=main.cosine_similarity(X=b, Y=c))
right = main.cosine_similarity(X=main.cosine_similarity(X=a, Y=b), Y=c)
assert left == right, (left, right)
@given(a=cosine_similarity_operands, b=cosine_similarity_operands)
def test_commutative_binary_operation_cosine_similarity(a, b) -> None:
left = main.cosine_similarity(X=a, Y=b)
right = main.cosine_similarity(X=b, Y=a)
assert left == right, (left, right)
@given(a=cosine_similarity_operands)
def test_identity_binary_operation_cosine_similarity(a) -> None:
identity = []
assert a == main.cosine_similarity(X=a, Y=identity)
assert a == main.cosine_similarity(X=identity, Y=a)arrays and scalar_dtypes are undefined
Metadata
Metadata
Assignees
Labels
bugsomething is clearly wrong heresomething is clearly wrong here