如何生成标签?

一般有

  • PGC(专家生成)
  • UGC(用户生成)

但是,面对海量的数据需要打标签时,人工打标签太过昂贵和耗时,一个可行方法是对数据使用聚类,然后将聚类结果作为标签使用。

下面给一个聚类的简单例子(数据集footballTeams已经上传,各位免费下载)。

# 第三方库
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
import seaborn as sns
import matplotlib.pyplot as plt
# KMeans
# 导入数据
data = pd.read_csv(r'D:\myfile\开课吧\推荐系统\第二节\footballTeams.txt', sep='\t')
data.head()

# 数据清洗
data.drop(['Unnamed: 0', 'Unnamed: 5'], axis=1, inplace=True)
data.set_index('国家', inplace=True)
# 由于聚类需要计算距离,所以必须提前把数据规范化
data = pd.DataFrame(MinMaxScaler().fit_transform(data.values), columns=data.columns, index=data.index)
data.head()
# 观察一下数据情况
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
sns.pairplot(data)
plt.show()
# 用kmeans聚类
kmeans = KMeans(n_clusters=3).fit(data.values)
data['cluster'] = kmeans.labels_
data.head()

如何使用标签?

用户 user 对商品 item 打标签 tag,这样,我们的一条数据是(user,item,tag)(user, item, tag)(user,item,tag)。

如何根据这些标签数据,给用户推荐商品?一个自然的想法是,用户u给商品i打分,从没有购买过的商品中,选择分值最高的商品作为推荐。

根据打分函数的不同,我们可以分为SimpleTagBased算法、NormTagBased算法和TFIDF-TagBased算法

1. SimpleTagBased算法

记打分函数为p(u,i)=∑tuser_tags[u,t]⋅tag_items[t,i]p(u, i)=\sum_tuser\_tags[u, t]\cdot tag\_items[t, i]p(u,i)=t∑​user_tags[u,t]⋅tag_items[t,i]

其中,user_tags[u,t]user\_tags[u, t]user_tags[u,t]表示用户u打过标签t的次数,tag_items[t,i]tag\_items[t, i]tag_items[t,i]表示标签t下物品i的次数。

2. NormTagBased算法

上面的打分函数对于热门物品打分会很高,而对于长尾物品,则可能忽略,因此,我么可以考虑将其正则化,即NormTagBased算法,
p(u,i)=∑tuser_tags[u,t]∑tuser_tags[u,t]⋅tag_items[t,i]∑itag_items[t,i]p(u, i)=\sum_t\frac{user\_tags[u, t]}{\sum_tuser\_tags[u, t]}\cdot \frac{tag\_items[t, i]}{\sum_itag\_items[t, i]}p(u,i)=t∑​∑t​user_tags[u,t]user_tags[u,t]​⋅∑i​tag_items[t,i]tag_items[t,i]​

3. TfIdf-TagBased算法

上面的两种算法里面,对于热门标签下的热门物品,依旧会给较大的打分,为了改善这种情况,我们需要找到 独属于用户user的标签,这意味着

  • 用户user使用这个标签很多次
  • 这个标签总体上使用较少,也就是说,其他人使用这个标签较少

因此,我们将原来的 user_tags[u,t]user\_tags[u, t]user_tags[u,t] 改成 user_tags[u,t]log(1+∑utag_users[t,u])\frac{user\_tags[u, t]}{log(1+\sum_utag\_users[t, u])}log(1+∑u​tag_users[t,u])user_tags[u,t]​,其中,tag_users[t,u]tag\_users[t, u]tag_users[t,u]表示使用标签t被用户u使用的次数。

4. 简单实战

下面,我们通过movielens的tags.csv,使用TfIdf-TagBased算法,做出topN推荐。

movielens数据集已经上传,各位免费下载。

大致思路是这样的,

  • 导入数据
  • 由于tag是字符串,所以提前用labelencoder编码
  • 创建四个辅助数据结构
  • 定义打分函数
  • 对用户没有购买过的产品进行打分,返回前n个
# 第三方库
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 导入数据
data = pd.read_csv(r'D:\myfile\开课吧\推荐系统\第二节\movielens\tags.csv')
data.head()

