初学数据挖掘——相似性度量(二)

  上一篇中介绍了四个算法,并用四个算法分别计算了两个人的相似度。这篇就来讲讲相似性算法在实际当中怎么用。第一:将指定的人与其他人作相似性比较,并从高到低进行排序;第二:对指定的人推荐未看过的电影。同样还是先给出具体分析,然后给出相应算法,再最后一起给出代码。

  根据相似性从高到底排序。

def topMatchs(prefs, person, n=5, similarity=sim_pearson):
        scores=[(similarity(prefs, person, other), other) for other in prefs if other!=person]

        scores.sort()
        scores.reverse()
        return scores[0:n]

  以上是这一部分的算法。其中涉及到Python的函数式编程,由于我也是才在学Python,所以在以后也会顺带解释相应的Python代码,topMatchs方法一共有四个参数,第一、二个参数是必传的参数,第三、四是选传的参数,如果不传入参数,则传入其默认的值,注意第四个参数传入的是一个函数,所以将函数作为一个参数来进行传递也就是函数式编程,sim_pearson方法在上一篇中有相应代码,在本文末也有相应代码。这个算法比较简单,就是指定一人与每个人进行相似性度量,讲比较的结果存入一个list,然后进行排序、返回。

  推荐未看过的电影。

def getRecommendations(prefs, person, similarity=sim_pearson):
    totals = { }    #与指定人(person)的相似度 x 对person未看过电影的评分(加权值)。所有人的总和
    simSums = { } #所有人的相似度(是对该电影有过评价且对person来说未看过的人)
    #
    for other in prefs:
        if other == person: continue    #肯定不和自己比较
        sim = similarity(prefs, person, other) #返回的是与此人的相似度

        #忽略相似度为0或者小于0的情况,
        if sim <= 0: continue

        for item in prefs[other]:
            #只对自己还未看过的电影进行推荐
            if item not in prefs[person] or prefs[person][item] == 0:
                #相似度 x 对该电影的评论
                totals.setdefault(item, 0)  #该方法是Dictionary方法,若键key不存在于此Dictionary中,将会添加该键到Dictionary中,并设默认值(0)
                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

  这个算法有两点,第一:未看过的电影,这个好解决。第二:推荐,怎么个推荐?是否能根据某一个人和我的相似度很高,所以就将他看过我没看过的电影推荐给我?当然不行,就算他和我相似度很高,但是还是存在他对某一部电影的评分很低,而我又没有看过就推荐给我,所以单单从某人和我的相似度高低这一个因素来进行显然不可以。同样存在某一个人一部电影的评分很高,但他的相似度和我很低,而且其他人对此电影的评分很低,这种情况也不可以。所以引用原文中的话“我们需要通过一个经过加权的评价值来为影片打分”。我们还是按照上周给出过的例子,小明A对《左耳》、《何以笙箫默》、《速度与激情》的评分分别是3、4、5,小红对这三部电影的评分是2、5、1,再加上“我”。我们假设这三部电影我没有看过,根据上面一个算法得出A对我的相似度是0.99,B是0.38。现在列出一个表格来进行说明。

  。每个电影的评价值,也就是经过加权后的评价值=相似度x对该电影的评分。Total代表每个电影的经过加权后评价值总和,相似度总和则是所有评论者的相似度总和,最后Total/相似度总和即得到影片的推荐值,由此可见推荐度分别是《何以》、《速度》、《左耳》。注意,这里的所有评论者指的都是评论过该电影的评论者,若没有评论过该电影者,Total和相似度总和都不包括此人。如果想要更加详细的了解,请参阅中文版《集体智慧编程》P15。我认为最关键的地方在于——加权,如何加权,怎么加权合适,这是个问题。

  下面就贴出所有的代码,只需要将以下代码直接贴在上章的最后即可。

 1 #指定一人与其他人的相似度排名
 2 def topMatchs(prefs, person, n=5, similarity=sim_pearson):
 3         scores=[(similarity(prefs, person, other), other) for other in prefs if other!=person]
 4
 5         scores.sort()
 6         scores.reverse()
 7         return scores[0:n]
 8
 9 print u"与Toby相似度最高的人"
10 print topMatchs(critics, ‘Toby‘, n=3)
11
12 #以下方法在topMatchs方法的基础上直接根据相似度x加权值(对每个电影的评分)推荐电影
13 def getRecommendations(prefs, person, similarity=sim_pearson):
14     totals = { }    #与指定人(person)的相似度 x 对person未看过电影的评分(加权值)。所有人的总和
15     simSums = { } #所有人的相似度(是对该电影有过评价且对person来说未看过的人)
16     #
17     for other in prefs:
18         if other == person: continue    #肯定不和自己比较
19         sim = similarity(prefs, person, other) #返回的是与此人的相似度
20
21         #忽略相似度为0或者小于0的情况,
22         if sim <= 0: continue
23
24         for item in prefs[other]:
25             #只对自己还未看过的电影进行推荐
26             if item not in prefs[person] or prefs[person][item] == 0:
27                 #相似度 x 对该电影的评论
28                 totals.setdefault(item, 0)  #该方法是Dictionary方法,若键key不存在于此Dictionary中,将会添加该键到Dictionary中,并设默认值(0)
29                 totals[item] += prefs[other][item] * sim
30                 #相似度之和
31                 simSums.setdefault(item, 0)
32                 simSums[item] += sim
33
34     rankings = [(total/simSums[item], item) for item, total in totals.items()]
35
36     rankings.sort()
37     rankings.reverse()
38     return rankings
39
40 print u"推荐给Toby的电影"
41 print getRecommendations(critics, "Toby")

  在这章中,相似性度度量算法使用了“皮尔逊相关系数”,书中提到“选择不同的相似性度量方法,对结果的影响是微乎其微的”。事实的确如此,使用上章的四个算法,影片的推荐都是一致的。

  

