概述
这是吴恩达机器学习的最后一课,这次学习的内容是机器学习的常见应用,异常检测与协同过滤。课程中介绍的异常检测主要基于 正态分布,用于检测出偏离正常值的数据。而协同过滤是 推荐系统 的一部分,利用已有用户的评分来给你推荐商品、视频等。
点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看,代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第八周的笔记。
异常检测
通常使用异常检测的情况是在一个含有正常和异常的数据集中,异常样本数目远小于正常样本数目,使得无法从异常数据中提取有效的特征。于是只能通过学习正常数据的分布来识别异常数据。具体来说,我们通过数据学习一个概率模型
p
(
x
)
p(x)
p(x),并通过一个阈值
ϵ
epsilon
ϵ 来判断数据是否异常。从直观上来理解正常数据虽然由于误差等原因有所偏离,但基本都还在一个区域范围内,而异常数据则会离这个区域比较远( 如下图,红圈里的可以看做异常值 )。
算法
在异常检测中,假设特征是相互独立的而且服从正态分布
x
j
∼
N
(
μ
j
,
δ
j
2
)
x_j sim N(mu_j,delta_j^2)
xj∼N(μj,δj2),所以:
p
(
x
)
=
∏
j
=
1
n
p
(
x
j
;
μ
j
,
δ
j
2
)
=
∏
j
=
1
n
1
2
π
δ
j
e
−
(
x
j
−
μ
j
)
2
2
δ
j
2
p(x)=prodlimits_{j=1}^np(x_j;mu_j,delta_j^2)=prodlimits_{j=1}^nfrac{1}{sqrt{2pi}delta_j}e^{-frac{(x_j-mu_j)^2}{2delta_j^2}}
p(x)=j=1∏np(xj;μj,δj2)=j=1∏n2πδj1e−2δj2(xj−μj)2
然后我们只要通过数据计算
μ
i
mu_i
μi 和
δ
i
delta_i
δi 就可以得到
p
(
x
)
p(x)
p(x) 了,于是有如下算法:
- 选择有助于区分异常数据的特征 x i x_i xi
- 分别计算 μ 1 , . . . , μ n , δ 1 2 , . . . , δ n 2 mu_1,...,mu_n,delta_1^2,...,delta_n^2 μ1,...,μn,δ12,...,δn2:
KaTeX parse error: No such environment: align* at position 9: begin{̲a̲l̲i̲g̲n̲*̲}̲ mu_j &= frac…- 对于需要检测异常的数据 x x x 计算 p ( x ) p(x) p(x),如果 p ( x ) < ϵ p(x) < epsilon p(x)<ϵ 则判断为异常。
算法在特征比较多时计算效率比较高,而且在通常情况下即使特征不独立也能够得到比较好的结果。如果特征比较少并且特征之间又相互关联的情况,这时候我们可以使用 多元正态分布 来作为模型,此时
p
(
x
)
p(x)
p(x) 为:
p
(
x
)
=
1
(
2
π
)
k
∣
Σ
∣
e
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
p(x)=frac{1}{sqrt{(2pi)^{k}|Sigma|}}e^{-frac{1}{2}(x-mu)^TSigma^{-1}(x-mu)}
p(x)=(2π)k∣Σ∣1e−21(x−μ)TΣ−1(x−μ)
式中的
Σ
Sigma
Σ 为 协方差矩阵,在之前的课程笔记中有提到。
ϵ epsilon ϵ 选择
由于我们的数据有 偏斜类 的问题,所以需要用 查准率 和 召回率 的结合 F 1 F_1 F1 指数来评价模型,并选取 F 1 F_1 F1 取最大时对应的 ϵ epsilon ϵ 作为阈值。
协同过滤
假设我们有
n
m
n_m
nm 部影片,并且有
n
u
n_u
nu 位用户对于其中一些影片的评价
y
(
i
,
j
)
y^{(i,j)}
y(i,j),。
其中用户对有些影片没有打分,我们希望能够估计这些评分并推荐高分的内容给用户。用户
j
j
j 有没有给
i
i
i 电影评分记为
R
(
i
,
j
)
R(i,j)
R(i,j)。假设每部电影具有特征向量
x
(
i
)
x^{(i)}
x(i),对于用户
(
1
)
(1)
(1),我们像 线性回归 中那样学习一个
h
θ
(
x
)
=
θ
0
(
1
)
+
θ
1
(
1
)
x
1
+
θ
2
(
1
)
x
2
+
⋯
+
θ
n
(
1
)
x
n
h_theta(x)=theta_0^{(1)}+theta_1^{(1)}x_1+theta_2^{(1)}x_2+dots+theta_n^{(1)}x_n
hθ(x)=θ0(1)+θ1(1)x1+θ2(1)x2+⋯+θn(1)xn 来获取用户没有打分的评分。可以看出对于所有用户,评分表可以表示为电影特征矩阵和用户参数矩阵的乘积:
X
=
[
—
(
x
(
1
)
)
T
—
—
(
x
(
2
)
)
T
—
⋮
—
(
x
(
n
m
)
)
T
—
]
,
Θ
=
[
—
(
θ
(
1
)
)
T
—
—
(
θ
(
2
)
)
T
—
⋮
—
(
θ
(
n
u
)
)
T
—
]
X = begin{bmatrix} — (x^{(1)})^T — \ — (x^{(2)})^T — \ vdots \ — (x^{(n_m)})^T — end{bmatrix}, Theta = begin{bmatrix} — (theta^{(1)})^T — \ — (theta^{(2)})^T — \ vdots \ — (theta^{(n_u)})^T — end{bmatrix}
X=⎣⎢⎢⎢⎡—(x(1))T——(x(2))T—⋮—(x(nm))T—⎦⎥⎥⎥⎤,Θ=⎣⎢⎢⎢⎡—(θ(1))T——(θ(2))T—⋮—(θ(nu))T—⎦⎥⎥⎥⎤
预测的评分
P
r
e
d
i
c
a
t
e
d
=
X
Θ
T
Predicated = X Theta^T
Predicated=XΘT,值得注意的是
X
,
Θ
X, Theta
X,Θ 都是未知的,它们都是需要学习的变量。
代价函数
确定了学习模型,下一步就是要设定 代价函数。这次的 代价函数 和之前基本相同,不同的是在计算梯度的时候 X , Θ X, Theta X,Θ 都需要求。下面直接给出 代价函数:
J
(
x
(
1
)
,
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
)
=
1
2
∑
(
i
,
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
begin{array}{l l l} J(x^{(1)},...,x^{(n_m)},theta^{(1)},...,theta^{(n_u)}) & = & frac{1}{2} sum_{(i,j):r(i,j)=1} left( (theta^{(j)})^T x^{(i)} - y^{(i,j)}right) ^2 \ & + & frac{lambda}{2} sum_{i=1}^{n_m} sum_{k=1}^n (x_k^{(i)})^2 \ & + & frac{lambda}{2} sum_{j=1}^{n_u} sum_{k=1}^n(theta_k^{(j)})^2 end{array}
J(x(1),...,x(nm),θ(1),...,θ(nu))=++21∑(i,j):r(i,j)=1((θ(j))Tx(i)−y(i,j))22λ∑i=1nm∑k=1n(xk(i))22λ∑j=1nu∑k=1n(θk(j))2
通过简单的求导可以得到梯度公式:
∂
J
∂
x
k
(
i
)
=
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
θ
k
(
j
)
+
λ
x
k
(
i
)
∂
J
∂
θ
k
(
j
)
=
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
x
k
(
i
)
+
λ
θ
k
(
j
)
frac{partial J}{partial x_k^{(i)}} = sum_{j:r(i,j)=1} ((theta^{(j)})^Tx^{(i)}-y^{(i,j)})theta_k^{(j)} + lambda x_k^{(i)} \ frac{partial J}{partial theta_k^{(j)}} = sum_{i:r(i,j)=1} ((theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)} + lambda theta_k^{(j)}
∂xk(i)∂J=j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(j)+λxk(i)∂θk(j)∂J=i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j)
和之前的学习算法相同,我们只需要实现 代价函数 的部分并计算梯度值,调用 minimize 函数来获取最优解就可以了。有了
X
,
Θ
X, Theta
X,Θ 的值,我们就能够得到预测的评分,通过评分高低就能够进行推荐啦。
课程总结
吴恩达机器学习课程作为对机器学习基本的了解还是不错的。但是课程的内容比较老,像 深度学习、强化学习 等内容都没有涉及,缺乏概率方面的视角,工程方面也只是提了一点点,这些也正是今后需要继续学习的内容。
当驶向 机器学习之海 的时候,感觉心中有一个方向很重要,即便它有多么的不切实际。
So~,第八周的内容就是这些了,谢谢大家耐心阅读。
最后
以上就是搞怪钢铁侠为你收集整理的吴恩达机器学习:异常检测与协同过滤的全部内容,希望文章能够帮你解决吴恩达机器学习:异常检测与协同过滤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复