吴恩达机器学习第九周周报

目录

摘要

实数评估

异常检测与监督学习对比

推荐系统

基于梯度下降的协同过滤算法

基于内容的推荐算法

二进制标签

均值归一化

协同过滤TensorFlow实现

寻找相关特征

协同过滤的局限性

基于内容的推荐算法 vs 协同过滤

从大型目录中推荐

 ​编辑

基于内容过滤的TensorFlow实现

总结


摘要

        本周以学习推荐系统的内容主,推荐系统主要有两个算法构成的,基于梯度下降的协同过滤算法,和基于内容的推荐算法,以及一些能优化相应算法的方法;以及用TensorFlow实现协同过滤算法和基于内容的推荐算法。

        This week, we will focus on learning the content of recommendation systems, which mainly consist of two algorithms: gradient descent based collaborative filtering algorithm, content based recommendation algorithm, and some methods that can optimize corresponding algorithms; And using TensorFlow to implement collaborative filtering algorithms and content-based recommendation algorithms.

实数评估

        当学习算法时,比如选择不同的特征或者尝试不同的参数值,决定是否以某种方式更改特征或增加或减少参数,做出这些决定是如果有一种评估学习算法的方法,就会容易很多。这有时被称为实数评估,意思是如果你能以某种方式快速改变算法,比如改变一个特征或者改变一个参数,并有一种计算数字的方法可以告诉你算法是好是坏,那么它使决定是否坚持对算法的更改容易得多。  尽管我们主要讨论的是未标记数据,改变一下这个假设,并加色有一些标记书记,通常包括少量一起观察到的异常。事实证明,如果正在构建一个实用的异常检测系统,使用少量异常来评估交叉验证和测试集的算法对调整算法非常有帮助。
      异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量y的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。


        当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
        训练集用来训练算法。
        交叉验证用来调整阈值。

        要注意的是对于阈值的选取,我们可以尝试不同的epsilon来观察F1的值,然后选取F1值最大的那个epsilon作为训练的阈值。

异常检测与监督学习对比

异常检测监督学习
当异常实例非常少时同时拥有大量的正样本和负样本
当异常实例有许多不同类型时拥有足够的正常样本
未来出现的异常样本可能和现在异常的样本完全不一样以后出现正常样本与当前出现正常样本相似

推荐系统

在推荐系统中主要有两种方法,基于内容的推荐算法和协同过滤算法,采用电影推荐作为例子,初始作如下定义:

  • n_{u} --- 用户数量
  • n_{m} --- 电影数量
  • r(i,j)=1 --- 用户 j 对电影 i 进行了评价
  • y(i,j) --- 用户 j 对电影 i 的评分
  • m^{(j)} --- 用户 j 评价了的电影数量
  • \theta^{(j)} --- 拟合用户 j 评价电影的曲线参数
  • n --- 电影的特征数量

基于梯度下降的协同过滤算法

通过w(j)、b(j)来拟合x(i)的成本函数

通过x(i)来拟合w(j)、b(j)的成本函数

把二者结合在一起

使用梯度下降

 因为多个用户合作,评价了同一部电影,就可以让其他人知道这部电影可能是什么样的,可以猜测这个电影特征,是那种类型的;而这又允许反过来使用尚未评价同一部电影的其他用户如何评价这已知特征的电影。所以这种协同过滤就是从多个用户那里收集数据,用户之间的这种协作可帮助您预测未来甚至其他用户的评分。

基于内容的推荐算法

        需要每个用户的一些特征以及每个项目的一些特征。它使用这些特征来舱室决定哪些项目和用户可能彼此匹配。 依然拥有用户对某些项目进行评分的数据。

$v_u^{(j)}$是一个向量,是根据用户j的特征计算的数字列表,是反映用户j对不同类型的电影的喜爱层度(分数),$v_m^{(i)}$是根据电影i特征计算的数字列表,反映的是电影i在不同类型的特质数值。而利用两个向量的点乘,最后求和,能得到预测用户给电影i的评分。但是关键在于如何对向量$v_u^{(j)}$$v_m^{(i)}$进行恰当的选择。

