数据挖掘之协同过滤

# coding:utf-8
__author__ = ‘similarface‘
#datalink=http://www2.informatik.uni-freiburg.de/~cziegler/BX/BX-CSV-Dump.zip
‘‘‘
BX-Users["User-ID";"Location";"Age"]
BX-Books["ISBN";"Book-Title";"Book-Author";"Year-Of-Publication";"Publisher";"Image-URL-S";"Image-URL-M";"Image-URL-L"]
BX-Book-Ratings["User-ID";"ISBN";"Book-Rating"]
‘‘‘

#专门用作编码转换
import codecs, os, sys
from math import sqrt

users = {
    "Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0,
                 "Slightly Stoopid": 1.5,
                 "The Strokes": 2.5, "Vampire Weekend": 2.0},
    "Bill": {"Blues Traveler": 2.0, "Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5,
             "Vampire Weekend": 3.0},
    "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5,
             "Slightly Stoopid": 1.0},
    "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5,
            "The Strokes": 4.0, "Vampire Weekend": 2.0},
    "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0},
    "Jordyn": {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5,
               "The Strokes": 4.0, "Vampire Weekend": 4.0},
    "Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0,
            "The Strokes": 5.0},
    "Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0}
}

class recommender:
    def __init__(self, data, k=1, metric=‘pearson‘, n=5):
        self.k = k
        self.n = n
        self.username2id = {}
        self.userid2name = {}
        self.productid2name = {}
        self.metric = metric
        if self.metric == ‘pearson‘:
            self.fn = self.pearson
        if type(data).__name__ == ‘dict‘:
            self.data = data

    def loadBookDB(self, path=‘‘):
        self.data = {}
        i = 0
        #读取用户评分书籍的数据
        f = codecs.open(os.path.join(path, ‘BX-Book-Ratings.csv‘), ‘r‘, ‘utf-8‘,errors=‘ignore‘)
        for line in f:
            i = i + 1
            fields = line.split(‘;‘)
            user = fields[0].strip(‘"‘)
            book = fields[1].strip(‘"‘)
            try:
                rating = int(fields[2].strip().strip(‘"‘))
            except ValueError:
                continue
            if user in self.data:
                currentRatings = self.data[user]
            else:
                currentRatings = {}
            currentRatings[book] = rating
            self.data[user] = currentRatings
        f.close()
        #读取书籍的信息
        f = codecs.open(os.path.join(path, ‘BX-Books.csv‘), ‘r‘, ‘utf8‘,errors=‘ignore‘)
        for line in f:
            i += 1
            fields = line.split(‘;‘)
            #BX-Books["ISBN";"Book-Title";"Book-Author";"Year-Of-Publication";"Publisher";"Image-URL-S";"Image-URL-M";"Image-URL-L"]
            isbn = fields[0].strip(‘"‘)
            title = fields[1].strip(‘"‘)
            author = fields[2].strip(‘"‘)
            title = title + ‘by‘ + author
            self.productid2name[isbn] = title
        f.close()

        #读取用户的信息
        f = codecs.open(os.path.join(path, ‘BX-Users.csv‘), ‘r‘, ‘utf8‘,errors=‘ignore‘)
        for line in f:
            i += 1
            fields = line.split(‘;‘)
            userid = fields[0].strip(‘"‘)
            location = fields[1].strip(‘"‘)
            if len(fields) > 3:
                age = fields[2].strip().strip(‘"‘)
            else:
                age = ‘NULL‘
            if age != ‘NULL‘:
                value = location + ‘ (age: ‘ + age + ‘)‘
            else:
                value = location
            self.userid2name[userid] = value
            self.username2id[location] = userid
        f.close()
        print(i)

    def pearson(self, rating1, rating2):
        ‘‘‘
        皮尔逊相关参数
        在统计学中,皮尔逊积矩相关系数
        (英语:Pearson product-moment correlation coefficient,
        又称作 PPMCC或PCCs[1],
        文章中常用r或Pearson‘s r表示)
        用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。
        在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。
        0.8-1.0 极强相关
        0.6-0.8 强相关
        0.4-0.6 中等程度相关
        0.2-0.4 弱相关
        0.0-0.2 极弱相关或无相关
        ‘‘‘
        sum_xy, sum_x, sum_y, sum_x2, sum_y2, n = 0, 0, 0, 0, 0, 0
        for key in rating1:
            if key in rating2:
                n = n + 1
                x = rating1[key]
                y = rating2[key]
                sum_xy += x * y
                sum_x += x
                sum_y += y
                sum_x2 += x ** 2
                sum_y2 += y ** 2
        if n == 0:
            return 0
        fenmu = sqrt(sum_x2 - (sum_x ** 2) / n) * sqrt(sum_y2 - (sum_y ** 2) / n)
        if fenmu == 0:
            return 0
        else:
            return (sum_xy - (sum_x * sum_y) / n) / fenmu

    def computeNearesNeighbor(self, username):
        ‘‘‘
        计算关系系数
        ‘‘‘
        distinces = []
        for instance in self.data:
            if instance != username:
                #相关系数
                distince = self.fn(self.data[username], self.data[instance])
                distinces.append((instance, distince))
        distinces.sort(key=lambda artistTuple: artistTuple[1], reverse=True)
        return distinces

    def recommend(self, user):
        recommendations = {}
        nearest = self.computeNearesNeighbor(user)
        userRating = self.data[user]
        totalDistance = 0.0
        for i in range(self.k):
            totalDistance += nearest[i][1]
        for i in range(self.k):
            weight = nearest[i][1] / totalDistance
            name = nearest[i][0]
            neighborRatings = self.data[name]
            #遍历相关性高的用户喜欢的书籍
            for artist in neighborRatings:
                #如果喜欢的书不在推荐用户的书籍中
                if not artist in userRating:
                    #文章是否存在评级
                    if artist not in recommendations:
                        recommendations[artist] = (neighborRatings[artist] * weight)
                    else:
                        recommendations[artist] = (recommendations[artist] + neighborRatings[artist] * weight)
        recommendations = list(recommendations.items())
        recommendations = [(self.convertProductID2name(k), v) for (k, v) in recommendations]
        recommendations.sort(key=lambda artistTuple: artistTuple[1], reverse=True)
        return recommendations[:self.n]

    def convertProductID2name(self, id):
        ‘‘‘
        给定商品编号返回商品名称
        ‘‘‘
        if id in self.productid2name:
            return self.productid2name[id]
        else:
            return id

    def userRatings(self, id, n):
        ‘‘‘
        返回前n条的与用户id相关的
        :param id:
        :param n:
        :return:
        ‘‘‘
        print("Ratings for " + self.userid2name[id])
        ratings = self.data[id]
        print(len(ratings))
        ratings = list(ratings.items())
        ratings = [(self.convertProductID2name(k), v) for (k, v) in ratings]
        ratings.sort(key=lambda artistTuple: artistTuple[1], reverse=True)
        ratings = ratings[:n]
        for rating in ratings:
            print("%s\t%i" % (rating[0], rating[1]))

if __name__ == ‘__main__‘:
    r = recommender(users)
    print(r.recommend(‘Veronica‘))
    r.loadBookDB(u‘D:/360安全浏览器下载/BX-CSV-Dump‘)
    print(r.recommend(‘276737‘))

 

#result:[(‘Blues Traveler‘, 5.0)]
1700021
[(u"Devil‘s Waltz (Alex Delaware Novels (Paperback))byJonathan Kellerman", 9.0), (u‘Silent Partner (Alex Delaware Novels (Paperback))byJonathan Kellerman‘, 8.0), (u‘The Outsiders (Now in Speak!)byS. E. Hinton‘, 8.0), (u‘Sein LanguagebyJERRY SEINFELD‘, 8.0), (u‘The Girl Who Loved Tom GordonbyStephen King‘, 8.0)]
时间: 2024-12-20 01:19:14

数据挖掘之协同过滤的相关文章

数据挖掘算法修炼--协同过滤Collaborative Filtering

从外部看协同过滤 从互联网上寻找有用的信息越来越难,这催生了三类方法:信息检索.信息过滤和推荐系统.信息检索是指Google.百度这样的搜索引擎,这是一种被动的方式:信息过滤是指先对信息进行分类,再根据用户的偏好进行过滤,比如我们注册知乎/豆瓣/微博等时都会要求选择感兴趣的领域,之后会对我们选定领域的内容进行推送:推荐系统根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品,推荐方法有基于内容的推荐.基于模型的推荐.关联规则以及协同过滤等等. 从内部看协同过滤 核心思想 协同过滤算法的

(数据挖掘-入门-5)基于内容的协同过滤与分类

1.动机 2.基于内容的分类器 3.python实现 一.动机 在前面的文章中介绍了基于用户和基于物品的协同过滤推荐方法,其实无论是基于用户还是基于物品,都是通过群体效应来进行推荐,因为衡量相似度的向量都是基于一定群体用户的评分,所以推荐出来的物品都是热门的流行的物品,对于一些冷门物品可能就无法收到亲睐. 而一个好的推荐系统,不仅能为用户发现热门流行的感兴趣物品,也能为用户提供自己也不了解的但也会感兴趣的物品,即冷门的物品,这样既有益于用户,也照顾了内容提供商. 因此,本文将介绍一种基于内容即物

(数据挖掘-入门-3)基于用户的协同过滤之k近邻

主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这里,k近邻(K Nearest Neighbor)的意思就是,找出最近或最相似的k个用户,将他们的评分(相似度权重求和)最高的几个物品进行推荐. 2.python实现 代码中有两个数据集, 一个是直接写在的代码中的users: 一个是在BX-Books.csv文件中:(下载地址:http://www

(数据挖掘-入门)基于用户的协同过滤之最近邻

主要内容: 1.什么是基于用户的协同过滤 2.python实现 1.什么是基于用户协同过滤: 协同过滤:Collaborative Filtering,一般用于推荐系统,如京东,亚马逊等电商网站上的“购买该物品的用户还喜欢/购买”之类的栏目都是根据协同过滤推荐出来的. 基于用户的协同过滤:User-based CF,通过不同用户对item(物品)的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐. 这里介绍一种最简单的过滤方法:最近邻,即找到与某用户最相似的用户,将该用户喜欢的物品(而某

协同过滤之ALS

搜索推荐,主要有以下几种形式:一.根据人口统计学推荐:此推荐方式需要建立用户模型,并且需要获取用户的具体信息,然后根据矩阵运算,计算相似度,此方式最大缺陷是获取用户的隐私,应用不多: 二.基于内容的推荐:根据特定用户的历史数据,推荐出相似的产品.缺点是需要建立item model,比较费时. 三.基于协同过滤,是目前搜索推荐中应用最广泛的,不需要建立item model,省事,效果比较好.协同过滤的本质,可以概括为"物以类聚,人以群分",分别指基于物品的协同过滤和基于user的协同过滤

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

协同过滤的实现步骤

协同过滤的实现 1.收集用户偏好及标准化处理 要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素.用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同. 以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好.在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式: 将不同的行为分组:一般可以分为"查看"和

个性化推荐系统原理介绍(基于内容过滤/协同过滤/关联规则/序列模式)

个性化推荐根据用户兴趣和行为特点,向用户推荐所需的信息或商品,帮助用户在海量信息中快速发现真正所需的商品,提高用户黏性,促进信息点击和商品销售.推荐系统是基于海量数据挖掘分析的商业智能平台,推荐主要基于以下信息: 热点信息或商品 用户信息,如性别.年龄.职业.收入以及所在城市等等 用户历史浏览或行为记录 社会化关系 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相

zz [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

http://yidianzixun.com/n/09vv1FRK?s=1 完全摘抄自网页 1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用户体验.集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群