IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 矩阵分解-推荐系统案例代码(短视频推荐) -> 正文阅读

[Python知识库]矩阵分解-推荐系统案例代码(短视频推荐)

使用矩阵分解,根据用户给短视频的评分数据,做-一个千 人千面的个性化推荐系统

  • 需要安装推荐系统库surprise,使用如下命令安装: pip install scikit-surprise
#导入numpy和surprise辅助库
import numpy as np
import surprise
#基于矩阵分解的推荐
class MatrixFactorization(surprise.AlgoBase):
    def __init__(self,learning_rate,n_epochs,n_factors,lmd):
        self.lr = learning_rate     #梯度下降法学习率
        self.n_epochs = n_epochs    #梯度下降法迭代次数
        self.n_factors = n_factors   #分解矩阵的秩(rank)
        self.lmd = lmd #防止过拟合的正则化强度
    def fit(self,trainset):
        #通过梯度下降法训练,得到所有u_i和p_j的值
        print('fitting data with SGD...')
        #随机初始化user和item矩阵(均值,方差,行,列)
        # np.random.normal 随机正态分布
        u = np.random.normal(0,.1,(trainset.n_users,self.n_factors))
        p = np.random.normal(0,.1,(trainset.n_items,self.n_factors))
        
        #梯度下降法
        for _ in range(self.n_epochs):
            for i,j,r_ij in trainset.all_ratings():
                err = r_ij-np.dot(u[i],p[j])
                #利用梯度调整u_i和p_j
                u[i]-= -self.lr*err*p[j]+self.lr*self.lmd*u[i]
                p[j]-= -self.lr*err*u[i]+self.lr*self.lmd*p[j]
                 # 注意: 修正 p_j 时, 按照严格定义, 我们应该使用 u_i 修正之前的值, 但是实际上差别微乎其微
        self.u,self.p = u,p
        self.trainset = trainset
#注意fit和estimate继承于surprise.AlgoBase
    def estimate(self, i, j):
       #'''预测user i对item j的评分。'''
        #如果用户i和物品j是已知的值,返回u_i和p_j的点积
        #否则使用全局平均评分rating值(cold start冷启动问题)
        if self.trainset.knows_user(i) and self.trainset.knows_item(j):
            return np.dot(self.u[i],self.p[j])
        else:
            return self.trainset.global_mean

from surprise import BaselineOnly
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import cross_validate
from surprise.model_selection import train_test_split
import os

# 数据文件
file_path = os.path.expanduser('./data/u.data')

# 数据文件的格式如下:
# 'user item rating timestamp', 使用制表符 '\t' 分割, rating值在1-5之间.
reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))
data = Dataset.load_from_file(file_path, reader=reader)
#将数据随机分为训练集和测试集
trainset,testset=train_test_split(data,test_size=0.2)
#初始化以上定义的矩阵分解类
algo = MatrixFactorization(learning_rate=.005,n_epochs=60,n_factors=2,lmd=0.2)

#训练
algo.fit(trainset)
#预测
predictions = algo.test(testset)
#计算平均绝对误差
accuracy.mae(predictions)

在这里插入图片描述

对比试验

#使用surpise内建的基于最近邻的方法做比较
algo = surprise.KNNBasic()

#训练
algo.fit(trainset)
#预测
predictions = algo.test(testset)
#计算平均绝对误差
accuracy.mae(predictions)

在这里插入图片描述

#使用surpise内建的基于SVD做比较
algo = surprise.SVD()

#训练
algo.fit(trainset)
#预测
predictions = algo.test(testset)
#计算平均绝对误差
accuracy.mae(predictions)

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:19:16  更:2021-09-02 11:21:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 22:57:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计