吴恩达强化学习复盘(6)均值归一化|协同过滤算法简介

均值归一化

均值归一化(Mean Normalization)主要目的是将数据集中的特征值进行转换,使得每个特征的均值为 0,并且特征值的范围在一个特定的区间内(通常是 [-1, 1] 或 [0, 1] )。这样后继的计算会提高效率

具体步骤

计算均值

对于给定的数据集,计算每个特征的均值(平均值)。

假设我们有一个包含 n 个样本的数据集 X = [x_1, x_2, \cdots, x_n]

其中每个样本x_i是一个 d 维向量,即 x_i = [x_{i1}, x_{i2}, \cdots, x_{id}]

对于第 j 个特征,其均值 \mu_j 的计算公式为:\mu_j = \frac{1}{n} \sum_{i = 1}^{n} x_{ij}

计算标准差(可选)

在一些情况下,除了计算均值,还会计算每个特征的标准差 \sigma_j

其计算公式为: \sigma_j = \sqrt{\frac{1}{n} \sum_{i = 1}^{n} (x_{ij} - \mu_j)^2}

归一化操作

将每个特征值减去其均值,然后除以标准差(或者是特征值的范围,具体取决于归一化的方式)。对于第 i 个样本的第 j 个特征值 x_{ij},归一化后的特征值x_{ij}'的计算公式为:x_{ij}' = \frac{x_{ij} - \mu_j}{\sigma_j}

如果不使用标准差,而是希望将特征值映射到 [0, 1] 区间,可以使用以下公式(假设特征值的最小值为 min_j,最大值为 max_j): x_{ij}' = \frac{x_{ij} - min_j}{max_j - min_j}

均值归一化的好处在于:

  • 加速模型训练:许多机器学习算法(如梯度下降法)对数据的尺度比较敏感,经过均值归一化后的数据可以使模型更快地收敛。
  • 提高模型性能:归一化后的数据可以避免某些特征因为数值范围较大而对模型产生过大的影响,从而提高模型的泛化能力和性能。

代码示例

import numpy as np

# 生成一个示例数据集
data = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

# 计算每列的均值
mean_values = np.mean(data, axis=0)

# 计算每列的标准差
std_values = np.std(data, axis=0)

# 进行均值归一化
normalized_data = (data - mean_values) / std_values

print("原始数据:")
print(data)
print("均值归一化后的数据:")
print(normalized_data)

协同过滤算法

基本原理

协同过滤算法的构造下一篇做具体解释,这一篇只是简介。协同过滤算法是一种在推荐系统中广泛应用的算法,主要用于根据用户的行为数据来预测用户对物品的偏好程度,从而为用户提供个性化的推荐。

协同过滤算法基于这样一个假设:如果两个用户对一些物品的评分行为相似,那么他们对其他物品的评分行为也可能相似。也就是说,具有相似兴趣爱好的用户可能会对相同或相似的物品有相似的评价。例如,用户 A 和用户 B 都给电影《霸王别姬》打了高分,同时都给电影《749局》打了低分,那么可以认为用户 A 和用户 B 的兴趣偏好较为相似。

协同过滤算法做法通常有基于用户,和基于物品(比如电影/商品/音乐)两种做法。

局限性

冷启动问题

协同过滤算法存在冷启动的弱点。当目录中有新项目(如刚发布的新电影且几乎无人评级)或新用户(只评价了少量项目)时,难以准确对新项目进行排名或向新用户展示合理的内容。虽然均值归一化能在一定程度上帮助解决该问题,但可能还有更好的方式来满足这类用户的需求。冷启动问题导致算法在面对新项目或新用户时,过滤结果可能不准确。

无法有效利用附带信息

协同过滤算法不能自然地使用关于项目或用户的附带信息或额外信息。例如,对于电影,已知的信息可能包括类型、主演、制作公司、预算等;对于用户,可能知道他们的人口统计信息(年龄、性别、位置)、表达的偏好(喜欢或不喜欢某些电影类型),以及通过 IP 地址、访问设备(手机或桌面)、使用的浏览器等获取的线索,这些信息都与用户偏好可能相关。但协同过滤算法难以利用这些信息,尽管它在多个用户对多个项目进行评级的情况下是一种强大的算法,但仍存在这些局限性。

