“为什么库和自己计算的余弦相似度不一样?”

问题描述 投票:0回答:1

我目前正在构建一个图书推荐系统,我想使用KNN算法进行协同过滤。我想我很了解KNN算法的过程,我想使用基于项目的方法来计算项目向量之间的相似度。但是,图书馆计算的相似度和我自己计算的相似度有差异,不知道是什么原因。你能帮帮我吗?

from surprise import Dataset, Reader, KNNWithMeans
# 데이터프레임 생성
ratings_dict = {
    "item": [1, 2, 1, 2, 1, 2, 1, 2, 1],
    "user": ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E'],
    "rating": [1, 2, 2, 4, 2.5, 4, 4.5, 5, 3],
}
df = pd.DataFrame(ratings_dict)


# Surprise 라이브러리에서 사용할 데이터셋 형태로 변환
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(df[['user', 'item', 'rating']], reader)

# 유사도 행렬 계산 (item_based)
sim_options = {'name': 'cosine', 'user_based': False}
algo = KNNWithMeans(sim_options=sim_options)
trainingSet = data.build_full_trainset()
algo.fit(trainingSet)

similarity_matrix = algo.compute_similarities()
print(similarity_matrix)

此代码结果

[[1。 0.96954671] [0.96954671 1.]]

item    1    2
user          
A     1.0  2.0
B     2.0  4.0
C     2.5  4.0
D     4.5  5.0
E     3.0  NaN

但是

import numpy as np

# 두 벡터 정의
vector1 = np.array([1, 2, 2.5, 4.5, 3])
vector2 = np.array([2, 4, 4, 5, 0])


# 코사인 유사도 계산
cosine_sim_1 = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))


print(cosine_sim_1)

此代码结果

0.8550598237348973

我认为惊喜库用非 0 的值填充了 NaN 值。我预计它是 0,但似乎使用了另一个值。

我尝试了ChatGPT,但它无法帮助我解决问题。

python knn recommendation-engine collaborative-filtering
1个回答
0
投票
vector1 = np.array([1, 2, 2.5, 4.5])
vector2 = np.array([2, 4, 4, 5])

# 코사인 유사도 계산
cosine_sim_1 = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))
print(cosine_sim_1)

代码的第一部分只是计算 4D 向量的余弦相似度,省略了最后一个值,其中一个是 NaN

© www.soinside.com 2019 - 2024. All rights reserved.