# 数据预处理
# 去掉无用的timestamp列
data.drop('timestamp', axis=1, inplace=True)
# 数据预处理
# 去掉无用的timestamp列
data.drop('timestamp', axis=1, inplace=True)
# 数据预处理
# 对tag做LabelEncoder
le = LabelEncoder()
data['tag'] = le.fit_transform(data['tag'].values.tolist())
# 创建四个字典
# user_tags: 用户u用过的标签t的次数
# user_items: 用户u购买过的商品i的次数
# tag_users: 标签t下用户u的次数
# tag_items: 标签t下物品i的次数
user_tags, user_items, tag_users, tag_items = {}, {}, {}, {}# 遍历数据集,生成列表
for user, item, tag in data.values:user_tags.setdefault(user, {})user_items.setdefault(user, {})tag_users.setdefault(tag, {})tag_items.setdefault(tag, {})user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1user_items[user].setdefault(item, 0)user_items[user][item] += 1tag_users[tag].setdefault(user, 0)tag_users[tag][user] += 1tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1
# 用tag_sums记录每个标签总共被人用过多少次
tag_sums = {}
for tag in tag_users.keys():tag_sums[tag] = 0for user in tag_users[tag].keys():tag_sums[tag] += tag_users[tag][user]# 给出打分函数,计算公式为tfidf-tagBased算法
def p_ui(u, i):score = 0for tag in user_tags[u].keys():temp1 = user_tags[u][tag] / np.log(1 + tag_sums[tag])if i in tag_items[tag].keys():score += temp1 * tag_items[tag][i]return score
# 物品集合
total_items = data['movieId'].unique()# 定义topN函数
def topN(u, N=4):# 用过的物品used_items = list(user_items[u].keys())# 商品-分数字典scores = {}# 遍历物品集合,给每个没有购买过的物品打分for item in total_items:if item not in used_items:scores[item] = p_ui(u, item)# 对分数字典进行排序并返回return sorted(scores.items(), key=lambda x: x[1], reverse=True)[:N]
# 测试
# 给第一个用户id推荐4个电影id
topN(18)
# 推荐结果
# 电影id,得分score
[(7451, 0.8340647828484926),(58105, 0.8340647828484926),(1648, 0.4170323914242463),(6593, 0.4170323914242463)]

《推荐系统笔记(十二)》聚类生成标签以及基于标签的TopN推荐相关推荐

  1. python图像处理笔记-十二-图像聚类

    python图像处理笔记-十二-图像聚类 学习内容 这一章主要在学习的是聚类算法以及其在图像算法中的应用,主要学习的聚类方法有: KMeans 层次聚类 谱聚类 并将使用他们对字母数据及进行聚类处理, ...

  2. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  3. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  4. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:// ...

  5. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  6. 谷粒商城--秒杀服务--高级篇笔记十二

    谷粒商城–秒杀服务–高级篇笔记十二 1.后台添加秒杀商品 未配置秒杀服务相关网关 1.1 配置网关 - id: coupon_routeuri: lb://gulimall-couponpredica ...

  7. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  8. 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理

    相信大家都熟悉<仙剑奇侠传98柔情版>的人机交互方式,用的仅仅是键盘.在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫<仙剑奇侠传>的游戏,却能承载一代人对梦想的追逐. ...

  9. 推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)

    推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR ...

  10. 强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C(下)

    强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C 本篇实现一个基于A2C框架的PPO算法,应用于连续动作空间任务. import torch import torch.nn a ...

最新文章

  1. SecureCRT配置前--Linux网卡设置
  2. HiveServer2中使用jdbc客户端用户运行mapreduce
  3. 无序数组求第K大/第K小的数
  4. shell脚本文件中ll提示找不到命令
  5. 一米机器人解绑再绑定_安顿问答027:安顿APP里的角色绑定错了,可以更改吗?...
  6. Hadoop伪分布式集群环境搭建
  7. Proteus总线连接心得
  8. 基于CNN-LSTM的手写数字识别与应用实现(附tensorflow代码讲解)
  9. 大数据驱动教育变革,产教融合呈现新高度——数据科学与大数据技术教育分论坛顺利召开...
  10. 信息系统项目管理师思维导图
  11. 计算机it互联网有什么区别,什么叫“IT”技术
  12. r910服务器增加内存,dellr910服务器硬件手册及安装方法
  13. 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
  14. jsp中的消息框:,警告框、确认框、提示框。
  15. Android开发艺术探索读书笔记(一)
  16. 数字人民币试点范围扩容;美国科技巨头市值蒸发超5万亿美元;蔡崇信再次出售阿里巴巴股票 | 每日大事件...
  17. Vue3 父传子、使用 defineAsyncComponent 异步挂载组件、利用 is 动态引入组件
  18. 214、最全无线网桥知识
  19. 删除已被禁用的启动项
  20. linux unix命令详解,最全面的关于LINUX与UNIX下的dd命令详解

热门文章

  1. android 读取文件内容,Android读写文件 获取文件并读取写入数据
  2. 使用LaTeX绘制列表(有的地方称作Num Item)
  3. [排版题] 例4.1 输出梯形
  4. JSON Schema
  5. 几道比较难的SQL题
  6. [转]跨语言通信方案比较
  7. Java中ArrayList、Integer[]和int[]的相互转换
  8. UML--行为图(状态图、活动图)
  9. Spring Boot加载指定属性文件
  10. Python网络编程之socket