知识图谱实战应用3-知识图谱中的电影推荐算法
大家好,我是微学AI,今天给大家讲一下知识图谱中的电影推荐算法。主要利用奇异值分解(SVD)算法进行应用。
一、奇异值分解(SVD)
SVD(奇异值分解)是一种常见的线性代数算法,用于将一个矩阵分解为三个矩阵的乘积。原来SVD的主要应用领域包括图像处理、信号处理、信息检索等。
给定一个矩阵A,SVD将其分解为U、S和V三个矩阵的乘积,可以表示为
,其中U和V都是正交矩阵,S是一个对角矩阵,其中对角线上的元素称为奇异值。SVD可以将原始矩阵A分解成多个低秩矩阵的乘积,从而对高维数据进行降维和特征提取,例如图片的主题识别、用户偏好和相关性分析等应用。在推荐系统中,SVD可以用于处理稀疏用户-电影评分矩阵,通过分解矩阵来预测用户对未评分电影的喜好程度,并提供个性化的推荐列表。
举一个例子说明:一个矩阵是如何进行奇异值分解的。矩阵A定义为:
二、利用SVD实现推荐算法
一个基于SVD的知识图谱的电影推荐算法的步骤:
构建知识图谱:为电影库中的每个电影创建一个节点,并为它们之间的相似关系创建有向边。相似性可以通过计算两个电影的共同观众数、评分差异、演员、导演、电影流派等因素来衡量。
推导用户向量:对于每个用户,基于他们观看的电影和对应的评分来构建一个向量,包括每个电影的得分或者未评分。
使用SVD分解用户向量:对于每个用户向量,我们可以应用SVD将其分解为三个独立的矩阵:U、S和V。
进行矩阵近似:基于SVD分解的结果,我们可以使用矩阵近似来填充用户未评分的电影得分。这可以通过将U、S和V乘起来得到一个新的矩阵。
应用SVD重构矩阵产生推荐列表:基于相似性衡量,我们可以根据计算出的矩阵来推荐给用户可能感兴趣的电影。我们可以将所有电影的向量与用户向量进行相似性计算,然后在最相似的电影中选择最高得分的电影作为推荐。
通过这个基于知识图谱和SVD的推荐算法,我们可以为每个用户提供个性化的电影推荐。这种方法不仅可以优化推荐系统的效率,而且可以结合许多不同的信息源来提高推荐的准确性和多样性。
三、代码实现部分
import pandas as pd
from surprise import Dataset, Reader
from surprise import SVD
from surprise.model_selection import train_test_split
# 读取数据
data = pd.read_csv('ratings.csv')
读取数据文件 ratings.csv,这个数据是整理好的,也可以从知识图谱中获取用户给某个电影id的评分,数据表格结构:
userId | movieId | rating |
1 | 2 | 3.5 |
1 | 29 | 3.5 |
2 | 2 | 4 |
2 | 5 | 2.4 |
3 | 1 | 4.5 |
3 | 2 | 2.4 |
4 | 5 | 3.4 |
4 | 20 | 3.5 |
5 | 3 | 3.3 |
5 | 2 | 3.7 |
6 | 1 | 3.9 |
6 | 2 | 3.6 |
6 | 29 | 3.5 |
6 | 22 | 4.5 |
获取数据集:
# 设置reader
reader = Reader(rating_scale=(0, 5))
# 加载数据集
dataset = Dataset.load_from_df(data[['userId', 'movieId', 'rating']], reader)
# 划分数据集
trainset, testset = train_test_split(dataset, test_size=0.2)
# 训练模型
algo = SVD()
algo.fit(trainset)
# 预测评分
predictions = algo.test(testset)
# 为用户推荐电影
userId = 1
user_movies = data[data['userId'] == userId]['movieId']
user_unrated_movies = data[~data['movieId'].isin(user_movies)]['movieId']
user_unrated_movies = list(set(user_unrated_movies))[:10]
user_unrated_movies_with_pred = [(movieId, algo.predict(userId, movieId).est) for movieId in user_unrated_movies]
user_unrated_movies_with_pred.sort(key=lambda x: x[1], reverse=True)
top_n = user_unrated_movies_with_pred[:5]
print("Top 5 recommended movies for user", userId, ":", top_n)
为id为1的用户推荐以下电影:运行结果如下:
Top 5 recommended movies for user 1 : [(3, 3.7906799242225158), (1, 3.7335070393386838), (20, 3.645978328959462), (22, 3.600291294993506), (5, 3.4568901667773586)]
有什么问题和需要合作的请私信,后续更多人工智能相关知识呈现给大家!请持续关注!