我目前正在构建一个图书推荐系统,我想使用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,但它无法帮助我解决问题。
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