Xu是用户的各种特征信息,Xm是电影的各种特征信息,通过神经网络,分别得到Vu和Vm向量,这个网络中,两个输入层可以有不相同数量的特征,但是两个输出层一定要有相同数量的特征。最后点乘得出预测值。

其成本函数为

通过训练,使Vu和Vm的值变得合适。

如果想找到类似的电影,也同样和协同过滤的方法一样:用Vm构造一个成本函数,使其最小:

二进制标签

这是一个带有二进制标签的协同过滤数据集的示例,用户喜欢或参与特定电影的注释。

比如这是一个购物网站的模型,当用户在一件商品上停留超过30s,就分配“1”,否则就是“0”,然后没有在用户面前从出现的商品,就分配“?”;

另一种根据用户行为隐式生产评分的方法是查看用户点击项目,通常在在线广告中完成,如果用户看到了广告,如果他点击了在线广告就赋“1”,如果看到了广告但是没有点击就赋“0”,如果根本就没有看到这个广告就赋“?”

1)对于之前的公式,y(i,j)是由w(j)*x(i)+b(j)来预测的。

2)而对于二进制标签,预测标签y(i,j)=1的概率是来自逻辑回归g(w(j)*x(i)+b(j))

需要做的是就是将1)变成2),那么首先就要从成本函数上进行修改: 把w(j)*x(i)+b(j)换成f(w,b,x)(x),令其等于g(w(j)*x(i)+b(j)),然后带入逻辑回归的简化成本函数公式得:

为了使其适应协同过滤设置,成本函数改写为:

均值归一化

        对于一个对任何电影都没评分的用户,如何预测他对其他电影的评分;

 第5个用户就取每个电影的平均得分(这里吴恩达老师用均值归一化进行处理,不过最后仍是用的均值)

协同过滤TensorFlow实现

TensorFlow可以自动找出成本函数的导数

import numpy as np

w = tf.Variable(3.0)  //获取参数w并将其初始化为3.0的值
x = 1.0
y = 1.0 #target value
alpha = 0.01   //设置学习率为0.01

iterations = 30  //进行30次迭代
for iter in range(iterations):
     with tf.GradientTape() as tape:  //梯度带
        fwb = w*x
        costJ = (fwb - y)**2
[dJdw] = tape.gradient(costJ,[w])//自动计算costJ关于 w 的导数
w.assign_add(-alpha * dJdw)  //w- w导数*alpha,并且需要特殊处理,因此用assign_add赋值
optimizer = keras.optimizers.Adam(learning_rate=le-1) //指定学习率

iterations = 200    //两百次迭代
for iter in range(iterations):
    with tf.GradientTape() as tape:  //梯度流
        cost_value = cofiCostFuncV(X,W,b,Ynorm,R,num_users,num_movies,lambda) // 协同过滤的各个参数、正则化数
    grads = tape.gradient(cost_value,[X,W,b])//求出  x w b 的导数
    optimizer.apply_gradients(zip(grads,[X,W,B]))  //优化器

寻找相关特征

给定一个项目,想找到其他项目,比如与某个电影相关的其他电影,需要做的就是尝试找到具有特征相似的。而确定特征相似的方法:

协同过滤的局限性

1)不太擅长冷启动问题

比如项目中有一个新项目,有人刚刚发布了一部新电影,但几乎没有人评价过这部电影,如何进行项目的排名?同样对弈只评价了几个项目的新用户,如何确保向他们展示合理的东西,均值归一化是可以解决,但是对于该项目或者用户的协同过滤的结果可能不会非常准确。

2)没有一个自然的方式来使用边信息或关于项目、用户的附加信息。比如,在项目中的电影,可能可以知道电影的各个类型、电影的演员、什么制片厂等等各种信息;对于用户,可能了解他们的人口信息、表达偏好等,这些信息都是可以来判断的小提示但是没有办法直接自然的使用在协同过滤里面。

