任务8 使用Word2Vec进行推荐

2023-11-09

任务8 使用Word2Vec进行推荐

1. 原理

我们有了用户的embedding很容易就可以利用这些embedding来计算用户的相似度. 有了用户的相似度, 我们接下来就可以使用前面任务4的一些函数来直接进行推荐

2. 代码实现

导入相关的包, 有些包是自己手动实现的, 详情见之前的博客

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch

import Metirc
from utils import loadData, rating2matrix, Split_Dataset_P
import Similarity

from gensim.models import Word2Vec

读取数据集

ratings = loadData('./data/', 'ml-100k')

划分数据集

train_data, test_data = Split_Dataset_P(ratings)

下面实际上只是把任务7的过程在做了一遍

def rating_splitter(df):
    df['liked'] = np.where(df['rating'] >= 4, 1, 0)
    df['movieid'] = df['movieid'].astype('str')
    gp_movie_like = df.groupby(['liked', 'movieid'])
    return ([gp_movie_like.get_group(gp)['userid'].tolist() for gp in gp_movie_like.groups])
    
splitted_users = rating_splitter(train_data)

import random

for user_list in splitted_users:
    random.shuffle(user_list)
    
model = Word2Vec(sentences=splitted_users
                , epochs=20
                , min_count=1
                , vector_size=100
                , workers=4
                , sg=1
                , hs=0
                , negative=5
                , window=1000)
    
model.wv.save_word2vec_format('train_uservector.txt')
user_vector = pd.read_csv('train_uservector.txt', sep=' ', header=None)
user_vector.rename(columns={0:'userid'}, inplace=True)
user_vector = user_vector.sort_values(by='userid').reset_index(drop=True)
uservec = torch.tensor(user_vector.loc[:, 1:].to_numpy())

下面我们计算用户与用户之间的相似度(函数之前任务4的时候就写过了, 直接拿来用)

simi = Similarity.SimCos(uservec)

取出最相似的前80个用户

sim_user_value, sim_user_index = torch.topk(simi, k=80, dim=1)

下面进行推荐, 步骤和任务4类似

def normalize_e(t):
    """对一个矩阵,按照列进行归一化
    即 行向量的元素/行向量的总和

    Args:
        t (tensor(2d)): 需要进行归一化的矩阵

    Returns:
        tensor: 和输入矩阵形状一样的一个经过归一化之后的矩阵
    """
    return t / t.sum(dim=1).unsqueeze(dim=1)


def predict_score(scores, index, similarity):
    """预测用户的打分

    Args:
        scores (tensor): 完整的打分矩阵
        index (tensor): 相似的前k个用户的索引
        similarity (tensor): 相似程度
        通常index和similary是通过torch.topk得到的
    Returns:
        tensor: 每一行就是一个用户,每个行向量就是预测的用户对物品的打分
    """
    r1 = []
    similarity = normalize_e(similarity)
    for i,j in zip(index, similarity):
        # print(i)
        # print(j)
        selected_score = torch.index_select(input=scores, index=i, dim=0)
        print(selected_score)
        print(j)
        final_score = torch.mm(j.unsqueeze(dim=0), selected_score)
        # print(final_score)
        r1.append(final_score)
    r1 = torch.cat(r1,dim=0)
    return r1


def recommend(score, k = 3):
    """通过预测的物品打分,给用户推荐前k个物品

    Args:
        score (tensor): 这个是预测的打分
        k (int, optional): 推荐前k个物品. Defaults to 3.

    Returns:
        pred, index: pred是推荐的物品对应的打分,index是推荐的物品的索引
    """
    pred, index = torch.topk(input=score, k=k, dim=1)
    return pred, index
    

对数据进行一下处理, 我们之前生成"句子"的时候不小心把train_data的userid变成了str类型的, 现在要转换回来, 之后还要把数据转换成tensor格式的

train_data['movieid'] = train_data['movieid'].astype('int')
train_data = rating2matrix(train_data)
train_data = torch.tensor(train_data)
train_data = train_data.double()

基于之前计算得到的相似度, 来预测一下打分

pred_score = predict_score(train_data, index=sim_user_index, similarity=sim_user_value)
pred_score

