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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
特征值分解(EVD)和奇异值分解(SVD)是矩阵操作的两个强大工具,在数据降维中尤其重要。为了深入理解这两个技术在机器学习中的应用,我们可以参考《数据应用:矩阵力量——从基础到机器学习实战》中的实例和方法。 参考资源链接:[数据应用:矩阵力量——从基础到机器学习实战](https://wenku.youkuaiyun.com/doc/56p854se1t?spm=1055.2569.3001.10343) 特征值分解主要用于对称矩阵,其步骤大致如下: 1. 标准化数据:首先,需要将数据集进行标准化处理,确保每列数据的均值为0,标准差为1。 2. 计算协方差矩阵:通过标准化后的数据集计算协方差矩阵,这是特征值分解的关键步骤。 3. 计算特征值和特征向量:对协方差矩阵应用特征值分解,得到特征值和对应的特征向量。 4. 选择主成分:根据特征值的大小排序,选择前k个最大的特征值对应的特征向量作为主成分。 5. 转换数据:使用所选特征向量将原始数据转换到新的特征空间。 奇异值分解不仅适用于对称矩阵,还能处理非对称矩阵,并广泛应用于图像压缩、推荐系统等场景。具体步骤包括: 1. 数据矩阵A准备:将需要降维的数据集表示为矩阵A。 2. SVD分解:将矩阵A分解为UΣV^T的乘积形式,其中U和V是正交矩阵,Σ是包含奇异值的对角矩阵。 3. 选择奇异值:对Σ中的奇异值从大到小排序,并根据需要降维的目标选择前k个最大的奇异值。 4. 重构数据:利用选定的奇异值和对应的左、右奇异向量重新构建矩阵,得到降维后的数据。 在《数据应用:矩阵力量——从基础到机器学习实战》一书中,作者通过实例演示了如何应用这些方法。例如,通过使用`numpy`的`linalg.eig`函数进行特征值分解,或利用`numpy`的`linalg.svd`函数进行奇异值分解。此外,`sklearn.decomposition.PCA`模块可以简化PCA主成分分析的步骤,直接实现数据降维。 例如,使用`numpy`进行特征值分解的代码示例如下: ```python import numpy as np # 假设data_matrix是一个已经标准化的数据矩阵 cov_matrix = np.cov(data_matrix.T) eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 按特征值大小排序,并选择前k个特征向量 sorted_index = np.argsort(eigenvalues)[::-1] top_k_eigenvectors = eigenvectors[:, sorted_index[:k]] # 将数据投影到新的特征空间 data_reduced = np.dot(data_matrix, top_k_eigenvectors) ``` 进行奇异值分解的代码示例如下: ```python U, Sigma, Vt = np.linalg.svd(data_matrix, full_matrices=False) # 选择前k个奇异值对应的向量 Sigma = np.diag(Sigma) top_k_u = U[:, :k] top_k_vt = Vt[:k, :] # 重构数据 data_reduced = np.dot(top_k_u, np.dot(Sigma, top_k_vt)) ``` 在完成这些步骤后,数据将会降维到用户指定的维度。通过这种方式,我们可以处理大规模数据集,同时保留数据最重要的特征,这对于后续的机器学习模型训练具有重要的意义。 如果您希望进一步提升在数据降维和机器学习模型构建方面的技能,建议您参考《数据应用:矩阵力量——从基础到机器学习实战》一书中的其他章节内容,并结合作者提供的在线资源进行实践。这将帮助您更好地理解和掌握矩阵运算在实际机器学习问题中的应用。 参考资源链接:[数据应用:矩阵力量——从基础到机器学习实战](https://wenku.youkuaiyun.com/doc/56p854se1t?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值