时间: 2024-10-07 20:50:51

初学数据挖掘——相似性度量(二)的相关文章

初学数据挖掘——相似性度量

好久没有写这个了.也就是在去年到今年这个时间段里,同时决定好几件事情.第一:考研.第二:以后方向就是大数据或者是叫数据挖掘.这两件事当然是有联系的,第一件事就是考研考到北京,接着研究生的方向就是数据挖掘了吧.在一边准备考研的同时,还必须得一边准备着数据挖掘方面的知识.无奈本科前三年这方面接触得极少,只好利用现在的时间来恶补了. 不久前买了一边<集体智慧编程>,开篇即开始讲算法,或者是整本书都是在讲算法,而第一个算法就是——相似度度量.这个在现在用得非常多,在QQ音乐等音乐播放器上有类似“猜你喜

初学Python(二)——数组

初学Python(二)——数组 初学Python,主要整理一些学习到的知识点,这次是数组. # -*- coding:utf-8 -*- list = [2.0,3.0,4.0] #计算list长度 print len(list) #第一个元素 print list[0] #最后一个元素 print str(list[-1]) list.append(2.4) list.insert(1,2.7) list.pop(1) list.insert(1,['sdf','sdfdf']) print

数据挖掘——(二)数据预处理

数据预处理 1. 数据质量的三个要素:准确性.完整性.一致性 2. 数据预处理的主要任务: 数据清理.数据集成.数据归约.数据变换 一. 数据清理 数据清理主要:填补缺失的值,光滑噪声同时识别离群点,并纠正数据的不一致性. 通常是一个两步的迭代过程,包括偏差检测和数据变换 注意:在某些情况下,缺失值并不意味着数据有误.在理想情况下,每个属性应当有一个或多个关于控制条件的规则.这些规则可以说明是否允许空值,并且/或者说明这样的空值应当如何处理或转换. 二. 数据集成 数据集成将来自多个数据源的数据

数据挖掘学习二

Matplotlib学习目标 知道Matplotlib的架构 应用Matplotlib的基本功能实现图形显示 应用Matplotlib实现多图显示 应用Matplotlib实现不同画图种类 2.1 Matplotlib之HelloWorld 学习目标 目标 快速掌握Matplotlib画图 应用 无 2.1.1 什么是Matplotlib 是专门用于开发2D图表(包括3D图表) 使用起来及其简单 以渐进.交互式方式实现数据可视化 2.1.2 为什么要学习Matplotlib 可视化是在整个数据挖

如何学好数据挖掘(二)

在上一篇文章中我们给大家介绍了学习数据挖掘的第一条路线,第一条路线讲述的是如何学习机器学习的第一部分,主要是数据挖掘方面,懂得了这些我们才能够进行下一步的工作,那么学习数据挖掘的第二条路线是什么呢?我们在这篇文章中给大家介绍一下相关的知识. 首先给大家说一下数据挖掘的技术过程,数据挖掘的技术过程有很多,比如数据清理(消除噪音或不一致数据).数据集成(多种数据源可以组合在一起).数据选择(从数据库中提取与分析任务相关的数据).数据变换(数据变换或统一成适合挖掘的形式:如,通过汇总或聚集操作).数据

python初学总结(二)

(1)字典 字典是一种映射关系:键(key),值(value),key-value对 创建字典的方式:直接创建和利用dict函数创建 >>> aInfo = {'Wangdachui': 3000, 'Niuyun':2000, 'Linling':4500, 'Tianqi':8000} >>> info = [('Wangdachui',3000), ('Niuyun',2000), ('Linling',4500), ('Tianqi',8000)] >&g

初学Python(二)

五.变量与赋值 Python中的变量在声明时不需要指定其类型,它会根据你的赋值自动判断 对于数字和字符这种值类型的赋值,变量只是对它的引用,并不能直接删除其值(其实由于Python中的垃圾回收机制,你并不能真正删除任何东西,由Python自动判断它“没有人”了才会删除它) >>> a = 1 >>> b = a >>> print(a, b) 1 1 >>> a = 9 >>> print(a, b) 9 1 六.数

初学SpringBoot之二

原文教程链接在此http://blog.csdn.net/lxhjh/article/details/51752419. 使用了org.slf4j.Logger和org.slf4j.LoggerFactory 贴三句代码: protected static Logger logger=LoggerFactory.getLogger(HelloController.class); logger.debug("访问hello"); logger.debug("访问helloNam

python初学笔记(二)

注释: 任何时候,我们都可以给程序加上注释.注释是用来说明代码的,给自己或别人看,而程序运行的时候,Python解释器会直接忽略掉注释,所以,有没有注释不影响程序的执行结果,但是影响到别人能不能看懂你的代码. Python的注释以 # 开头,后面的文字直到行尾都算注释 # 这一行全部都是注释... print 'hello' # 这也是注释 注释还有一个巧妙的用途,就是一些代码我们不想运行,但又不想删除,就可以用注释暂时屏蔽掉: # 暂时不想运行下面一行代码: # print 'hello, p