Coursera机器学习 Week9 笔记

这篇博客介绍了Coursera机器学习课程的第九周内容,主要包括异常检测和推荐系统的概念与应用。在异常检测部分,讲解了异常检测算法的原理,如高斯分布、模型评估和特征选择,并对比了异常检测与监督学习的区别。在推荐系统部分,阐述了预测用户评分、寻找相关电影以及给新用户推荐电影的方法,涉及矩阵分解等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程作业放到了github上:coursera_machine_learning

1. Anomaly Detection (异常检测)

当一堆数据集中出现少个别几个异常数据时,需要检测出这几个异常数据。

1.1 异常检测算法概述

用一个分布 P(x) P ( x ) 来表示数据 x x 是正常数据的概率,如果P(x)<ϵ x x 是异常数据,反之。

而异常检测算法要做的,就是从现有的训练集中训练出这个分布P(x)

异常检测是一个“无监督学习”模型。

1.2 单元高斯分布

异常检测中我们使用“高斯分布”。因此只要通过训练集计算出“高斯分布”中的参数 μ μ σ2 σ 2 即可。

对于其中一条数据 x(i)={x(i)1,x(i)2,...,x(i)n} x ( i ) = { x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) } ,认为其各特征之间是独立同分布的,则:

P(x(i))=p(x(i)1)p(x(i)2)...p(x(i)n) P ( x ( i ) ) = p ( x 1 ( i ) ) p ( x 2 ( i ) ) . . . p ( x n ( i ) )

于是对于特征 xj x j 而言,只要其满足“高斯分布”,就可以计算:

μj=1mi=1mx(i)j μ j = 1 m ∑ i = 1 m x j ( i )

σ2j=1mi=1m(x(i)jμj)2 σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2

p(x(i)j)=12πσexp((x(i)jμj)22σ2j) p ( x j ( i ) ) = 1 2 π σ e x p ( − ( x j ( i ) − μ j ) 2 2 σ j 2 )

至此,通过计算得到了 x x 的分布,于是当新来一个xtest,只要计算 P(xtest)<ϵ P ( x t e s t ) < ϵ 是否成立,如果是,则 xtest x t e s t 是一个异常值。 ϵ ϵ 的选择在下一节中讲到。

但是目前为止,必须保证features是满足“高斯分布”的。至于如何选择这样子的特征以及当特征不满足高斯分布时怎么处理。

1.3 模型评估

一个模型需要有一个评估标准来判断这个模型的好坏。

虽说异常检测是一个无监督模型,但是在评估的时候,我们还是需要知道一些正确答案labels才能进行评估的。所谓无监督模型是指在训练的时候输入的数据没有标签,但是在测试评估的时候是要有参照的。

假设有如下数据:

10000条好数据;20条异常数据

分成如下数据集:

训练集:6000条好数据
[作用:计算出正常数据的高斯分布P(x)]

验证集:2000条好数据(y=1);10条异常数据(y=0)
[作用:选择参数 ϵ ϵ 及特征]

测试集:2000条好数据(y=1);10条异常数据(y=0)
[作用:评估模型的好坏]

评估过程如下:

步骤1: 先用训练集学习出好数据的高斯分布模型P(x)

步骤2: 在验证集上进行预测,令:

y={1if p(x)<ϵ0if p(x)ϵ y = { 1 i f   p ( x ) < ϵ 0 i f   p ( x ) ⩾ ϵ

步骤3: 验证机上模型评估以便调整参数
1.常用的方法是计算正确率,但这种方式显然不适合用在这里,因为这个数据集是“倾斜的(skewed dataset)”,好数据 >> 异常数据,如果全部预测成好的,其正确率也不低]
2.对于skewed dataset,采用以下方法均可:
   - 真阳性、假阳性、假阴性、真阴性
   - Precision/Recall
   - F1 score

步骤4: 阈值 ϵ ϵ 的选择(包括特征的选择)
[多试几个 ϵ ϵ ,然后评估模型,选择F1 score值较高的]
步骤5: 最后,在测试集上运用上述评估方式,得出模型最终的performance

总结一下,训练集学习模型,验证集选择参数 ϵ ϵ 和特征,测试集评估模型。

1.4 特征选择

首先需要保证选择的数据是满足高斯分布的。判断的依旧就是将这个特征进行可视化,如果这个特征不是高斯分布,那么就需要通过各种变换将其转换成高斯分布

比如说,下面这个特征的分布是一个“长尾分布”,则可以通过“取对数 logx log ⁡ x ”、“开平方 x x ”等方式将其转变成一个“高斯分布”。

其次,通过一个“误差分析”来选择特征。

先用算法跑出一个模型来,然后预测错误的数据 – 应为异常被判断成了正常 所对应的特征。该数据所对应的特征的概率是否符合一般情况,如果 p(x(i)j) p ( x j ( i ) ) 在异常时应该很高,而这里却很低,那么考虑这个特征的正确性,有可能需要更换特征,或者生成一个新的特征。

在异常检测中,一般选择那些在异常和正常数据间变化特别大的特征。

1.5 异常检测 Vs 监督学习

可以看到异常检测其实也是将数据集分成两类数据 – 正常数据和异常数据,那么为什么不采用监督学习呢?

第一种情况:当数据集中两类数据分布极其不均匀时,如异常数据只有“几十个”而正常数据远远多于异常数据时,应当采用“异常检测”。
[因为从这么少的异常数据中,是无法学习到符合异常数据的特征的,所以应该用异常检测去学习正常数据的特征(即所服从的高斯分布)]

第二种情况:当异常数据的种类太多,而给出的数据集中没有完全包括时,应采用“异常检测”。
[因为监督学习只能学习到现有种类的特征,无法对未知种类进行学习。所以应使用异常检测算法学习现有正常数据的特征,然后才能对异常数据进行区分。或者说无监督学习可以学到数据本身所具有的特性,而监督学习学到的只是数据对于当前任务的特性。]

监督学习的一个重要前提是各类数据的量要均匀。

1.6 多元高斯分布

之前的单元高斯分布中,要求各特征之间没有关联,独立同分布,也就是说,单元高斯分布只能学习各特征的分布,没法学习到特征之间的关联性。如果想要引入特征之间的关联性,需要自己手动构造新的特征来表示其他特征之间的关联。

而多元高斯分布可以直接通过一个“协方差矩阵”来检测到各特征之间的关联性。

多元高斯分布的计算公式如下:

P(x(i))=12π|Σ|exp[12(x(i)μ)TΣ1(x(i)μ)] P ( x ( i ) ) = 1 2 π | Σ | e x p [ − 1 2 ( x ( i ) − μ ) T Σ − 1 ( x ( i ) − μ ) ]

μ=1mi=1mx(i) μ = 1 m ∑ i = 1 m x ( i )

Σ=1mi=1m(x(i)μ)(x(i)μ)T Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T

与“单元高斯分布”相比:

  • “多元高斯分布”能够学习到特征之间的关联性
  • 但是当特征数量特别大的时候,“单元高斯分布”的计算速度要比“多元高斯分布”快。因为 Σ1 Σ − 1 的计算量很大。
  • 另外,“多元高斯分布”需要保证 Σ Σ 可逆,否则无法计算。保证可逆的一个条件就是 m>n m > n ,最好保证 m10n m ⩾ 10 n 。这里的 n n 是指互相之间非线性相关的特征的数量。
  • 综合来说,还是“单元高斯分布”的使用更佳普遍。

    在一种情况下,“多元高斯分布”和“单元高斯分布”可以等同,即当各特征之间没有相关性,数学表现就是:

Σ=[σ1200...000σ220...00...000...σn120000...0σn2]

2. Recommender System (推荐系统)

2.1 预测用户的评分

数据:

-user1user2user3user4
movie15500
movie2?40?
movie35??0
movie40054
movie5005?

令电影数据表示为为 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ,假设特征为“是否为爱情片”和“是否为动作片”,另外一维是偏置bias,即维度为 (3,1) ( 3 , 1 )

令用户的偏好数据表示为 θ(1),θ(2),...,θ(4) θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) ,维度同上;

假设用户j给电影i的评分为: y(i,j)^=(θ(j))Tx(i) y ( i , j ) ^ = ( θ ( j ) ) T x ( i )

所以模型中的参数为 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) θ(1),θ(2),...,θ(4) θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 )

算法过程如下:

步骤一:随机初始化 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) θ(1),θ(2),...,θ(4) θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) 为small values

步骤二:根据cost function,使用梯度下降不断迭代调整参数:

J(x(1),x(2),...,x(5);θ(1),θ(2),...,θ(4))=12r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=15(x(i))2+λ2j=14(θ(j))2 J ( x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ; θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) ) = 1 2 ∑ r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 5 ( x ( i ) ) 2 + λ 2 ∑ j = 1 4 ( θ ( j ) ) 2

minx(1),x(2),...,x(5);θ(1),θ(2),...,θ(4)J(x(1),x(2),...,x(5);θ(1),θ(2),...,θ(4)) min x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ; θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) J ( x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ; θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) )

最后就学习到了所有的 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) θ(1),θ(2),...,θ(4) θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 )

想知道未知的用户j给电影i的评分直接计算 (θ(j))Tx(i) ( θ ( j ) ) T x ( i ) 即可。

在实际操作中,会把这个过程向量化,令:

X=(x(1))T(x(2))T...(x(5))T X = [ − − ( x ( 1 ) ) T − − − − ( x ( 2 ) ) T − − . . . − − ( x ( 5 ) ) T − − ]

Θ=(θ(1))T(θ(2))T...(θ(4))T Θ = [ − − ( θ ( 1 ) ) T − − − − ( θ ( 2 ) ) T − − . . . − − ( θ ( 4 ) ) T − − ]

因为

Ŷ=(θ(1))Tx(1)(θ(1))Tx(2)...(θ(1))Tx(5)(θ(2))Tx(1)(θ(2))Tx(2)(θ(2))Tx(5).........(θ(4))Tx(1)(θ(4))Tx(2)(θ(4))Tx(5) Y ^ = [ ( θ ( 1 ) ) T x ( 1 ) ( θ ( 2 ) ) T x ( 1 ) . . . ( θ ( 4 ) ) T x ( 1 ) ( θ ( 1 ) ) T x ( 2 ) ( θ ( 2 ) ) T x ( 2 ) . . . ( θ ( 4 ) ) T x ( 2 ) . . . ( θ ( 1 ) ) T x ( 5 ) ( θ ( 2 ) ) T x ( 5 ) . . . ( θ ( 4 ) ) T x ( 5 ) ]

所以

Ŷ=XΘT Y ^ = X ⋅ Θ T

Ŷ=XΘT Y ^ = X ⋅ Θ T 的过程又被称为“低秩矩阵分解”过程。

2.2 寻找相关电影

经过上面的任务,已经得到了 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 )

判断电影i和电影j是否类似,只要计算一下它们的向量之间的距离就行了。

找到最相关电影的数学表达如下:

minI,jx(i)x(j)2 min I , j ‖ x ( i ) − x ( j ) ‖ 2

2.3 给新用户推荐电影

数据:

-user1user2user3user4user5
movie15500?
movie2?40??
movie35??0?
movie40054?
movie5005??

可见新用户对于所有电影的评分都是未知的,所以无法根据评分高低来推荐电影给他。一个最简单的处理方式就是把,该电影下其他用户评分的平均值赋给新用户,然后再通过 minJ(θ;x) min J ( θ ; x ) ,求出 θ(5) θ ( 5 ) ,最后新用户对电影的评分就是 (θ(5))Tx(i) ( θ ( 5 ) ) T x ( i )

赋值之后的数据:

-user1user2user3user4user5
movie15500 104=2.5 10 4 = 2.5
movie2?40? 52=2.5 5 2 = 2.5
movie35??0 42=2 4 2 = 2
movie40054 94=2.25 9 4 = 2.25
movie5005? 54=1.25 5 4 = 1.25

来看一下,如果不给赋平均值,直接计算的话会有什么情况发生。因为:

J(x(1),x(2),...,x(5);θ(1),θ(2),...,θ(4))=12r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=15(x(i))2+λ2j=15(θ(j))2 J ( x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ; θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) ) = 1 2 ∑ r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 5 ( x ( i ) ) 2 + λ 2 ∑ j = 1 5 ( θ ( j ) ) 2

所以当 (θ(5))Tx(i)=? ( θ ( 5 ) ) T x ( i ) = ? 的时候,影响最终\theta^{(5)}取值的只有 λ25j=1(θ(j))2 λ 2 ∑ j = 1 5 ( θ ( j ) ) 2 这一项,为了整体最小,所以在迭代过程中, θ(5) θ ( 5 ) 的取值会趋向于0,这样一来,啥电影都没法推荐了,不够友好。

2.4 推荐算法类型

主要分成:

  1. “product-based” :知道产品的特征向量,通过学习用户的偏好向量来求未知评分;
  2. “user-based”:知道用户的偏好向量,通过学习产品的特征向量来求未知评分;
  3. 协同过滤算法:以上两个向量都不知道的时候,先随机初始化两个向量,然后先固定 θ(1),θ(2),...,θ(4) θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) ,然后最小化 J(x(1),x(2),...,x(5))=125i=1r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ25i=1(x(i))2 J ( x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ) = 1 2 ∑ i = 1 5 ∑ r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 5 ( x ( i ) ) 2 ;再固定 x(1),x(2),...,x(5) x ( 1 ) , x ( 2 ) , . . . , x ( 5 ) ,最小化 J(θ(1),θ(2),...,θ(4))=124j=1r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ25j=1(θ(j))2 J ( θ ( 1 ) , θ ( 2 ) , . . . , θ ( 4 ) ) = 1 2 ∑ j = 1 4 ∑ r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ j = 1 5 ( θ ( j ) ) 2 ;就这样循环交替着更新,直至收敛。
  4. 上面介绍的,相当于“同步”协同过滤算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值