TensorFlow的自动微分工具

TensorFlow 的用途

TensorFlow 通常被认为是构建神经网络的工具,实际上它也可用于构建其他类型的学习算法,如协同过滤算法,这里先简单介绍方便后继使用。在许多应用中,实现训练需要找到代价函数的导数,而 TensorFlow 可以自动计算代价函数的导数,用户只需实现代价函数即可,无需深入了解微积分知识。

以简单代价函数为例的简单步骤

  • 以简单的代价函数 J = (W * X - 1)² 为例(其中 W 和 X 是变量,假设 y = 1)。在梯度下降更新中,W 的更新公式为 W = W - α * 导数项(α 为学习率),若同时更新 B,也有相应表达式。当 B = 0 时,可省略 B 的更新步骤,持续执行 W 的更新直至收敛。
  • 在代码实现中,首先定义变量 W 并初始化为 3(W = tf.Variable(3)),这表明 W 是需要优化的参数。设置训练数据 x = 1,y = 1,学习率 α = 0.01 ,并让梯度下降运行 30 次迭代。
  • TensorFlow 的梯度带(gradient tape)特性可用于自动计算导数。使用withtf.GradientTape() as tape: 包裹计算代价函数 J 的代码块,在这个代码块中,计算J = (W * X - Y) ** 2 ,TensorFlow 会自动记录计算 J 所需的操作步骤序列,以便实现自动微分。通过tape.gradient(J, W) 可自动计算出 J 关于 W 的导数项(记作 dJ_dW)。
  • 由于 TensorFlow 变量的特殊性,更新 W 时不采用常规的W = W - alpha * 导数 的方式,而是使用assign 函数(如W.assign_sub(learning_rate * dJ_dW) )来进行更新。经过多次迭代更新,最终可得到 W 的最优值(这里最优值为 1)。

自动微分的相关概念

  • TensorFlow 的这种自动计算导数的功能称为自动微分(auto diff),其他一些机器学习包(如 PyTorch)也支持自动微分。有时人们也将其称为 Autograd,但从技术上讲,autoDiff 是正确术语,Autograd 实际上是一个特定软件包的名称,用于自动求导。
  • 一旦能够自动计算导数,就不局限于使用梯度下降算法,还可以使用更强大的优化算法,如 Adam 优化算法来实现协同过滤算法。

使用 Adam 优化算法实现协同过滤算法的步骤

  • 首先指定优化器为 Adam 优化器(如optimizer = tf.keras.optimizers.Adam() )。
  • 在一定次数的迭代(如 200 次)中,使用with tf.GradientTape() as tape: 包裹计算代价函数 J 的代码。代价函数 J 的输入包括参数 X、W、B ,以及经过均值归一化的评级数据等。
  • 通过tape.gradient(J, [X, W, B]) 可计算出代价函数 J 关于 X、W、B 的导数。
  • 最后使用优化器的apply_gradients 函数,将计算得到的梯度应用于参数更新(optimizer.apply_gradients(zip(gradients, [X, W, B])) )。

关于实现方式需要注意

  • 不能使用传统的 “密集层 + 模型编译 + 模型拟合” 的方式来实现协同过滤算法,因为该算法及其代价函数不适合 TensorFlow 的密集层或其他标准网络层类型。因此需要自行实现代价函数,并利用 TensorFlow 的自动微分工具和 Adam 优化算法来完成代价函数的优化工作。
  • 如果模型是由 TensorFlow 支持的密集网络层或其他类型层组成的序列,传统的实现方式可能适用;即使不适用,TensorFlow 也为实现其他学习算法提供了有效方法。

最简代码例子

import tensorflow as tf

# 定义一个变量
x = tf.Variable(3.0)

# 使用 tf.GradientTape 记录计算过程
with tf.GradientTape() as tape:
    # 定义函数 y = x ** 2
    y = x ** 2

# 计算 y 关于 x 的导数
dy_dx = tape.gradient(y, x)

print("变量 x 的值:", x.numpy())
print("函数 y = x ** 2 关于 x 的导数:", dy_dx.numpy())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值