尝试神经网络用于电影评分

在之前的随笔《非对称SVD电影推荐系统》中应用SVD,得到还不错的结果。

此次尝试将BP神经网络应用于预测用户评分,由于同类用户不同电影评分差异巨大,神经网络输出神经元不易设置。

仅取movie id=0 的用户作为测试数据(350 条记录),这样只需要5个输出神经元。考虑到movie id 共有三千多个,方法无操作性。

得到的最佳rmse=0.588,预测(左)和实际试评分(右)如下(评分已减1)。单独这个电影,用户实际评分比较接近,结果没有参考价值。

[(3, 3.0), (3, 4.0), (3, 3.0), (3, 4.0), (4, 3.0), (3, 4.0), (3, 3.0), (4, 4.0), (3, 4.0), (3, 4.0), (4, 3.0), (3, 3.0), (3, 4.0), (3, 3.0), (4, 4.0), (3, 3.0), (3, 3.0), (3, 2.0), (3, 3.0), (4, 4.0), (4, 4.0), (4, 4.0), (4, 4.0), (3, 4.0), (3, 3.0), (4, 4.0), (3, 2.0), (3, 4.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 0.0), (3, 2.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 3.0), (3, 2.0), (3, 4.0), (3, 3.0), (4, 4.0), (4, 4.0), (4, 3.0), (4, 4.0), (3, 4.0), (3, 3.0), (4, 3.0), (3, 2.0), (3, 4.0), (4, 3.0), (3, 4.0), (3, 3.0), (4, 3.0), (3, 3.0), (3, 3.0), (4, 3.0), (4, 4.0), (3, 4.0), (4, 3.0), (4, 4.0), (4, 2.0), (3, 3.0), (4, 3.0), (3, 4.0), (3, 3.0), (3, 2.0), (4, 4.0), (4, 4.0), (3, 2.0), (4, 4.0), (3, 2.0), (3, 4.0), (3, 4.0), (2, 4.0), (3, 4.0), (3, 4.0), (3, 1.0), (4, 4.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 3.0), (4, 3.0), (3, 0.0), (3, 2.0), (3, 2.0), (3, 4.0), (3, 3.0), (4, 3.0), (3, 4.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 2.0), (3, 4.0), (3, 3.0), (3, 3.0), (3, 3.0), (4, 2.0), (3, 3.0), (3, 2.0), (3, 3.0), (3, 4.0), (3, 3.0), (4, 4.0), (3, 4.0), (3, 1.0), (4, 4.0), (3, 4.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 1.0), (4, 3.0), (4, 4.0), (3, 1.0), (3, 4.0), (3, 4.0), (3, 4.0), (4, 4.0), (4, 4.0), (3, 2.0), (3, 3.0), (3, 2.0), (3, 3.0), (3, 2.0), (3, 3.0), (3, 3.0), (3, 3.0), (3, 3.0), (4, 3.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 2.0), (4, 3.0), (4, 3.0), (4, 3.0), (3, 4.0), (3, 4.0), (3, 2.0), (3, 3.0), (4, 4.0), (4, 2.0), (3, 4.0), (4, 3.0), (3, 4.0), (4, 3.0), (4, 3.0), (3, 2.0), (3, 1.0), (3, 3.0), (3, 3.0), (4, 3.0), (3, 4.0), (3, 1.0), (4, 4.0), (3, 3.0), (4, 2.0), (3, 2.0), (3, 3.0), (3, 4.0), (4, 2.0), (4, 4.0), (3, 3.0), (3, 3.0), (3, 1.0), (3, 4.0), (4, 3.0), (3, 3.0), (4, 3.0), (3, 2.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 3.0), (3, 2.0), (4, 4.0), (4, 4.0), (3, 1.0), (3, 2.0), (3, 2.0), (3, 4.0), (4, 3.0), (4, 3.0), (3, 3.0), (4, 4.0), (3, 3.0), (3, 3.0), (4, 4.0), (3, 4.0), (4, 4.0), (4, 3.0), (3, 4.0), (3, 3.0), (3, 3.0), (3, 4.0), (3, 4.0), (4, 4.0), (4, 4.0), (3, 3.0), (3, 2.0), (3, 4.0), (3, 3.0), (3, 2.0), (3, 1.0), (4, 4.0), (4, 4.0), (3, 3.0), (3, 3.0), (3, 4.0), (3, 4.0), (4, 4.0), (3, 3.0), (4, 3.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 4.0), (3, 4.0), (3, 3.0), (3, 4.0), (4, 3.0), (3, 3.0), (4, 3.0), (4, 3.0), (3, 3.0), (4, 2.0), (2, 3.0), (3, 4.0), (4, 4.0), (3, 4.0), (3, 1.0), (4, 4.0), (3, 3.0), (4, 3.0), (3, 4.0), (3, 2.0), (3, 2.0), (4, 3.0), (3, 4.0), (3, 4.0), (3, 4.0), (4, 3.0), (4, 2.0), (3, 3.0), (3, 4.0), (3, 4.0), (3, 2.0), (3, 2.0), (3, 3.0), (3, 3.0), (3, 4.0), (3, 3.0), (3, 4.0), (4, 4.0), (4, 2.0), (4, 3.0), (3, 3.0), (3, 3.0), (3, 3.0), (4, 4.0), (3, 3.0), (3, 4.0), (4, 3.0), (4, 3.0), (3, 2.0), (3, 4.0), (4, 3.0), (4, 0.0), (3, 3.0), (4, 3.0), (3, 4.0), (3, 2.0), (3, 4.0), (4, 3.0), (4, 2.0), (3, 4.0), (3, 2.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 2.0), (3, 3.0), (3, 2.0), (3, 0.0), (3, 3.0), (4, 3.0), (3, 3.0), (3, 4.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 3.0), (3, 3.0), (4, 4.0), (3, 4.0), (3, 3.0), (3, 2.0), (4, 3.0), (3, 4.0), (3, 4.0), (3, 1.0), (4, 4.0), (3, 4.0), (3, 4.0), (3, 1.0), (3, 2.0), (4, 4.0), (3, 2.0), (3, 4.0), (3, 3.0), (3, 4.0), (4, 3.0), (4, 4.0), (3, 3.0), (3, 2.0), (4, 2.0), (3, 2.0), (3, 0.0), (3, 4.0), (3, 3.0), (3, 3.0), (4, 4.0), (3, 4.0), (3, 3.0), (3, 4.0), (3, 4.0), (3, 0.0), (3, 2.0), (3, 3.0), (4, 3.0), (4, 4.0), (3, 4.0), (4, 3.0), (3, 3.0), (3, 2.0), (3, 4.0), (4, 4.0), (3, 3.0), (3, 0.0), (4, 4.0), (3, 3.0), (3, 2.0), (3, 2.0), (4, 4.0), (4, 4.0), (3, 4.0)]

  1 # coding:utf8
  2 import cPickle
  3 import numpy as np
  4
  5
  6 class Network(object):
  7     def __init__(self, sizes):
  8         self.num_layers = len(sizes)
  9         self.sizes = sizes
 10         self.biases = [np.random.randn(y, 1) for y in sizes[1:]]  # L(n-1)->L(n)
 11         self.weights = [np.random.randn(y, x)
 12                         for x, y in zip(sizes[:-1], sizes[1:])]
 13
 14     def feedforward(self, a):
 15         for b_, w_ in zip(self.biases, self.weights):
 16             a = self.sigmoid(np.dot(w_, a)+b_)
 17         return a
 18
 19     def SGD(self, training_data, test_data,epochs, mini_batch_size, eta=1.0):
 20         n_test = len(test_data)
 21         n = len(training_data)
 22         for j in xrange(epochs):
 23             np.random.shuffle(training_data)  # shuffle
 24             for k in xrange(0, n, mini_batch_size):
 25                 mini_batch = training_data[k:k+mini_batch_size]
 26                 self.update_mini_batch(mini_batch, eta)
 27             rmse=np.sqrt(self.evaluate(test_data)/1000.0)
 28             print "Epoch {0}: {1} / {2}".format(
 29                     j, rmse, n_test)
 30
 31     def update_mini_batch(self, mini_batch, eta):
 32         for x, y in mini_batch:
 33             delta_b, delta_w = self.backprop(x, y)
 34             self.weights -= eta/len(mini_batch)*delta_w
 35             self.biases -= eta/len(mini_batch)*delta_b
 36
 37     def backprop(self, x, y):
 38         b=np.zeros_like(self.biases)
 39         w=np.zeros_like(self.weights)
 40         a_ = x
 41         a = [x]
 42         for b_, w_ in zip(self.biases, self.weights):
 43             a_ = self.sigmoid(np.dot(w_, a_)+b_)
 44             a.append(a_)
 45         for l in xrange(1, self.num_layers):
 46             if l==1:
 47                 delta= self.sigmoid_prime(a[-1])*(a[-1]-y)  # O(k)=a[-1], t(k)=y
 48             else:
 49                 sp = self.sigmoid_prime(a[-l])   # O(j)=a[-l]
 50                 delta = np.dot(self.weights[-l+1].T, delta) * sp
 51             b[-l] = delta
 52             w[-l] = np.dot(delta, a[-l-1].T)
 53         return (b, w)
 54
 55     def evaluate(self, test_data):
 56         test_results = [(np.argmax(self.feedforward(x)), y)
 57                         for (x, y) in test_data]
 58         print test_results
 59         return sum((x- y)**2 for (x, y) in test_results)
 60
 61     def sigmoid(self,z):
 62         return 1.0/(1.0+np.exp(-z))
 63
 64     def sigmoid_prime(self,z):
 65         return z*(1-z)
 66
 67 if __name__ == ‘__main__‘:
 68
 69     def get_label(i):
 70         c=np.zeros((5,1))
 71         c[i]=1
 72         return c
 73
 74     fi=open(‘test.dat‘,‘r‘)
 75     tt_data=[[int(line.split(‘::‘)[0])-1,int(line.split(‘::‘)[1])-1,float(line.split(‘::‘)[2])] for line in fi]
 76     tt_data.sort(key=lambda x:x[1])
 77     t_data= tt_data[:350]  # movie id=0
 78     fi.close()
 79
 80     fi=open(‘train.dat‘,‘r‘)
 81     data=np.zeros((6040,3952))
 82     for line in fi:
 83         content=line.split(‘::‘)
 84         user=int(content[0])-1
 85         item=int(content[1])-1
 86         rating=float(content[2])
 87         data[user][item]=rating
 88     fi.close()
 89
 90     train_data=[]
 91     for a in data:
 92         if a[0]>0:
 93             label=int(a[0]-1)
 94             a[0]=0
 95             train_data.append([np.reshape(a,(3952,1)),get_label(label)])
 96     test_data=[]
 97     for t in t_data:
 98         label=t[2]-1
 99         test_data.append([np.reshape(data[t[0]],(3952,1)),label])