tensor([[2.9639, 1.3864, 0.5703, …, 0.0000, 0.0358, 0.0407],
[1.1632, 0.1052, 0.0219, …, 0.0000, 0.0000, 0.0000],
[0.0253, 0.0760, 0.0000, …, 0.0000, 0.0000, 0.0000],
…,
[2.7019, 0.4559, 0.5954, …, 0.0000, 0.0000, 0.0000],
[1.7096, 0.6178, 0.0954, …, 0.0000, 0.0000, 0.0000],
[3.0461, 1.3083, 0.5879, …, 0.0000, 0.0000, 0.0382]],
dtype=torch.float64)

基于预测的打分, 给出打分最高的10个物品

rec_value, rec_index = recommend(pred_score, k=10)

rec_index就是推荐的10个物品的id, rec_value就是对应的预测打分

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

任务8 使用Word2Vec进行推荐 的相关文章

  • arcgis创建公里格网并计算格网内点的平均值最后形成马赛克式栅格图

    生成公里格网 在搜索框搜索create fishnet 点击create fishnet output feature class 输出格网的位置和名字 template extent 公里格网的范围 和什么层相同 cell size wi
  • 电脑壁纸链接

    电脑壁纸链接 一 壁纸网站 1 彼岸图网 2 H128壁纸 3 Wallhaven 4 Wallhere 二 游戏壁纸 英雄联盟 神泣 鬼泣 女神联盟2 崩坏3 三国杀 QQ飞车 QQ炫舞 阴阳师 幻塔 王者荣耀 逆战 上古王冠 永恒魔法
  • 代码评审工具Phabricator安装和部署

    1 安装 1 1 安装要求 Phabricator是一个LAMP应用套件 因此最基本的要求就是LAMP环境 Linux Linux的不同发行版及变种是必需的 MacOS X是一个可接受的Linux变种 Windows不是 Phabricat
  • WSL 2是什么

    Windows Subsystem for Linux WSL 适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能 相比前一代的WSL WSL 2提供更全的兼容性
  • VTK环境安装教程

    安装前依赖环境 CMake VS2019 VTK压缩包 8 2 0即可 build过程 第一次分析完 找到下图中选中项 勾选Configure 解释勾选项 BUILD EXAMPLES 生成一些vtk官方的examples 帮助理解学习 当
  • 大学生竞赛项目

    编程 蓝桥杯 报名时间 10月 报名网址 https dasai lanqiao cn 中国软件杯大学生软件设计大赛 报名时间 5月 报名网址 http www cnsoftbei com 中国高校计算机大赛 报名时间 11月 报名网址 h
  • Inno打包后开始运行前检查文件是否存在

    Code function FileDoesNotExist file string Boolean begin if FileExists file then begin Result False end else begin Resul
  • 不能安装64位office提示已安装32位的

    问题描述 安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装 但实际上之前安装的32位的office办公软件已经卸载了 问题现象截图如下 解决办法 从问题描述中 我们其实已经能够看出问题原因了 类似
  • 查看apk签名,查看key签名,adb常用命令

    在使用第三方sdk时经常要求绑定签名 这里提供两种查看签名的方式 如果只是想查看一下手机上应用的签名 那么可以安装一个app直接输入包名即可查看该应用的签名 提供一个微信的签名查看apk 下载连接http download csdn net
  • GitHub Actions自动化部署+定时百度链接推送

    前言 最近用VuePress搭建了一个静态网站 由于是纯静态的东西 每次修改完文章都要重新打包上传很是麻烦 虽然vuepress theme vdoing主题作者提供了GitHub Actions自动化部署的教程文章 但是过于简陋且是19年
  • C# Socket连接请求超时处理

    在Socket的超时时间默认20多秒 而实际连上不需1秒时间 20多秒很多时候用户是不能接受的 而在等待返回结果的这段时间里程序会处于停止响应状态 废话不多说了 先上代码 private delegate string ConnectSoc
  • DHCP的配置(以华为eNSP为例)

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 基础知识介绍 络组建步骤 1 拓扑设计 2 IP地址规划 按照拓扑中划分的 络范围 规划 络位不同的IP地址 3 配置 1 配置各个节点的IP地址 2 路由 全
  • 【软件测试】用例篇

    一 什么是测试用例 测试用例 向被测试系统发起的一组集合 这组集合包含测试数据 测试步骤 测试平台 预期结果 二 为什么在测试前要设计测试用例 三 基于需求设计测试用例 3 1测试是我们测试人员进行测试的依据 3 2测试人员首先要分析需求
  • 【电机学】直流电机

    直流电机 什么是直流电机 直流电机的工作原理 直流发电机的工作原理 直流电动机的工作原理 可逆性原理 直流电机的主要结构部件 直流电机的电枢绕组 基本特点 并联支路对数 电刷的放置 一些概念 直流电机的磁场 直流电机的空载磁场 电枢电流Ia
  • 销售人员一定要知道的6种获取电话号码的方法

    对于销售来说 电话销售是必须要知道的销售方法 也是销售生涯中的必经之路 最开始我们并不清楚这么电话是从哪里来的 也不清楚是通过哪些方法渠道获取 那么今天就来分享给各位销售人员获取客户电话号码的方法 1 打印自己的名片 在工作当中少不了接触其
  • CleanMyMac X2024值不值得下载?

    macOS已经成为最受欢迎的桌面操作系统之一 它提供了直观 简洁的用户界面 使用户可以轻松使用和管理系统 macOS拥有丰富的应用程序生态系统 还可以与其他苹果产品和服务紧密协作 如iPhone iPad 用户可以通过iCloud同步和共享
  • fl studio2024水果21.3免费汉化版

    fl studio2024全称Fruity Loops Studio2024 这款软件也被人们亲切的称之为水果 它是一款功能强大的音乐创作编辑软件 拥有全功能的录音室 大混音盘以及先进的音乐制作工具 用户通过使用该软件 就可以轻松制作出自己
  • fl studio20中文内测版下载2024最新完美实现汉化

    fl studio20是一款众所周知的水果编曲软件 能够剪辑 混音 录音 它的矢量界面能更好用在4K 5K甚至8K显示器上 还可以可以编曲 剪辑 录音 混音 让你的计算机成为全功能录音室 不论是在功能上面还是用户界面上都是数一数二的 但该软
  • 最具挑战的骑行路线

    1 318川藏线 2 独库公路 561公里 3 珠峰尼泊尔 1000公里 4 沙漠公路 1800公里 5 219新藏线 2500公里 下面是一些别人的骑行记录 证书或奖牌 参考 1 抖音 Max骑行玩家 https v douyin com
  • FAM amine, 6-isomer,1313393-44-0,含有纯6-异构体的荧光团,6-FAM NH2

    产品名称 FAM amine 6 isomer 6 FAM NH2 中文名称 6 羧基荧光素 氨基 CAS 1313393 44 0 分子式 C27H26N2O6 分子量 474 51 纯度 95 结构式 产品描述 荧光素衍生物具有胺基 含

