'''
基于物品的协同推荐 矩阵数据 说明:
1.修正的余弦相似度是一种基于模型的协同过滤算法。我们前面提过,这种算法的优势之
一是扩展性好,对于大数据量而言,运算速度快、占用内存少。 2.用户的评价标准是不同的,比如喜欢一个歌手时有些人会打4分,有些打5分;不喜欢时
有人会打3分,有些则会只给1分。修正的余弦相似度计算时会将用户对物品的评分减去
用户所有评分的均值,从而解决这个问题。
''' import pandas as pd
from io import StringIO #数据类型一:csv矩阵(用户-商品)(适用于小数据量)
csv_txt = '''"user","Blues Traveler","Broken Bells","Deadmau5","Norah Jones","Phoenix","Slightly Stoopid","The Strokes","Vampire Weekend"
"Angelica",3.5,2.0,,4.5,5.0,1.5,2.5,2.0
"Bill",2.0,3.5,4.0,,2.0,3.5,,3.0
"Chan",5.0,1.0,1.0,3.0,5,1.0,,
"Dan",3.0,4.0,4.5,,3.0,4.5,4.0,2.0
"Hailey",,4.0,1.0,4.0,,,4.0,1.0
"Jordyn",,4.5,4.0,5.0,5.0,4.5,4.0,4.0
"Sam",5.0,2.0,,3.0,5.0,4.0,5.0,
"Veronica",3.0,,,5.0,4.0,2.5,3.0,''' #数据类型一:csv矩阵(用户-商品)(适用于小数据量)
csv_txt2 = '''"user","Kacey Musgraves","Imagine Dragons","Daft Punk","Lorde","Fall Out Boy"
"David",,3,5,4,1
"Matt",,3,4,4,1
"Ben",4,3,,3,1
"Chris",4,4,4,3,1
"Tori",5,4,5,,3''' #数据类型一:csv矩阵(用户-商品)(适用于小数据量)
#根据《data minning guide》第85页的users2数据
csv_txt3 = '''"user","Taylor Swift","PSY","Whitney Houston"
"Amy",4,3,4
"Ben",5,2,
"Clara",,3.5,4
"Daisy",5,,3''' df = None #方式一:加载csv数据
def load_csv_txt():
global df, csv_txt, csv_txt2, csv_txt3
df = pd.read_csv(StringIO(csv_txt3), header=0, index_col="user") #测试:读取数据
load_csv_txt() #=======================================
# 注意:不需要build_xy
#======================================= # 计算两个物品相似度
def computeSimilarity(goods1, goods2):
'''根据《data minning guide》第71页的公式s(i,j)'''
# 每行的用户评分都减去了该用户的平均评分
df2 = df[[goods1, goods2]].sub(df.mean(axis=1), axis=0).dropna(axis=0) #黑科技 # 返回修正的余弦相似度
return sum(df2[goods1] * df2[goods2]) / (sum(df2[goods1]**2) * sum(df2[goods2]**2))**0.5 # csv_txt
#print('\n测试:计算Blues Traveler与Broken Bells的相似度')
#print(computeSimilarity("Blues Traveler","Broken Bells")) # csv_txt2
#print('\n测试:计算Kacey Musgraves与Imagine Dragons的相似度')
#print(computeSimilarity("Kacey Musgraves","Imagine Dragons")) # 计算给定用户对物品的可能评分
def p(user, goods):
'''根据《data minning guide》第75页的公式p(u,i)'''
assert pd.isnull(df.ix[user, goods]) # 必须用户对给定物品尚未评分 s1 = df.ix[user, df.ix[user].notnull()] #用户对已打分物品的打分数据 s2 = s1.index.to_series().apply(lambda x:computeSimilarity(x, goods)) #打分物品分别与给定物品的相似度 return sum(s1 * s2) / sum(abs(s2)) # csv_txt2
#print('\n测试:计算David对Kacey Musgraves的可能打分')
#print(p("David","Kacey Musgraves")) #为了让公式的计算效果更佳,对物品的评价分值最好介于-1和1之间
def rate2newrate(rate):
'''根据《data minning guide》第76页的公式NR(u,N)'''
ma, mi = df.max().max(), df.min().min()
return (2*(rate - mi) - (ma - mi))/(ma - mi) #已知rate2newrate求newrate2rate
def newrate2rate(new_rate):
'''根据《data minning guide》第76页的公式R(u,N)'''
ma, mi = df.max().max(), df.min().min()
return (0.5 * (new_rate + 1) * (ma - mi)) + mi print('\n测试:计算3的new_rate值')
print(rate2newrate(3)) print('\n测试:计算0.5的rate值')
print(newrate2rate(0.5)) # 计算给定用户对物品的可能评分(对评分进行了修正/还原)
def p2(user, goods):
'''根据《data minning guide》第75页的公式p(u,i)'''
assert pd.isnull(df.ix[user, goods]) # 必须用户对给定物品尚未评分 s1 = df.ix[user, df.ix[user].notnull()] #用户对已打分物品的打分数据
s1 = s1.apply(lambda x:rate2newrate(x)) #修正
s2 = s1.index.to_series().apply(lambda x:computeSimilarity(x, goods)) #已打分物品分别与给定物品的相似度 return newrate2rate(sum(s1 * s2) / sum(abs(s2)))#还原 # csv_txt2
#print('\n测试:计算David对Kacey Musgraves的可能打分(修正)')
#print(p2("David","Kacey Musgraves")) #==================================
# 下面是Slope One算法
#
# 两个步骤:
# 1. 计算差值
# 2. 预测用户对尚未评分物品的评分
#================================== # 1.计算两物品之间的差异
def dev(goods1, goods2):
'''根据《data minning guide》第80页的公式dev(i,j)'''
s = (df[goods1] - df[goods2]).dropna()
d = sum(s) / s.size
return d, s.size #返回差异值,及权值(同时对两个物品打分的人数) # csv_txt2
#print('\n测试:计算Kacey Musgraves与Imagine Dragons的分数差异')
#print(dev("Kacey Musgraves","Imagine Dragons")) #计算所有两两物品之间的评分差异,得到方阵pd.DataFrame(行对列)
def get_dev_table():
'''根据《data minning guide》第87页的表'''
goods_names = df.columns.tolist()
df2 = pd.DataFrame(.0, index=goods_names, columns=goods_names) #零方阵 for i,goods1 in enumerate(goods_names):
for goods2 in goods_names[i+1:]:
d, _ = dev(goods1, goods2) # 注意:只取了物品差异值
df2.ix[goods1, goods2] = d
df2.ix[goods2, goods1] = -d # 对称的位置取反 return df2 print('\n测试:计算所有两两物品之间的评分差异表')
print(get_dev_table()) #预测某用户对给定物品的评分
# 加权Slope One算法
def slopeone(user, goods):
'''根据《data minning guide》第82页的公式p(u,j)'''
s1 = df.ix[user].dropna() #用户对已打分物品的打分数据 s2 = s1.index.to_series().apply(lambda x:dev(goods, x)) #待打分物品与已打分物品的差异值及权值
s3 = s2.apply(lambda x:x[0]) #差异值
s4 = s2.apply(lambda x:x[1]) #权值
#print(s1, s3, s4) return sum((s1 + s3) * s4)/sum(s4) print('\n测试:预测用户Ben对物品Whitney Houston的评分')
print(slopeone('Ben', 'Whitney Houston')) # 3.375