100
101     net = Network([3952, 30, 5])
102     net.SGD(train_data,test_data,10,10,3.0)  # 0.588
时间: 2024-11-02 14:51:36

尝试神经网络用于电影评分的相关文章

电影评分那些事

电影评分现在是一个很普遍的事情了.我自己作为一个小影迷,一直都想写一篇关于电影评分,或者说影视评论的文章,今天终于有时间坐下来好好整理一下思绪了.我要写的方面主要有三个:目前的流行的评分机制与评分网站:严肃的电影评论&大众评分:我自己的评分体系. 一.目前流行的评分机制与评分网站 目前比较流行的评分网站,国外主要有IMDb,Metacritic,还有Rotten Tomatoes(烂番茄),这是三大主流的评分网站.我自己比较关注的还有Letterboxd,这个网站适合影迷使用,现在用的人也比较多

推荐系统(recommender systems):预测电影评分--构造推荐系统的一种方法:协同过滤(collaborative filtering )

协同过滤(collaborative filtering )能自行学习所要使用的特征 如我们有某一个数据集,我们并不知道特征的值是多少,我们有一些用户对电影的评分,但是我们并不知道每部电影的特征(即每部电影到底有多少浪漫成份,有多少动作成份) 假设我们通过采访用户得到每个用户的喜好,如上图中的Alice喜欢爱情电影,不喜欢动作电影,则我们将θ(1)设为[0,5,0],如此设置θ(2),θ(3),θ(4)的值,这样我们有了每个用户的θ的值以及他们对电影的打分,就可以推断出每部电影的x(特征)的值.

