吴恩达机器学习:异常检测与协同过滤

这是吴恩达机器学习的最后一课,此次学习的内容是机器学习的常见应用,异常检测与协同过滤。课程中介绍的异常检测主要基于 正态分布,用于检测出偏离正常值的数据。而协同过滤是 推荐系统 的一部分,利用已有用户的评分来给你推荐商品、视频等。git

点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程做业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看( 没法访问 Github 的话能够点击 Coding 查看 ),代码中的错误和改进欢迎你们指出。github

如下是 Ng 机器学习课程第八周的笔记。算法

异常检测

一般使用异常检测的状况是在一个含有正常和异常的数据集中,异常样本数目远小于正常样本数目,使得没法从异常数据中提取有效的特征。因而只能经过学习正常数据的分布来识别异常数据。具体来讲,咱们经过数据学习一个几率模型 p(x),并经过一个阈值 \epsilon 来判断数据是否异常。从直观上来理解正常数据虽然因为偏差等缘由有所偏离,但基本都还在一个区域范围内,而异常数据则会离这个区域比较远( 以下图,红圈里的能够看作异常值 )。机器学习

算法

在异常检测中,假设特征是相互独立的并且服从正态分布 x_j \sim N(\mu_j,\delta_j^2),因此:ide

p(x)=\prod\limits_{j=1}^np(x_j;\mu_j,\delta_j^2)=\prod\limits_{j=1}^n\frac{1}{\sqrt{2\pi}\delta_j}e^{-\frac{(x_j-\mu_j)^2}{2\delta_j^2}}

而后咱们只要经过数据计算 \mu_i\delta_i 就能够获得 p(x) 了,因而有以下算法:函数

  1. 选择有助于区分异常数据的特征 x_i
  2. 分别计算 \mu_1,...,\mu_n,\delta_1^2,...,\delta_n^2
\begin{align*}
\mu_j &= \frac{1}{m}\sum\limits_{i=1}^mx_j^{(i)} \\
\delta^2_j &= \frac{1}{m}\sum\limits_{i=1}^m(x_j^{(i)}-\mu_j)^2
\end{align*}
  1. 对于须要检测异常的数据 x 计算 p(x),若是 p(x) < \epsilon 则判断为异常。

算法在特征比较多时计算效率比较高,并且在一般状况下即便特征不独立也可以获得比较好的结果。若是特征比较少而且特征之间又相互关联的状况,这时候咱们可使用 多元正态分布 来做为模型,此时 p(x) 为:学习

p(x)=\frac{1}{\sqrt{(2\pi)^{k}|\Sigma|}}e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)}

式中的 \Sigma协方差矩阵,在以前的课程笔记中有提到。.net

\epsilon 选择

因为咱们的数据有 偏斜类 的问题,因此须要用 查准率召回率 的结合 F_1 指数来评价模型,并选取 F_1 取最大时对应的 \epsilon 做为阈值。3d

协同过滤

假设咱们有 n_m 部影片,而且有 n_u 位用户对于其中一些影片的评价 y^{(i,j)}cdn

其中用户对有些影片没有打分,咱们但愿可以估计这些评分并推荐高分的内容给用户。用户 j 有没有给 i 电影评分记为 R(i,j)。假设每部电影具备特征向量 x^{(i)},对于用户 (1),咱们像 线性回归 中那样学习一个 h_\theta(x)=\theta_0^{(1)}+\theta_1^{(1)}x_1+\theta_2^{(1)}x_2+\dots+\theta_n^{(1)}x_n 来获取用户没有打分的评分。能够看出对于全部用户,评分表能够表示为电影特征矩阵和用户参数矩阵的乘积:

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}

预测的评分 Predicated = X \Theta^T,值得注意的是 X, \Theta 都是未知的,它们都是须要学习的变量。

代价函数

肯定了学习模型,下一步就是要设定 代价函数。此次的 代价函数 和以前基本相同,不一样的是在计算梯度的时候 X, \Theta 都须要求。下面直接给出 代价函数

\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}

经过简单的求导能够获得梯度公式:

\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)}

和以前的学习算法相同,咱们只须要实现 代价函数 的部分并计算梯度值,调用 minimize 函数来获取最优解就能够了。有了 X, \Theta 的值,咱们就可以获得预测的评分,经过评分高低就可以进行推荐啦。

课程总结

吴恩达机器学习课程做为对机器学习基本的了解仍是不错的。可是课程的内容比较老,像 深度学习强化学习 等内容都没有涉及,缺少几率方面的视角,工程方面也只是提了一点点,这些也正是从此须要继续学习的内容。 当驶向 机器学习之海 的时候,感受心中有一个方向很重要,即使它有多么的不切实际。

So~,第八周的内容就是这些了,谢谢你们耐心阅读。

相关文章
相关标签/搜索