提供推荐——协作型过滤

提供推荐——协作型过滤


一、协作型过滤

一个协作型过滤算法通常的做法是对一大群人进行搜索,并从中找出与我们品味相近的一群人。然后对这些人的偏好内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。

  1. 搜集偏好
  2. 寻找相近的用户
    • 欧几里得距离评价
    • 皮尔逊相关度评价
  3. 为相近用户打分排序
  4. 推荐物品
  5. 推荐结果

1.搜集偏好

# 不同用户对电影的评分字典
critics={‘Lisa Rose‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.5,
 ‘Just My Luck‘: 3.0, ‘Superman Returns‘: 3.5, ‘You, Me and Dupree‘: 2.5,
 ‘The Night Listener‘: 3.0},
‘Gene Seymour‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 3.5,
 ‘Just My Luck‘: 1.5, ‘Superman Returns‘: 5.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 3.5},
‘Michael Phillips‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.0,
 ‘Superman Returns‘: 3.5, ‘The Night Listener‘: 4.0},
‘Claudia Puig‘: {‘Snakes on a Plane‘: 3.5, ‘Just My Luck‘: 3.0,
 ‘The Night Listener‘: 4.5, ‘Superman Returns‘: 4.0,
 ‘You, Me and Dupree‘: 2.5},
‘Mick LaSalle‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘Just My Luck‘: 2.0, ‘Superman Returns‘: 3.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 2.0},
‘Jack Matthews‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘The Night Listener‘: 3.0, ‘Superman Returns‘: 5.0, ‘You, Me and Dupree‘: 3.5},
‘Toby‘: {‘Snakes on a Plane‘:4.5,‘You, Me and Dupree‘:1.0,‘Superman Returns‘:4.0}}

2.寻找相近的用户

寻找相近用户可以使用不同的相似度评价值体系:这里介绍两种:欧几里得距离和皮尔逊相关度。

欧几里得距离:它是基于距离的相似度评价

皮尔逊相关度:用来判断两组数据与某一直线拟合程度的一种度量。它更适合于当两名用户虽然对电影有相同的爱好,但是用户1评分更严苛,而用户2更宽松,那么用欧几里得距离来计算两者相似度就会有偏差,但是皮尔逊相关度,会更关注两者的趋势。

#寻找近似用户,计算两个用户的相似度(欧几里得距离)

def sim_distance(prefs,person1,person2):  #prefs是指存储所有用户评分的字典
# 得到shared_items两个用户都给出评分的电影列表
si ={}
for item in prefs[person1]:
    if item in prefs[person2]:
        si[item] =1

if len(si) == 0:
    return 0 #此时两个用户没有共同评分的影片,相似度为0
else:
    sum_of_squares =sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])
    return 1/(1+sqrt(sum_of_squares)) #这个是转化为直接理解的相似度数值,sum_of_squares越大,相似度越小

# 寻找近似用户,计算两个用户的相似度(皮尔逊相关度)

def sim_pearson(prefs,p1,p2):
    # 得到shared_items两个用户都给出评分的电影列表
    si={}
    for item in prefs[p1]:
        if item in prefs[p2]:
            si[item] =1
    # 得到列表元素的个数
    n =len(si)
    # 如果两个人没有共同之处,则返回1
    if n==0:
        return 1

    # 对所有偏好求和
    sum1 =sum([prefs[p1][it] for it in si])
    sum2 =sum([prefs[p2][it] for it in si])
    #求平方和
    sum1Sq = sum([pow(prefs[p1][it],2) for it in si])
    sum2Sq = sum([pow(prefs[p2][it],2) for it in si])
    #求乘积之和
    pSum = sum([prefs[p1][it]*prefs[p2][it] for it in si])
    #计算皮尔逊评价值
    num = pSum-(sum1*sum2/n)
    den = sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
    if den ==0:
        return  0
    r = num/den
    return r

3.为相近用户打分排序

# 计算其他用户与某名用户的相似度并根据相似度进行排序

def topMatchers(prefs,person,n,similarity=sim_pearson): #similarity指定计算相似度的算法
    scores =[(similarity(prefs,person,other),other) for other in prefs if other!=person]
    scores.sort()
    scores.reverse()
    return scores[0:n]
    

4.推荐物品

此时,我们可以单纯的从相近用户中没有观看过的电影列表中直接进行推荐,但是这种做法太过随意。我们想要针对一部电影,从其他用户与目标用户的相似度以及他们对该部的电影评分求加权平均值,这也是所预期的目标用户会对某部电影的评分值。根据评分值的大小对推荐列表进行排序。

def getRecommendations(prefs,person,similarity=sim_pearson):
totals ={} # 用来存储 相似度*每个用户评分  的和
simSums = {} # 用来存储 相似度 的和

for other in prefs:
    # 不和自己比较
    if other ==person :continue
    sim = similarity(prefs,person,other)
    # 忽略相似度为零或小于零的情况
    if sim<=0: continue
    for item in prefs[other]: # 对某个其他用户看过的电影进行迭代
        # 只对自己还未曾看过的影片进行评价
        if item not in prefs[person] or prefs[person][item] ==0:
            # 相似度*评价值
            totals.setdefault(item,0) # if key is in the dictionary ,return its value,if not,insert key wit a  value of default
            totals[item]+=prefs[other][item]*sim
            # 相似度之和
            simSums.setdefault(item,0)
            simSums[item]+=sim

# 建立一个归一化列表
rankings =[(total/simSums[item],item) for item,total in totals.items()]
# 返回经过排序的列表
rankings.sort()
rankings.reverse()
return rankings

5.推荐结果

#欧几里得距离评价:

[(3.457128694491423, ‘The Night Listener‘), (2.7785840038149243, ‘Lady in the Water‘), (2.422482042361916, ‘Just My Luck‘)]