基于内容的推荐算法 vs 协同过滤

基于内容的推荐算法通过电影特征和用户对电影的评分,训练出用户对不同类电影的喜好程度和 推测出用户对其它电影的评分;协同过滤算法可以不给出用户评价的分数,同样可以学习出特征值,然后根据特征值改进用户评分的参数:
1)随机初始化用户评价的分数,通过协同过滤学习并预测电影特征值;
2)通过电影特征值学习并预测更好的用户评分的参数;
3)回到步骤1),往复循环。
最终算法收敛到合适的电影特征值和用户评分的参数;
用户对电影的评分训练出电影的特征和用户对各类型电影的喜好程度和推测出用户对其它电影的评分;

从大型目录中推荐

推荐系统有时需要挑选一些项目进行推荐,这些项目来自数千或数百万甚至更多的项目目录。比如:一个大型电影流媒体网站可能有数千电影或一个试图决定要显示什么广告的系统、或者一个音乐流媒体网站可能有数千万歌曲可供选择,而大型在线购物网站可以有数百万甚至数千万种产品可供选择。将他们的特征送到此神经网络,运行数百万次神经网络的推理,但是会造成非常大的运算量。

 

许多推荐系统实现都是分为两个步骤,第一步是检索,第二步是排名。

1)检索:在检索步骤时,生产大量可能推荐的项目候选者列表,可能包含有许多用户不太可能喜欢的项目,那么在后续排名步骤中微调并选择最好的项目推荐给用户。通过使用寻找相关特征的方法(见标题9),找到一组用户喜欢的项目。

作者举的例子中,使构建了一个当用户观看某部电影后,系统自动为用户推荐其他电影的情景;其中检索的步骤就分为三部:1)找到与用户观看的电影最相似的10部电影;2)根据用户最多观看的三种类别的电影,找出每种类别的排名前10的电影。3)还会将用户所在国家或地区的前20部电影添加在此列表中。最终会得到一个100左右可能推荐的电影列表。检索步骤的目标是确保广泛的覆盖范围,尽可能多得包含推荐的电影。然后删除用户已经选择过的电影,或者不想再次推荐给他们的电影。

2)排名:通过获取检索步骤后的列表,并使用学习模型对他们进行排名,需要将用户的特征向量和项目特征输入到这个神经网络中,通过计算出,排名最高的项目,从而向用户显示。

在检索步骤中,检索更多的项目往往会带来更多的性能开销,作者建议先进行离线实验,看看检索额外项目会产生多少更相关的推荐。

基于内容过滤的TensorFlow实现

import numpy as np

user_NN = tf.keras.models.Sequential([
    tf.keras.layers.Dense(256,activation = 'relu'),
    tf.keras.layers.Dense(128,activation = 'relu'),   
    tf.keras.layers.Dense(32)
]) 
#用户网络,最后输出层结点都是32个

item_NN = tf.keras.models.Sequential([
    tf.keras.layers.Dense(256,activation = 'relu'),
    tf.keras.layers.Dense(128,activation = 'relu'),
    tf.keras.layers.Dense(32)
])
#项目网络,最后输出层结点都是32个

input_user = tf.keras.layers.Input(shape=(num_user_features))  #提取用户输入特征
vu = user_NN(input_user)                                       #传递给用户向量
vu = tf.linalg.12_normalize(vu,axis = 1)                       #设置向量vu标准化,长度为1

input_user = tf.keras.layers.Input(shape=(num_item_features))  #提取项目输入特征
vm = item_NN(input_item)                                       #传递给项目向量
vm = tf.linalg.12_normalize(vm,axis = 1)                       #设置向量vm标准化,长度为1

output = tf.keras.layers.Dot(axes=1)([vu,vm])                  #计算vn、vm点积

model = Model([input_user,input_item],output)                  #模型

cost_fn = tf.keras.losses.Meansquarederror()                   #均方误差成本函数

总结

本周完成吴恩达机器学习的网课,开始使用环境,自己手动做其对应的实验;下周开始深度学习课程的学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值