# 教程 | 预测电影偏好？如何利用自编码器实现协同过滤方法

• 本文简介
• 深度自动编码器
• 模型实施

1 介绍

2. 深度自编码器

3. 实现

1::595::5::978824268

Movie Nr. : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Rating: 5 0 2 4 0 0 2 1 5 1 0 4 5 1 3

Movie Nr. : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Rating: 5 0 2 4 0 0 2 1 5 0 0 0 0 0 0

Movie Nr. : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Rating: 0 0 0 0 0 0 0 0 0 1 0 4 5 1 3

TensorFlow 实现

1.模型架构

```class DAE:
''' Implementation of Deep Autoencoder class'''

def __init__(self, FLAGS):
self.FLAGS=FLAGS
self.weight_initializer=model_helper._get_weight_initializer()
self.bias_initializer=model_helper._get_bias_initializer()
self.init_parameters()

def init_parameters(self):
''' Initializing the weights and biasis of the neural network.'''

with tf.name_scope('weights'):
self.W_1=tf.get_variable(name='weight_1', shape=(self.FLAGS.num_v,self.FLAGS.num_h),
initializer=self.weight_initializer)
self.W_2=tf.get_variable(name='weight_2', shape=(self.FLAGS.num_h,self.FLAGS.num_h),
initializer=self.weight_initializer)
self.W_3=tf.get_variable(name='weight_3', shape=(self.FLAGS.num_h,self.FLAGS.num_h),
initializer=self.weight_initializer)
self.W_4=tf.get_variable(name='weight_5', shape=(self.FLAGS.num_h,self.FLAGS.num_v),
initializer=self.weight_initializer)

with tf.name_scope('biases'):
self.b1=tf.get_variable(name='bias_1', shape=(self.FLAGS.num_h),
initializer=self.bias_initializer)
self.b2=tf.get_variable(name='bias_2', shape=(self.FLAGS.num_h),
initializer=self.bias_initializer)
self.b3=tf.get_variable(name='bias_3', shape=(self.FLAGS.num_h),
initializer=self.bias_initializer)
```

2.训练

```def _inference(self, x):
'''Making one forward pass. Predicting the outputs, given the inputs.'''

with tf.name_scope('inference'):
a4=tf.matmul(a3, self.W_4)
return a4
```

```def _compute_loss(self, predictions, labels,num_labels):
''' Computing the Mean Squared Error loss between the input and output of the network.

@param predictions: predictions of the stacked autoencoder
@param labels: input values of the stacked autoencoder which serve as labels at the same time
@param num_labels: number of labels !=0 in the data set to compute the mean

@return mean squared error loss tf-operation
'''
with tf.name_scope('loss'):
loss_op=tf.div(tf.reduce_sum(tf.square(tf.subtract(predictions,labels))),num_labels)
return loss_op
```

```def _optimizer(self, x):
'''Optimization of the network parameter through stochastic gradient descent.

@param x: input values for the stacked autoencoder.

@return: tensorflow training operation
@return: ROOT!! mean squared error
'''

outputs=self._inference(x)
mask=tf.where(tf.equal(x,0.0), tf.zeros_like(x), x) # indices of zero values in the training set (no ratings)
num_train_labels=tf.cast(tf.count_nonzero(mask),dtype=tf.float32) # number of non zero values in the training set
outputs=tf.where(bool_mask, outputs, tf.zeros_like(outputs)) # set the output values to zero if corresponding input values are zero

MSE_loss=self._compute_loss(outputs,x,num_train_labels)

if self.FLAGS.l2_reg==True:
l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
MSE_loss = MSE_loss +  self.FLAGS.lambda_ * l2_loss

RMSE_loss=tf.sqrt(MSE_loss)

return train_op, RMSE_loss
```

3.测试

```def _validation_loss(self, x_train, x_test):
''' Computing the loss during the validation time.
@param x_train: training data samples
@param x_test: test data samples
@return networks predictions
@return root mean squared error loss between the predicted and actual ratings
'''
outputs=self._inference(x_train) # use training sample to make prediction
mask=tf.where(tf.equal(x_test,0.0), tf.zeros_like(x_test), x_test) # identify the zero values in the test ste
num_test_labels=tf.cast(tf.count_nonzero(mask),dtype=tf.float32) # count the number of non zero values

MSE_loss=self._compute_loss(outputs, x_test, num_test_labels)
RMSE_loss=tf.sqrt(MSE_loss)

return outputs, RMSE_loss
```

4.训练结果

```epoch_nr: 0, train_loss: 1.169, test_loss: 1.020

epoch_nr: 10, train_loss: 0.936, test_loss: 0.959

epoch_nr: 20, train_loss: 0.889, test_loss: 0.931

epoch_nr: 30, train_loss: 0.873, test_loss: 0.923

epoch_nr: 40, train_loss: 0.859, test_loss: 0.925

epoch_nr: 50, train_loss: 0.844, test_loss: 0.929
```

0 条评论

• ### 教程 | 如何使用TensorFlow和自编码器模型生成手写数字

本文详细介绍了如何使用 TensorFlow 实现变分自编码器（VAE）模型，并通过简单的手写数字生成案例一步步引导读者实现这一强大的生成模型。 全部 VAE ...

• ### Python使用PyQT制作视频播放器

最近研究了Python的两个GUI包，Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下，我觉得PyQT使用起来更加方便，功能也相...

• ### 全面深入理解Python面向对象编程

面向过程编程最易被初学者接受，其往往用一长段代码来实现指定功能，开发过程中最常见的操作就是粘贴复制，即：将之前实现的代码块复制到现需功能处。

• ### PHP自带的DateTime类，Carbon扩展类，真正的“相见恨晚！”

PHP有一个名为DateTime的类，可以帮助您读取、写入、比较或计算日期和时间。除了DATETIME之外，PHP中还有许多与日期和时间相关的函数，但它为大多数...

• ### Bytom资产发行与部署合约教程

Gitee地址：https://gitee.com/BytomBlockchain/bytom

• ### 请不要在 JDK 7+ 中使用这个 JSON 包了！

Json-lib 是以前 Java 常用的一个 Json 库，最后的版本是 2.4，分别提供了 JDK 1.3 和 1.5 的支持，最后更新时间是 2010年1...

• ### 请不要在 JDK 7+ 中使用这个 JSON 包了

Json-lib 是以前 Java 常用的一个 Json 库，最后的版本是 2.4，分别提供了 JDK 1.3 和 1.5 的支持，最后更新时间是 2010年1...

• ### 微信小程序那点事：特性总结

一、微信小程序运行环境 1、完全封闭的环境不等于浏览器环境 2、WXML/WXSS/JS格式 3、WXML 不等于 HTML 4、WX...

• ### 研究人员演示：用USB设备能够秘密窃取临近USB接口的数据

只需要用一个稍作伪装过的USB设备，插到电脑的USB口中，它就能监听临近USB接口泄露出出来的电信号，如果临近USB口接了键盘的话，那么通过对其进行分析就能获取...