皮尔逊相关度评价:

[(3.3477895267131013, ‘The Night Listener‘), (2.832549918264162, ‘Lady in the Water‘), (2.5309807037655645, ‘Just My Luck‘)]

原文地址:https://www.cnblogs.com/nadech/p/9195796.html

时间: 2024-11-01 13:40:55

提供推荐——协作型过滤的相关文章

协作型过滤

什么是协作型过滤?也就是根据你的历史喜好,再根据其他人和你类似的喜好,来向你推荐你未曾接触过的物品.实际上前面两章的内容就是协作型过滤的基本算法. 协作型过滤有两大分支: 一:基于用户的协作型过滤.顾名思义也就是根据你的历史喜好,找到其他和你相似的人,再从其他人的喜好列表中向你推荐你可能会喜欢的物品. 二:基于物品的协作型过滤.根据你历史喜好的物品,找出和此物品相似的其他物品,将物品推荐给你. 这两者尽管都属于协作型过滤,但是有不同的应用场景.应该很容易的想出,在社交类的网站推荐系统中,使用的最

集体智慧编程_第二章(提供推荐)_1

前言:最近正在拜读Toby Segaran先生写的集体智慧编程,首先感谢Toby Segaran先生将知识以书本的方式传播给大家,同时也感谢莫映和王开福先生对此书的翻译,谢谢各位的不辞辛苦.首先在写随笔之前,跟各位分享一下我的编程环境:win7系统,python版本是2.7.10,开发环境我选择的是pycharm程序.本书的第一章为集体智慧导言,主要介绍的何为集体智慧和机器学习的相关概念和其局限性,以及与机器学习相关的例子和应用场景.下面开始机器学习第二章--提供推荐的相关内容. 本章主要内容:

集体智慧编程-第二章-提供推荐

2.1 协作型过滤 定义:对一大群人进行搜索,对这些人所偏爱的其他内容进行考察,并将他们组合起来构造出一个经过排名的推荐列表. 2.2 判断相似性 欧几里德距离 皮尔逊相关系数 定义:最佳拟合线(best-fit line)的相关系数(最小二乘法中的R) 计算公式 适用场景 非normalized 修正grade inflation 2.3 两种协作型过滤 基于人的协作型过滤 基于物品的协作型过滤 原文地址:https://www.cnblogs.com/ryu-manager/p/930210

电影推荐之协同过滤

1.基于内容的推荐 对于基于内容的推荐不多赘述,只说下基本的概念,根据用户已经评分且喜欢(评分高)的电影,为用户推荐和他过去喜欢的电影相似的电影,这里的相似就要依据电影的"内容"来计算了,例如电影的类型等等. 利用到评分预测上,就是对于目标用户A和电影M,从A已经评价过的电影中找到与M相似的电影,利用这些电影的评分来预测用户A对M的评分. 2.协同过滤 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法. 基于用户的协同过滤通俗的来说呢,就是对于待预测的目标用户A及电影

推荐算法-协同过滤推荐算法

layout: post title: "推荐算法-协同过滤推荐算法" date: 2020-4-13 9:00:00 categories: [Algorithm] excerpt: "协同过滤推荐算法简介,参考https://zhuanlan.zhihu.com/p/40463528" 协同过滤推荐算法步骤 1.收集用户偏好 推测用户的喜好就要收集用户的信息,用户收藏的类别,评论,下载,转发这些信息可以数字化,作为用户信息二维矩阵的变量. 2.用户数据的减噪和归

推荐系统介绍:(协同过滤)—Intro to Recommender Systems: Collaborative Filtering

本文试验前期准备: MovieLens  ml-100k数据集 Jupyter notebook themoviedb.org API key     添加python引用 import numpy as np import pandas as pd 进入MovieLens  ml-100k数据存放目录 cd F:\Master\MachineLearning\kNN\ml-100k 读取数据:u.data每行数据分为userid,itemid,rating,时间戳四部分 names = ['u

物理学背景下的推荐与协同过滤的理解

物理学背景的推荐算法与协同过滤 随着个性化推荐技术的发展,各种各样的推荐算法也竞相参与到这片新兴应用领域中进行开荒,一时间百花齐放,其中就有一些基于物理学背景的算法参与其中,本文阐述的是这篇文章在推荐算法上的主要内容,及其与传统的协同过滤算法在形式上的对比. 文章原名为<Solving the apparent diversity-accuracy dilemma of recommender systems>,要解决的正是当下推荐系统领域炙手可热的问题:怎样平衡推荐的精确度与多样性.作者的专

【Spark机器学习速成宝典】推荐引擎——协同过滤

目录 推荐模型的分类 条目2 条目3 条目4 条目5 条目6 条目7 条目8 条目9 推荐模型的分类 最为流行的两种方法是基于内容的过滤.协同过滤. 基于内容的过滤: 比如用户A买了商品A,商品B与商品A相似(这个相似是基于商品内部的属性,比如"非常好的协同过滤入门文章"和"推荐系统:协同过滤collaborative filtering"比较相似),那么就能将商品B推荐给用户. 协同过滤: 利用的是训练数据是大量用户对商品的评分,即(userID,productI

chapter2:提供推荐

一.相似度度量方法 1.欧几里得距离(euclidean) 对于两个n维向量A,B, 2.皮尔逊相关度 皮尔逊相关度其实是协方差和标准差的商,即对于两个n维向量A,B, 所以: 皮尔逊相关度的取值范围是[-1,1],是两个样本集向量夹角的cosine值 3.jaccard相似度和广义jaccard相似度 对集合A和B,Jaccard相似度计算如下: Jaccard(A, B)= |A intersect B| / |A union B| 相似度数值在[0, 1]之间,当A==B的时候,为1. 元