【机器学习】【SVD-5】SVD在推荐(策略:TopK)系统中的应用简介 + 示例展示 + Python代码实现

本文介绍了SVD在推荐系统中的应用,详细阐述了TopK推荐策略,并提供了Python代码实现,包括Release和Debug两个版本。通过SVD找到与新用户最相似的TopK旧用户,推荐他们评分高且新用户未评分的商品。推荐商品按综合评分降序排列,同时可设置最小评分阈值排除某些商品。

1.SVD在推荐系统中的应用简介

此部分可以详见:SVD奇异值分解的基本原理介绍

2.SVD的TopK推荐系统的简介

TopK推荐策略就是指:找到和新用户最高相似度的TopK旧用户,将这k个旧用户评分而新用户未评分的所有商品推荐给新用户

每个旧用户对商品的评分都有一个权值,权值大小正相关于和新用户的相似度

注:本文系统还实现了推荐的商品是按照综合评分降序的顺序给出的~,用pandas.DataFrame很容易达到

3.svd TopK推荐系统的Python实现(Release版本)

3.1代码

# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Talk is cheap, show me the code
Aim:基于svd的推荐系统(推荐策略:topK)的代码实现(Release版本)
"""

import numpy as np
import pandas as pd
from pandas import DataFrame

class CSVD(object):
    '''
    实现基于svd的推荐系统
    推荐策略:找到和新用户相似度最高的旧用户,找到旧用户评分商品但新用户没有评分的商品,将这些商品推荐给新用户
    此系统是按照评分降序的顺序将商品推荐给用户
    '''
    
    def __init__(self, data):
        self.data = data       #用户数据
        self.S = []  #用户数据矩阵的奇异值序列 singular values
        self.U = []  #svd后的单位正交向量
        self.VT = []  #svd后的单位正交向量
        self.k = 0   #满足self.p的最小k值(k表示奇异值的个数)
        self.SD = [] #对角矩阵,对角线上元素是奇异值 singular values diagonal matrix
        self.n = np.shape(data)[0] #用户对商品的评分矩阵中,商品个数
        self.m = np.shape(data)[1] #用户对商品的评分矩阵中,用户个数
        
    def _svd(self):
        '''
        用户数据矩阵的svd奇异值分解
        '''
        self.U, self.S, self.VT = np.linalg.svd(self.data)
        return self.U, self.S, self.VT
        
    def _calc_k(self, percentge):
        '''确定k值:前k个奇异值的平方和占比 >=percentage, 求满足此条件的最小k值
        :param percentage, 奇异值平方和的占比的阈值
        :return 满足阈值percentage的最小k值
        '''
        self.k = 0
        #用户数据矩阵的奇异值序列的平方和
        total = sum(np.square(self.S))
        svss = 0 #奇异值平方和 singular values square sum
        for i in range(np.shape(self.S)[0]):
            svss += np.square(self.S[i])
            if (svss/total) >= percentge:
                self.k = i+1
                break
        return self.k

    def _buildSD(self, k):
        '''构建由奇异值组成的对角矩阵
        :param k,根据奇异值开放和的占比阈值计算出来的k值
        :return 由k个前奇异值组成的对角矩阵
        '''
        #方法1:用数组乘方法
        self.SD = np.eye(self.k) * self.S[:self.k]

        #方法2:用自定义方法
        e = np.eye(self.k)
        for i in range(self.k):
            e[i,i] = self.S[i]

        return self.SD
        
    def _dimReduce(self, percentage):
        '''
        SVD降维
        :param percentage, 奇异值开方和的占比阈值
        :return 降维后的用户数据矩阵
        '''
        #Step1:svd奇异值分解
        self._svd()
        #Step2:计算k值
        self._calc_k(percentage)
        print('\n按照奇异值开方和占比阈值percentage=%d, 求得降维的k=%d'%(percentage, self.k))
        #Step3:构建由奇异值组成的对角矩阵singular values diag
### 基于SVD算法的电影推荐系统机器学习实训设计及核心代码 #### 1. 数据准备 在构建基于SVD的电影推荐系统时,数据准备是关键步骤。通常使用公开数据集(如MovieLens)来获取用户对电影的评分数据。这些数据以矩阵形式存储,其中行表示用户,列表示电影,矩阵元素表示用户对电影的评分[^2]。 ```python import pandas as pd # 加载数据 data = pd.read_csv('ratings.csv') # 假设数据文件名为 ratings.csv ``` #### 2. 数据预处理 数据预处理阶段需要处理缺失值、标准化评分范围以及将数据划分为训练集和测试集。通过这种方式可以确保模型在未知数据上的泛化能力[^3]。 ```python from sklearn.model_selection import train_test_split # 划分训练集和测试集 train_data, test_data = train_test_split(data, test_size=0.2, random_state=42) ``` #### 3. 构建用户-物品评分矩阵 为了应用SVD算法,首先需要将原始评分数据转换为用户-物品评分矩阵。该矩阵中的每个元素表示用户对特定物品的评分,如果用户未对某物品进行评分,则对应位置的值为零[^1]。 ```python # 创建用户-物品评分矩阵 user_item_matrix = train_data.pivot(index='userId', columns='movieId', values='rating').fillna(0) ``` #### 4. 应用SVD分解 利用SVD技术对用户-物品评分矩阵进行分解,提取出潜在特征向量。这些向量可以用于预测用户对未评分物品的兴趣程度。 ```python from scipy.sparse.linalg import svds # SVD分解 U, sigma, Vt = svds(user_item_matrix, k=50) # k表示隐含因子的数量 sigma = np.diag(sigma) # 重建评分矩阵 predicted_ratings = np.dot(np.dot(U, sigma), Vt) ``` #### 5. 模型评估 评估模型性能可以通过计算预测评分与实际评分之间的误差来实现。常用的评估指标包括均方根误差(RMSE)和平均绝对误差(MAE)[^4]。 ```python from sklearn.metrics import mean_squared_error # 计算RMSE def calculate_rmse(true_ratings, predicted_ratings): true_ratings = true_ratings[test_data.set_index(['userId', 'movieId']).index] predicted_ratings = pd.DataFrame(predicted_ratings, index=user_item_matrix.index, columns=user_item_matrix.columns) predicted_ratings = predicted_ratings.stack().reindex(test_data.set_index(['userId', 'movieId']).index).values return np.sqrt(mean_squared_error(true_ratings, predicted_ratings)) rmse = calculate_rmse(test_data['rating'], predicted_ratings) print(f'RMSE: {rmse}') ``` #### 6. 推荐生成 基于预测评分,可以为每个用户生成推荐列表。这通常涉及选择用户尚未评分但预测评分较高的物品[^4]。 ```python def recommend_movies(user_id, user_item_matrix, predicted_ratings, top_n=10): user_unrated_movies = user_item_matrix.loc[user_id][user_item_matrix.loc[user_id] == 0].index predicted_ratings_for_user = pd.Series(predicted_ratings[user_id - 1], index=user_item_matrix.columns) recommendations = predicted_ratings_for_user.loc[user_unrated_movies].sort_values(ascending=False).head(top_n) return recommendations recommendations = recommend_movies(1, user_item_matrix, predicted_ratings) print(recommendations) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值