RBM算法模型应用在推荐系统 Python代码实现

技术标签: python  算法  RBM  神经网络  机器学习

原文链接:http://blog.echen.me/2011/07/18/introduction-to-restricted-boltzmann-machines/

原作者代码地址:https://github.com/echen/restricted-boltzmann-machines

部分翻译:http://www.cnblogs.com/zhangchaoyang/articles/5537643.html

cnblogs上的这篇没有完全翻译,我主要翻译这篇没有提及但我需要用到的部分(就是指这篇译文中缺失的例子部分)。关于RBM概念介绍部分的翻译,请参考:http://www.cnblogs.com/zhangchaoyang/articles/5537643.html ===>这篇文章中有的本文将不再赘述

背景:假设你要求一群用户从0-100分来给一组电影打分。在经典的因子分析中,你可以尝试依据一组隐藏因子来解释每部电影及用户。例如,像星球大战和指环王这类电影与“科幻小说和魔幻”这类隐藏因子可能强相关,而喜欢瓦力和玩具总动员的用户与“皮克斯动画工作室”这一隐藏因子可能强相关。
    RBM可以理解为一种二值化的因子分析法(这是对它的一种理解方式,当然还有其他的理解方式及用途,原文作者主要采用二值化因子分析法去解释并实现)。与以往让用户采用一个连续的分数段为电影打分不同的是,这里只是告诉你他们“喜欢”还是“不喜欢”一部电影(1或0),之后RBM将会尝试找到之所以这样去选择电影的隐藏因子。

    例如,假设我们有一组共六部电影(哈利·波特、阿凡达、指环王3、角斗士、泰坦尼克号和星梦泪痕)并且让用户告诉我们他们想看哪些。如果我们想学到两个隐藏单元潜在的电影偏好---比如,在我们六部电影里呈现出了两个自然分组:“科幻小说/魔幻”组(包括哈利·波特、阿凡达和指环王3)以及“奥斯卡获得者”组(包括指环王、角斗士和泰坦尼克号),所以我们可能希望我们的隐藏单元将会与这些分组相对应---那么,RBM可能看起来像这样:


假设我们的两个隐藏单元确实与“科幻小说/魔幻”及“奥斯卡获得者”相对应。

  • 如果Alice告诉我们她关于六部电影的二进制偏好值(可视层),我们就可以去问我们的RBM:与她偏好相对应的哪个隐藏单元会被**(1或0)(如:要求RBM依据隐藏因子去解释她的偏好)。所以可视层的六部电影向隐藏单元发送消息,以更新隐藏层。(注意:即使Alice已经声称她想看哈利·波特、阿凡达和指环王3,也不能保证代表“科幻小说/魔幻”的隐藏层会被置1,但是只有那样才会有很大的可能性被置1。这也说得通:在现实世界中,因为Alice想看这三部电影通常使我们非常确信她喜欢“科幻小说/魔幻”类型的,但是,还是有可能因为其他原因使她做出这样的选择。因此,RBM允许我们在这个混乱真实的世界为人生成模型)
  • 反过来,如果我们知道某人喜欢“科幻小说/魔幻”(此时“科幻小说/魔幻”隐藏单元被置1),我们便可以要求这个隐藏单元置1的电影单元RBM(比如,要求它生成一组电影推荐)。所以,隐藏单元向电影单元(可视层)发消息,告诉他们去更新他们的状态。(请再次注意,“科幻小说/魔幻”单元被置1不能保证我们总会推荐这三部电影:哈利·波特、阿凡达和指环王3。因为,你想想,并不是每个喜欢科幻小说的人都喜欢阿凡达)

按照原文作者给出的代码(https://github.com/echen/restricted-boltzmann-machines),让我们来演示一些例子。

首先,我使用一些造的数据来训练RBM:

  • Alice: (Harry Potter = 1, Avatar = 1, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0). Big SF/fantasy fan(科幻超级迷妹).
  • Bob: (Harry Potter = 1, Avatar = 0, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0). SF/fantasy fan, but doesn’t like Avatar(科幻迷,但不喜欢阿凡达).
  • Carol: (Harry Potter = 1, Avatar = 1, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0). Big SF/fantasy fan(科幻超级迷).
  • David: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 1, Glitter = 0). Big Oscar winners fan(奥斯卡超级迷).
  • Eric: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 0, Glitter = 0). Oscar winners fan, except for Titanic(奥斯卡迷,但不喜欢泰坦尼克号(译者注:原文此处Titanic = 1有误)).
  • Fred: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 1, Glitter = 0). Big Oscar winners fan(奥斯卡超级迷).

该网络学习到了以下权重:


    请注意,第一个隐藏单元看起来对应“奥斯卡获得者”,第二个隐藏单元看起来对应“科幻小说/魔幻”,跟我们预期一致。
    如果给RBM一个新的用户输入会发生什么呢?(可视层到隐藏层)比如George, 他的偏好是(Harry Potter = 0, Avatar = 0, LOTR 3 = 0, Gladiator = 1, Titanic = 1, Glitter = 0) ,结果是“奥斯卡获得者”对应的隐藏单元被置1(而不是“科幻小说/魔幻”),正确地猜出乔治可能更喜欢“奥斯卡获得者”类型的电影。
    如果我们只**“科幻小说/魔幻”对应的单元,并且让RBM训练一段时间会发生什么呢?(隐藏层到可视层)在我的试验中,有三次哈利·波特、阿凡达和指环王3被置1;有一次阿凡达和指环王3被置1,而哈利波特没有;有两次,哈利·波特和指环王3被置1,而阿凡达没有。注意,给予我们的训练集,这些生成的偏好的确匹配了我们觉得真正的科幻迷想要看的电影。


