赞
踩
CB和CF的区别:
·基于内容(Content based,CB)主要利用的是用户评价过的物品的内容特征,而CF方法还可以利用其他用户评分过的物品内容,CF可以解决CB的一些局限:
-物品内容不完全或者难以获得时,依然可以通过其他用户的反馈给出推荐
-CF基于用户之间对物品的评价质量,避免了CB仅依赖内容可能造成的对物品质量判断的干扰
-CF推荐不受内容限制,只要其他类似用户给出了对不同物品的兴趣,CF就可以给用户推荐出内容差异很大的物品(但有某种内在联系)
(1)不单单基于用户和物品,而是都有关联。
(2)分类:
- 基于近邻的协同过滤:基于用户(User-CF)、基于物品(Item-CF)。根据的是相同“口碑”准则
- 基于模型的协同过滤:奇异值分解(SVD)、潜在语义分析(LSA)、支撑向量机(SVM)
User-CF和ltem-CF的比较
(3)基于用户的协同过滤
(4)基于物品的协同过滤
(5)基于模型的协同过滤
基本思想
基于模型的协同过滤推荐,就是基于样本的用户偏好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测新物品的得分,计算推荐
基于近邻的推荐和基于模型的推荐
训练模型时,可以基于标签内容来提取物品特征,也可以让模型去发掘物品的潜在特征;这样的模型被称为隐语义模型(Latent Factor Mogel,LFM)
(6)隐语义模型(LFM)
用隐语义模型来进行协同过滤的目标
通过矩阵分解进行降维分析
隐语义模型的实例
(7)基于协同过滤的推荐优缺点
实际网站的推荐系统往往都不是单纯只采用了某一种推荐的机制和策略,往往是将多个方法混合在一起,从而达到更好的推荐效果。比较流行的组合方法有:
评测指标:
预测准确度、用户满意度、覆盖率(不仅仅推热门的,也要推小众产品)、多样性、惊喜度、信任度、实时性、健壮性、商业目标(点击率等)
评测方法:
推荐准确度评测:
要推荐物品或内容的元数据,例如关键字,分类标签,基因描述等;
系统用户的基本信息,例如性别,年龄,兴趣标签等;
用户的行为数据,可以转化为对物品或者信息的偏好,根据应用本身的不同,可能包括用户对物品的评分,用户查看物品的记录,用户的购买记录等。这些用户的偏好信息可以分为两类:
将原始连续值切断,转化为离散值。
让座问题:假设我们要训练一个模型判断在公交车上应不应该给一个人让座,按照常理,应该是给年龄很大和年龄很小的人让座。
对于以上让座问题中的年龄特征,对于一些模型,假设模型为y = 0x,输入的x(年龄)对于最后的贡献是正/负相关的,即×越大越应该让座,但很明显让座问题中,年龄和是否让座不是严格的正相关或者负相关,这样只能兼顾年龄大的人,无法兼顾年龄大的人和年龄小的人。
离散化的两种方式
两种方法对比
-类别型
-时间型
-统计型
其中,n(u,b)(u,b是n的小脚标)是用户u打过标签b的次数,n是物品|被打过标签b的次数。
词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于资讯检索与文本挖掘的常用加权技术
TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降
TF-IDF=TF*IDF
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率T高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
.TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级
词频(Term Frequency,TF)
指的是某一个给定的词语在该文件中出现的频率。这个数字是对词 数的归一化,以防止偏向更长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)
其中Tf,表示词语1在文档j中出现的频率,ny表示i在j中出现的次数,n.y表示文档j的总词数·逆向文件频率(lnverse Document Frequency,IDF)
-是一个词语普遍重要性的度量,某一特定词语的 IDF,可以由总文档数目除以包含该词语之文档的数目,再将得到的商取对数得到
其中 IDF,表示词语「在文档集中的逆文档频率;N 表示文档集中的文档总数,N表示文档集中包含了词语i的文档数。
0.引入依赖
import numpy as np
import pandas as pd
1.定义数据和预处理
docA="The cat sat on my bed"//定义了一个字符串,相当于定义了一个文档
docB="The dog sat on my knees"
//关键词是cat和dog,坐在哪?(bed、knees)
#做分词,提取关键字
bowA=docA.split(" ")
bowB=docB.split(" ")
bowA
//得['The','cat','sat','on','my','bed']
#构建词库
wordSet=set(bowA).union(set(bowB))
wordSet
//得['The','bed','cat','dog','knees','my','on','sat']列表中元素默认升序排列
2.进行词数统计
#用统计字典来保存词出现的次数
wordDictA=dict.fromkeys(wordSet,0)
wordDictB=dict.fromkeys(wordSet,0)
wordDictA
//得{'cat':0,'on':0,'sat':0,'knees':0,'bed':0,'The':0,'my':0,'dog':0}
#遍历文档,统计词数
for word in bowA:
wordDictA[word]+=1
for word in bowB:
wordDictB[word]+=1
wordDictA
//得{'cat':1,'on':1,'sat':1,'knees':0,'bed':1,'The':1,'my':1,'dog':0}
pd.DataFrame([wordDictA,wordDictB])
//如下图
3.计算词频TF
def computeTF(wordDict,bow):
//用一个字典对象记录tf,把所有的词对应在bow文档里得tf都算出来
tfDict={}
nbowCount=len(bow)
for word,count in wordCount.items():
tfDict[word]=count/nbowCount
return tfDict
tfA=computeTF(wordDictA,bowA)
tfB=computeTF(wordDictB,bowB)
tfA
//得{'cat':0.166666666666,'on':0.166666666666,'sat':0.166666666666,'knees':0.0,'bed':0.166666666666,'The':0.166666666666,'my':0.166666666666,'dog':0.0}
4.计算逆文档频率idf
def computeIDF(wordDictList): //用一个字典对象保存idf结果,每个词作为key,初始值为0 idfDict=dict.fromkeys(wordDictList[0],0) //与是A文档还是B文档无关 N=len(wordDictList) import math for wordDict in wordDictList: //遍历字典中的每个词汇 for word,count in wordDict.items(): if count>0: //先把Ni增加1,存入到idfDict中 idfDict[word]+=1 //已经得到所有词汇i对应的Ni,现在根据公式把它替换为idf值 for word,ni in idfDict.items(): idfDict[word]=math.log10((N+1)/(ni+1)) return idfDict idfs=computeIDF([wordDictA,wordDictB]) idfs //得{'cat':0.17609125905568124,'on':0.0,'sat':0.0,'knees':0.17609125905568124,'bed':0.17609125905568124,'The':0.0,'my':0.0,'dog':0.17609125905568124} //因为on,sat,The,my在所有文档里都出现了,所有是0,所有它们不关键
5.计算TF-IDF
def computeTFIDF(tf,idfs):
tfidf={}
for word,tfval in tf.items():
tfidf[word]=tfval*idfs[word]
return tfidf
tdidfA=computeTFIDF(tfA,idfs)
tdidfB=computeTFIDF(tfB,idfs)
pd.DataFrame([tdidfA,tfidfB])
//得,见下图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。