神经网络用于手写数字识别

一:人工神经网络 人类之所以能够思考,学习,判断,大部分都要归功于人脑中复杂的神经网络.虽然现在人脑的机理还没有完全破译,但是人脑中神经元之间的连接,信息的传递都已为人所知晓.于是人们就想能否模拟人脑的功能用于解决其他问题,这就发展出人工神经网络. 人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统

卷积神经网络用于视觉识别Convolutional Neural Networks for Visual Recognition

Table of Contents: Architecture Overview ConvNet Layers Convolutional Layer Pooling Layer Normalization Layer Fully-Connected Layer Converting Fully-Connected Layers to Convolutional Layers ConvNet Architectures Layer Patterns Layer Sizing Patterns C

受限制玻尔兹曼机(RBM)用于电影推荐小例

原文章:http://blog.csdn.net/u010223750/article/details/61196549 1 #coding='utf-8' 2 """ 3 desc: RBM model 4 author:luchi 5 date:9/3/17 6 """ 7 import numpy as np 8 class RBM_Model(object): 9 10 def __init__(self,visible_size,hid

基于卷积神经网络CNN的电影推荐系统

本项目使用文本卷积神经网络,并使用MovieLens数据集完成电影推荐的任务. 推荐系统在日常的网络应用中无处不在,比如网上购物.网上买书.新闻app.社交网络.音乐网站.电影网站等等等等,有人的地方就有推荐.根据个人的喜好,相同喜好人群的习惯等信息进行个性化的内容推荐.比如打开新闻类的app,因为有了个性化的内容,每个人看到的新闻首页都是不一样的. 这当然是很有用的,在信息爆炸的今天,获取信息的途径和方式多种多样,人们花费时间最多的不再是去哪获取信息,而是要在众多的信息中寻找自己感兴趣的,这就