【笔记5】用pandas实现矩阵数据格式的推荐算法 (基于物品的协同)的更多相关文章

  1. 【笔记6】用pandas实现条目数据格式的推荐算法 (基于物品的协同)

    ''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...

  2. 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)

    原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...

  3. 【笔记4】用pandas实现条目数据格式的推荐算法 (基于用户的协同)

    ''' 基于用户的协同推荐 条目数据 ''' import pandas as pd from io import StringIO import json #数据类型一:条目(用户.商品.打分)(避 ...

  4. 简单的基于矩阵分解的推荐算法-PMF, NMF

    介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其 ...

  5. HAWQ + MADlib 玩转数据挖掘之(四)——低秩矩阵分解实现推荐算法

    一.潜在因子(Latent Factor)推荐算法 本算法整理自知乎上的回答@nick lee.应用领域:"网易云音乐歌单个性化推荐"."豆瓣电台音乐推荐"等. ...

  6. (转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)

    转自:http://zengzhaozheng.blog.51cto.com/8219051/1557054 一.概述 这2个月为公司数据挖掘系统做一些根据用户标签情况对用户的相似度进行评估,其中涉及 ...

  7. 用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...

  8. 推荐算法之用矩阵分解做协调过滤——LFM模型

    隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法.它将矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔.本文将对 LFM ...

  9. Python 的 Pandas 对矩阵的行进行求和

    Python 的 Pandas 对矩阵的行进行求和: 若使用 df.apply(sum) 方法的话,只能对矩阵的列进行求和,要对矩阵的行求和,可以先将矩阵转置,然后应用 df.apply(sum) 即 ...

随机推荐

  1. entityframework学习笔记--002-database first

    1.实体框架紧紧地和Visual Studio集成在一起,为了在你的应用程序中使用实体框架,我们增加一个ADO.NET实体数据框架到你的项目.方法如下: 右键你的项目,然后选择 ➤New Item(新 ...

  2. java web学习总结(二) -------------------TOMCAT使用帮助(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  3. 基于WCF MSMQ 的企业应用解决方案

    最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是自己做个实验,探索一下吧.经过反复试验,颇有收 ...

  4. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  5. 深入理解CSS盒子模型

    在CSS中浮动.定位和盒子模型,都是很核心的东西,其中盒子模型是CSS很重要基石之一,感觉还是很有必要把CSS盒子模型相关知识更新一下...... CSS盒子模型<BoxModel>示意图 ...

  6. jquery中 $(document).ready()和window.onload的区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 ...

  7. 1-1 gulp 实战

    npm install gulp-htmlmin gulp-imagemin imagemin-pngcrush gulp-minify-css gulp-jshint gulp-uglify gul ...

  8. iOS 开发学习资料整理(持续更新)

      “如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿   iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...

  9. 给DB数据表加强制索引

    DB2 数据库会根据DB层的统计值决定 根据查询条件走哪一个索引,某些情况下,由于未知原因,索引会走偏,故程序中可以规定程序走哪一个索引来避免索引走偏的情况发生. 强制走索引的 实例代码如下: SEL ...

  10. iOS之获取屏幕尺寸

    //app尺寸,去掉状态栏 CGRect appRect = [UIScreenmainScreen].applicationFrame; NSLog(@"%f, %f, %f,%f&quo ...