来源:网络


智能推荐

k-近邻算法python代码实现(非常全)

1、k近邻算法是学习机器学习算法最为经典和简单的算法,它是机器学习算法入门最好的算法之一,可以非常好并且快速地理解机器学习的算法的框架与应用。它是一种经典简单的分类算法,当然也可以用来解决回归问题。 2、kNN机器学习算法具有以下的特点: (1)思想极度简单 (2)应用的数学知识非常少 (3)解决相关问题的效果非常好 (4)可以解释机器学习算法使用过程中的很多细节问题 (5)更加完整地刻画机器学习...

引力搜索算法[附python实现代码]

在求解具有高维搜索空间的优化问题时,由于搜索空间随问题大小呈指数增长,经典优化算法无法提供合适的解,因此使用精确技术(如穷举搜索)来解决这些问题是不可能的实用。完毕在过去的几十年里对受自然现象行为启发的算法越来越感兴趣。许多研究者表明,这些算法非常适合于解决复杂的计算问题,如目标函数的优化、模式识别、控制目标、图像处理、滤波器建模等。到目前为止,研究者们已经采用了各种启发式方法来解决这些问题例如遗...

二叉树(C++模板实现)

一、实验要求    <1>打印出二叉树的三种遍历序。     <2>设计算法按中序次序输出二叉树中各结点的值及其所对应的层次数。     <3>求二叉树的高度。     <4>求二叉树的结点数。     <5>...

语音识别学习记录 [TDNN时延神经网络]

最近了解了卷积神经网络(CNN),CNN是受语音信号处理中时延神经网络(TDNN)影响而发明的。本篇的大部分内容都来自关于TDNN原始文献Waibel A, Hanazawa T, Hinton G, et al. Phoneme recognition using time-delay neural networks[J] (TDNN的原始论文)的理解和整理。该文写与1989年,在识别"...

教你快速推广微信公总号

随着互联网科技的飞速发展,自媒体平台正在发挥着越来越大的影响力,企业进行互联网的品牌建设,一定会通过网络媒体,推广自己在网络中的知名度以及品牌内容,从而形成公众认识的企业品牌形象。同事个人自媒体也在发光发热,多少人在自媒体这个行业里赚到了人生的第一桶金。公总号作为自媒体的代表,自然也吸引了不少人的加入,导致现在的微信公总号也是越来越难做了。现在微信公总号的粉丝价格已经涨到了2-3元一个粉丝的地步。...

猜你喜欢

VMware+ubuntu安装以及使用问题总结 (蓝屏,屏幕小,无法操作鼠标)

前言 需要使用VMware来创建ubuntu虚拟机。 安装VMware 我是参考伪万能的洋桑 安装的VMware。 但是一定要去官网去下载最新的VMware,如果使用旧版的在打开创建好的虚拟机会出现蓝屏问题。 关于**问题,直接搜最新的***即可。 安装ubuntu 参考悠悠happy安装ubuntu。 这里需要下载iso文件。几个G的那种,不要下载错了。 这里想要图形化界面,下载ubuntu-1...

老外写的一个测试用例

Test case example:   Test Case ID: CUST.01   Function: Add a new Customer   Data Assumptions: Customer database has been restored   General Description:   Add a new customer, via the Customer Add...

编辑距离矩阵及在java中的应用

刚好项目有需求要使用到,了解后觉得挺有意思的就发出来跟大家分享下,主要还是为了以后自己可以回头翻翻,大神勿喷啊 下面开始进入正题: 一个原始字符串,经过不断的修改,删除最后变成另外一个字符串,怎么体现出这个字符串的修改痕迹呢,这里面有个最小路径的概念,也就是原始字符串->目标字符串最少要经过多少步骤 假设原字符串:src="abCd"; 假设新字符串:dst="...

Eclipse创建maven父工程

1、点击File,选择New --> Maven Project 2、勾选create a simple project(skip archetype selection),选择Working set,点击Next 3、填写Artifact信息,Packaging选择pom,点击Finish jar为Java工程; pom为父工程 war为Web工程 4、父工程结构...

第四章 条件语句

Java条件语句之 if Java条件语句之 if…else Java条件语句之多重 if Java条件语句之嵌套 if Java条件语句之 switch 1、 switch 后面小括号中表达式的值必须是整型或字符型 2、 case 后面的值可以是常量数值,如 1、2;也可以是一个常量表达式,如 2+2 ;但不能是变量或带有变量的表达式,如 a * 2 3、 case 匹配后,执行匹...

问答精选

How to get the hostname in Google App Engine?

I'm developing an app with Python on Google App Engine at http://shs1509-grc.appspot.com/ And since I am in China, appspot is blocked, and my users have to use the hostname http://shs1509-grc.appsp0t....

SessionNotCreatedException in Eclipse "Appium" code

My Code to execute a simple click button automation is given below , I am very new to appium so I am just trying to get my app and click one button , as i have given my exception down it is stopping m...

Get the count of checkboxes checked in a List using Javascript

I have a multiple Input Checkbox List and I want to create a JS function that when the user selects more than specified count items in the checkbox list, it will reject the action but if they have few...

Deleting index from Solr using solrj as a client

I am using solrj as client for indexing documents on the solr server. I am having problem while deleting the indexes by 'id' from the solr server. I am using following code to delete the indexes: Afte...

BATCH Scripting - Swapping array subscript values

I'd like to start this off by saying batch scripting is something I ever do, and it's for an assignment in my class, so please bear with me. I am trying to take an array index and swap one of the indi...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答