夺命雷公狗---CMS---16-dedecms(实例之电影网10-完成电影的评分榜)

要实现的板块是电影评分榜,如下所示: 使用的标签是{dede:arclist},还要取出附加表的数据. 根据评分值降序排列的,前3名的样式与后面的不一样的. 分析模版上的源码所得,其实也就是前三名的加了class属性而已 (1)解决根据评分值排序. 我们要按照评分值来排序,需要根据pfen字段来排序,因此只能修改arclist标签的源码,让其支持根据pfen来排序. 通过分析发现{dede:arclist}标签, 然后到arclist.lib.php页面中随便找到输出sql语句的地方,然后我们对

用python+selenium抓取豆瓣电影中的正在热映前12部电影并按评分排序

抓取豆瓣电影(http://movie.douban.com/nowplaying/chengdu/)中的正在热映前12部电影,并按照评分排序,保存至txt文件 #coding=utf-8 from selenium import webdriver import unittest from time import sleep class DoubanMovie(unittest.TestCase):     def setUp(self):          self.dr = webdriv

MongoDB,HDFS, Spark to 电影推荐

http://www.infoq.com/cn/news/2014/12/mongdb-spark-movie-recommend MovieWeb是一个电影相关的网站,它提供的功能包括搜索电影信息.排名或者电影明星资料等.它拥有10000部电影的信息,70000个用户,和超过1千万的电影评分.借用它的搜索目录,用户可以通过类型分类.排名和片名浏览等方式检索电影.但如何解决电影智能推荐的问题呢?近日MongoDB分享了他们结合Hadoop的经验. MovieWeb基于Python.在构建电影推荐