随机推荐

  • docker 修改镜像和容器的存放路径

    docker info 查看docker的存储等相关信息 将路径修改至挂载磁盘中 前提 磁盘已挂载成功 方法一 1 停止docker 服务 service docker stop 2 备份数据到新的存放路径 cp r var lib doc
  • C++算法之深度优先搜索算法详解

    1 深度优先搜索算法 深度优先搜索是一种在开发爬虫早期使用较多的方法 它的目的是要达到被搜索结构的叶结点 即那些不包含任何超链的HTML文件 在一个HTML文件中 当一个超链被选择后 被链接的HTML文件将执行深度优先搜索 即在搜索其余的超
  • 1、hilens虚拟docker中-ros程序编译说明

    该文档主要用于在ubuntu机子上面编译ros库 当编译成功后 将整个文件夹的库拷贝至HiLens Kit 上面进行运行 这里注意 不能使用windows10的WSL 进行操作 在执行如下指令前 请确保ubuntu上面的docker能够正常
  • 深度全解卷积神经网络(附论文)

    第一章 引言 一 本文动机 过去几年 计算机视觉研究主要集中在卷积神经网络上 通常简称为 ConvNet 或 CNN 在大量诸如分类和回归任务上已经实现了目前为止最佳的表现 尽管这些方法的历史可以追溯到多年前 但相对而言 对这些方法的理论理
  • 二进制中1的个数

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1231 题目描述 输入一个整数 输出该数二进制表示中1的个数 其中负数用补码表示 时间限制 1秒 空间限制 32768K 直接上代码吧 in
  • 使用ab对tornado进行压力测试

    ab使用命令 ab c 20 n 1000 http localhost 8000 c 并发数 n 请求总数 测试环境 1G内存 单CPU单核 虚拟机ubuntu 测试结果 Server Software TornadoServer 5 0
  • 单变量线性回归(Linear Regression with One Variable)

    声明 本文来源于该部分为斯坦福大学 2014 机器学习教程整理对应的笔记 1 1 模型表示 我们的第一个学习算法是线性回归算法 在这段视频中 你会看到这个算法的概况 更 重要的是你将会了解监督学习过程完整的流程 让我们通过一个例子来开始 这
  • 电商峰值系统架构设计

    1 1 系统架构设计目录 摘要 双11来临之际 程序员 以 电商峰值系统架构设计 为主题 力邀京东 当当 小米 1号店 海尔商城 唯品会 蘑菇街 麦包包等电商企业 及商派 基调网络等服务公司 分享电商峰值系统架构设计的最佳技术实践 自200
  • vscode远程控制Ubuntu(remote -ssh)

    我以往做嵌入式 一般都要在Ubuntu下进行开发 进行文件传输的时候 又要回到windows下进行操作 来回操作两台电脑 设备 实在有些麻烦 不过VScode下有个插件remote ssh 可以远程访问其他带ssh的设备 下面对该插件的安装
  • [进阶]Java:static:应用知识-代码块

    代码块概述 代码块是类的5大成分之一 成员变量 构造器 方法 代码块 内部类 定义在类中方法外 在Java类中 使用 括起来的代码被成为代码块 代码块分为 1 静态代码块 格式 static 特点 需要通过static关键字修饰 随着类的加
  • delete与注入逻辑

    即使百般不顺仍期望万事顺意 Mysql注入 Delete基本使用 DELETE关联删除 注入删除 Delete基本使用 1 删除指定的用户 DELETE FROM users where uname hxt 2 删除所有记录 DELETE
  • spring boot中yml配置文件里横线的意思

    想要在yml配置文件中增加集合类型属性的话 需要用横线 进行分割 例如
  • 云安全技术——搭建VPN

    目录 二 VPN简介 三 规划实训环境和网络拓扑 配置VPN服务器 五 VPN网络客户端的配置 六 远程访问VPN的检测 二 VPN简介 VPN Virtual Private Network 是一种可以在公共网络上建立安全连接的技术 VP
  • cv2.threshold() 阈值:使用Python,OpenCV进行简单的图像分割

    图像分割有多种形式 聚类 压缩 边缘检测 区域增长 图分区 分水岭等等 Clustering Compression Edge detection Region growing Graph partitioning Watershed Th
  • table2excel 导出真分页数据如何处理1

    table2excel 导出真分页数据如何处理 首先导入js div class ui edit buttons div
  • python中的一些小trick

    1 set用处 个人之前一直没怎么用过set 直到今天我在写一段代码的时候发现in关键字和set对象简直天生一对 a list if b in a 上面这段代码相信大家都写过 但如果将list对象转换成为set 那么代码速度将大大提升 本质
  • Qt控件----显示窗口部件

    文章目录 显示窗口部件 一 QLabel 1 控件简介 2 用法示例 3 运行效果 二 QCalendarWidget 1 控件简介 2 用法示例 3 运行效果 三 QLCDNumber 1 控件简介 2 用法示例 3 运行效果 四 QPr
  • SQL Part 2 ---常用关键字

    SQL 关键字 常用关键字 Keywords ORDER BY DESC AS Like 星号符 DISTINCT Union INTERSECT EXCEPT 嵌套查询 Nested Query IN NOT IN 在WHERE中使用 I
  • sh ndk-build.cmd command not found

    sh中写ndk build 会报错 ndk build cmd command not found 或者报错 ndk build 未找到命令 解决方法 写ndk build的完整路径 比如 home jason android ndk r1
  • 任务8 使用Word2Vec进行推荐

    任务8 使用Word2Vec进行推荐 1 原理 我们有了用户的embedding很容易就可以利用这些embedding来计算用户的相似度 有了用户的相似度 我们接下来就可以使用前面任务4的一些函数来直接进行推荐 2 代码实现 导入相关的包