斯坦福大学《Machine Learning》第9周学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/junjun150013652/article/details/80922369

Anomaly Detection异常检测

Density Estimation密度估计

Problem Motivation问题动机

异常检测(Anomaly detection)问题 是机器学习算法 的一个常见应用 这种算法的一个有趣之处在于 它虽然主要用于 非监督学习问题 但从某些角度看 它又类似于一些监督学习问题 

什么是异常检测呢? 飞机引擎制造商 生产的飞机引擎 从生产线上流出时 需要进行 QA (质量控制测试) 而作为这个测试的一部分 你测量了飞机引擎的一些特征变量 比如 你可能测量了 引擎运转时产生的热量 或者引擎的振动等等 这样 你就有了一个数据集 从x(1)到x(m) 如果你生产了m个引擎的话 也许你会将这些数据绘制成图表 看起来就是这个样子 这里的每个点 每个叉 都是你的无标签数据 

这样 异常检测问题可以定义为 对于生产线上流出的一个新的飞机引擎  有特征变量x-test 那么这个新的飞机引擎是否有某种异常 如果你的新引擎 对应的点落在中间的那个绿叉 我们可以直接认为它是正常的 如果你的新飞机引擎 对应的点落在外面那个绿叉  那么我们可以认为这是一个异常 需要进一步检测 

异常检测问题 :我们有一些数据 从x(1)到x(m) 我们通常假定这m个样本 都是正常的 或者说都不是异常的 然后我们需要一个算法来告诉我们 一个新的样本数据x-test是否是异常 我们要采取的方法是 给定训练集 给定无标签的训练集 我们将 对数据建一个模型p(x) 也就是说 我们将对 x的分布概率建模 其中x是这些特征变量 建立了x的概率模型之后 对于新的x-test 如果概率p 低于阈值ε 那么就将其标记为异常 

给定图中的 这个训练集 如果你建立了一个模型p(x) 将会认为 在中心区域的这些点 有很大的概率值 而稍微远离中心区域的点概率会小一些 

Gaussian Distribution高斯分布

高斯分布 也称为正态分布 

如果x的概率分布 服从高斯分布 其中均值为μ 方差为σ平方 σ也叫标准差 波浪号 读作 服从...分布 为了表示高斯分布 大写字母N表示 Normal (正态)  因为高斯分布就是正态分布 其中μ控制曲线的中心位置 σ控制曲线的宽度 因为这是 一个概率分布 因此曲线下的面积 这些阴影区域的积分 一定是1 所以当σ越小的时候,曲线的峰值就越高

让我们来看参数估计问题 

这里有一个数据集 其中有m个样本 从x(1)到x(m) 假设他们都是实数 我们猜测这些样本 来自一个高斯分布的总体 那么我们就要确定参数 μ和σ平方 图中写下 对μ和σ平方 进行参数估计的 标准公式 这里的估计 实际就是对μ和σ平方 的极大似然估计 

Algorithm算法

应用高斯分布开发异常检测算法 

假如说我们有一个无标签的训练集 共有 m 个训练样本 并且 这里的训练集里的每一个样本 都是 n 维的特征 

现在 我们解决异常检测的方法是 我们要从数据中 建立一个 p(x) 概率模型 如图所示 这个式子 实际上对应于 一个从 x1 到 xn 上的独立的假设 但实际中 无论这些特征 是否独立 这个算法的效果也还不错 

估计 p(x) 的分布问题 被称为 密度估计问题 把所有的结合起来 下面便是我们的异常检测算法 

第一步 选择特征 即找出我们认为的具有比较反常样本 的特征 xi 

第二步 给出一组  m 个无标签数据构成的训练集 计算出 期望 μ1 到 μn 以及方差值 (σ1)^2 到 (σn)^2 

最后 当给出一个新样本时 判断新样本是否出现异常  就要计算出 p(x) 的值来 如果这个概率值很小 那么你就将这一项标注为异常 

 

以上是一个异常检测的实例 假如说我们有一系列数据 如左上角绘制的数据集 并估算出两个特征值x1和x2的高斯分布公式 左下角绘制 p(x) 的图像 也就是 这两个概率值的乘积  然后我们选取选ε (后面会讲到这个值如何选取)的值为0.02,那么当给出一个新样本时,我们就能计算出p(x(1)test) 来判断它是否异常了

Building an Anomaly Detection System建立一个异常检测系统

Developing and Evaluating an Anomaly Detection System开发和评估一个异常检测系统

为了更快地 开发出一个 异常检测系统 那么最好能找到某种 评价异常检测系统的方法 

为了做到这一点 为了能评价一个 异常检测系统 我们先假定已有了一些带标签的数据 所以 我们要考虑的 异常检测问题 是一个非监督问题 使用的是无标签数据 但如果你有一些 带标签的数据 能够指明哪些是异常样本 哪些是非异常样本 那么这就是我们要找的 能够评价异常检测算法的标准方法 

以 飞机发动机的为例 现在有了一些 带标签数据 也就是有异常的飞机引擎的样本 同时我们还有 一些无异常的样本 我用 y=0 来表示那些 完全没有问题的样本 用 y=1 来代表那些异常样本 

那么异常检测算法的推导和评价方法 我们先只考虑 训练样本 我们将它们看成无标签的 训练集 所以他们都是无异常样本的集合 (可能有一些异常的 也被分到你的训练集里 这也没关系) 接下来我们要 定义交叉验证集 和测试集 通过这两个集合我们将得到异常检测算法 具体来说 对交叉验证集和测试集 我们将假设 我们的交叉验证集 和测试集中 有一些异常的样本  

假如说 我们有10000制造的无异常的引擎 我们假设 这10000个样本中 大多数都是好的 没有问题的引擎 我们把这10000个正常的引擎 放6000个到 无标签的训练集中 我叫它“无标签训练集” 但其实所有这些样本 实际上都对应 y=0的情况 我们要用它们 来拟合p(x) 也就是p(x1;μ1,σ1^2)的平方 一直到p(xn; μn, σn^2) 参数是μn σn的平方 因此我们就是要用这 6000个样本 来估计参数  μ1, σ1 一直到  μn, σn 这就是训练集中的好的样本 或者说大多数好的样本 然后 我们把这10000个正常的引擎的剩下的4000 各放2000个到 交叉验证集和测试集中  同时 我们还有20个 异常的发动机样本 同样也把它们进行一个分割  放10个到验证集中 剩下10个 放入测试集中 坏的引擎样本 我们只把它们放到 交叉验证集和测试集中 

异常检测算法的 推导和评估方法如下 首先 我们使用训练样本 来拟合模型p(x) 然后假定你的 异常检测算法作出了预测 所以 给出交叉验证集 或者测试集 给出某个测试样本x 假设这个算法对 p(x)<ε 的情况作出的 预测为 y=1 而p(x)≥ε时 算法作出的预测为 y=0  

怎样评估一个异常检测算法呢? 第一步是 取出所有的无标签的训练样本 拟合出模型p(x) 也就是用所有这些 高斯模型拟合出参数 接下来 对交叉验证集 和测试集 我们要让异常检测算法 来对y的值 作出一个预测  所以现在 我们可以把 异常检测算法想成是 对交叉验证集 和测试集中的y 进行一个预测 

那么用什么评价度量好呢? 因为数据是非常偏斜的 因为y=0是更加常见的 因此分类准确度不是一个好的度量法 取而代之的  我们应该算出 真阳性、假阳性、 假阴性和真阴性的比率 来作为评价度量值 我们也可以算出查准率和召回率 或者算出 F1-积分 通过一个很简单的数字 来总结出查准和召回的大小 通过这些方法 你就可以评价你的异常检测算法 在交叉验证和测试集样本中的表现 

当我们需要作出决定时 比如要包括哪些特征 或者说要确定参数ε取多大合适 我们就可以 不断地用交叉验证集 来评价这个算法 然后决定我们应该 用哪些特征 怎样选择ε 

Anomaly Detection vs. Supervised Learning异常检测与监督学习

我们有了这些带标签的数据  其中一些我们知道是异常的 另外一些是正常的 那我们为什么我们不 直接用监督学习的方法呢? 为什么不直接用 逻辑回归或者 神经网络的方法 来直接学习这些带标签的数据 从而给出预测 y=1 或 y=0 呢? 

这张幻灯片展示的就是 什么时候应该用异常检测 什么时候用监督学习更加有效 两种情况的一个比较 

下面的情况考虑使用异常检测算法 

1.有大量的负样本 也就是正常样本  很少的正样本

2.对异常检测算法 通常会有很多种不同的 异常的种类 比如飞机引擎的例子 很多部件坏了都可能导致引擎故障 你只有很少的 一组正样本 那么一个学习算法 要从你这么少的正样本中 学习出这个异常 是比较困难的 而且有一天新增一种全新的引擎故障原因 那么这更加说明 你应该对负样本 进行建模 学出 p(x) 模型(高斯模型) 而不是很费力地 对正样本进行建模 

下面的情况考虑使用监督学习算法 

1.我们的正负样本数量 都应该比较大

以下是监督学习和异常检测的举例

Choosing What features to Use特征值选择

在我们的异常检测算法中 我们做的事情之一就是 使用这种正态(高斯)分布来对特征向量建模 

首先画出这些数据 可以用直方图表示数据 以确保 这些数据在 应用我的异常检测算法前 看起来像高斯分布 当然即使你的数据并不是高斯分布 它也基本上可以良好地运行  画柱状图的方法是 Octave 里面的 hist 命令( 默认情况下 直方图有十个柱)  如果我画出来的 直方图是左下角这样的话 可以对数据进行一些不同的转换(例如对数的转换) 来确保这些数据 看起来更像高斯分布 虽然通常来说你不这么做 算法也会运行地很好 但如果你使用一些转换方法 使你的数据更像高斯分布的话 你的算法会工作得更好 除了取对数变换之外 还有别的一些方法也可以用 如上图所示

如何得到 异常检测算法的特征变量? 

我们先完整地训练出 一个学习算法 然后在一组交叉验证集上运行算法 然后找出那些预测出错的样本 然后再看看 我们能否找到一些其他的特征变量 来帮助学习算法 让它在那些交叉验证时 判断出错的样本中表现更好 

举例:

在异常检测中 我们希望 p(x) 的值 对正常样本来说是比较大的 而对异常样本来说 值是很小的 

假如我的数据拟合出的高斯分布是这样的 假如我的异常样本中 x 的取值为2.5(绿色) 因此 我画出我的异常样本 它看起来就像被淹没在 一堆正常样本中似的 它的概率值很大  而我们的算法 没能把这个样本判断为异常 

现在如果说这代表 飞机引擎的制造或者别的什么 那么我会做的是 我会看看我的训练样本 然后看看到底是 哪一个具体的飞机引擎出错了 看看通过这个样本 能不能启发我 想出一个新的特征 x2 来帮助算法区别出 不好的样本 和我剩下的正确的样本 也就是那些红色的叉叉 如上图所示 绿色叉叉的那个样本的x1正常,而x2异常,我们需要找出这个特征变量x2 

通常来说 我想到的选择特征变量的方法是 选那些取值 既不会特别特别大 也不会特别特别小的 那些特征变量  比如说 数据中心中 监控计算机的例子 你有很多台电脑  也许上千 或者上万台 我们想要知道的是 是不是有哪一台机器 运作不正常了 这里给出了几种可选的特征变量 包括占用内存 磁盘每秒访问次数 CPU负载 网络流量 现在假如说 我怀疑某个出错的情况 我认为 在我的数据中 我的CPU负载和网络流量 应该互为线性关系 假如说 我怀疑其中一个出错的情形 是我的计算机在执行一个任务时 进入了一个死循环 因此被卡住了  因此CPU负载升高 在这种情况下 要检测出异常 我可以新建一个特征  x5 等于 CPU负载 除以网络流量 

你可以通过不同特征变量的组合 捕捉到对应的不寻常现象 

Multivariate Gaussian Distribution(Optimal)多元高斯分布

Multivariate Gaussian Distribution多元高斯分布

假设我们的没有标签的数据看起来像这张图一样 使用数据中心的监控机的例子 我的两个特征变量 x1 是 CPU 的负载和 x2 是内存使用量 把 x1 和 x2 当做高斯分布来建模 如右图所示 这就是异常检测算法的特征变量建模


现在假如说 在测试集中 有一个这样的样本 (绿色叉) 它离这里看到的任何数据都很远 应该被当做 一个异常数据 所以我的 好的样本的数据 看起来 CPU 负载 和内存使用量 是彼此线性增长的关系 
对于异常检测算法会怎么做 如图右所示 绿色叉的x1和x2都属于比较正常的范畴  所以 异常检测算法 不会将这个点标记为异常 它不能察觉到  这个蓝色椭圆所表示的 好样本概率高的范围 而只能看到图左红色圆的范围

为了解决这个问题 我们使用多元高斯分布或者多元正态分布

所以这是我们要做的 我们有特征 x 它是 n 维实数 我们不要把 p(x1) p(x2) 分开 而要建立一个 p(x) 整体的模型 就是一次性建立 p(x) 的模型 

多元高斯分布的参数 包括向量 µ 和一个 n×n 的协方差矩阵Σ det(Sigma) 是Octave中计算行列式的方法 

我们来看一个二维的例子 我们来看一个二维的例子 如果我有 n 等于 2 两个特征 x1 和 x2 以下是µ 和Σ 发生变化时对高斯分布的影响


多元高斯分布的 一个很棒的事情是 你可以用它给数据的 相关性建立模型 通过改变协方差矩阵 非对角线上的元素 

这就是多元高斯分布 所能描述的概率分布是什么样的 它最重要的优势 就是它可以让你 能够描述当两个特征变量之间 可能存在正相关 或者是负相关关系的情况 

Anomaly Detection Using the Multivariate Gaussian Distribution利用多元高斯分布进行异常检测

使用多元高斯分布 来开发另一种异常检测算法 

关于参数拟合问题 如果我有一组样本 从 x(1) 到 x(m) 这里的每一个样本 都是 n 维向量 而且我认为它们服从多元高斯分布 我应该怎么估计参数 µ 和 Σ 呢? 估计它们的 标准公式如上图所示 用训练集计算出 µ 和 Σ 以后 当拿到一个测试样本 我们就可以用上面的多元高斯分布的公式计算出p(x)了 然后和 ε比较来判断是否异常

多元高斯分布模型  和原来的模型 之间的关系 

p(x) 原来的模型是 p(x1) 乘以 p(x2) 一直乘到 p(xn) 的积 

事实上 原来的模型 对应于一种多元高斯分布 它的等高线 全部都是沿着轴向的 也就是沿着 x1 x2 轴 如上一节的前三个图 原来的模型实际上 和多元高斯分布一样 只是有一个约束 这个约束是 协方差矩阵 Σ 必须满足 非对角线的元素为0 

具体来说 协方差矩阵 Σ 主对角线上的值分别为 σ1^2  σ2^2 一直到 σn^2 其他元素全是0 将这个值代入到多元高斯分布公式 你回发现两个模型其实是完全一样的

所以你应该在什么时候用哪个模型呢? 

原来的模型 可能使用得更加频繁 而多元高斯模型 则没有那么常用 但是它有能够捕捉 特征变量之间的相关性的优势 但是原来的模型也有一些其他的很重要的优势 其中一个很大的优势就是 它的运算量更小  它更适用于 n 的值非常大 就是说特征变量很多的情况 最后 对于原来的模型 事实上 即使你的训练集相对较小 它也能运行得还可以 而对于多元高斯模型 这个算法的数学性质要求 你的 m 必须大于 n 所以样本的数量要大于特征变量的数量 (原因是,Σ会是个奇异矩阵,不可逆  一般我们要求m 大于等于十倍的 n )

所以在实际应用当中 原来的模型比较常用 如果你觉得 你需要捕捉特征变量之间的相关性 一般就会手动增加额外特征变量 来捕捉特定的不正常的值的组合 但是在m 很大 n 不太大的情况下 那么多元高斯模型 是值得考虑得 或许可以运行得更好 还可以帮你省去 捕捉额外特征变量 所花费的时间 

Σ不可逆的时候 可能因为有可能有很多线性相关的冗余的特征变量

Recommender Systems推荐系统

Predicting Movie Ratings预测电影评级

Problem Formulation问题表述

推荐系统的问题表述 

我这里有5部电影 《爱到最后》 《浪漫永远》 《小爱犬》 《无尽狂飙》 还有 《剑与空手道》 我们有4位用户 名叫 Alice Bob Carol 和 Dave 首字母为A B C和D 我们称他们用户1 2 3和4 

Alice 她非常喜欢 《爱到最后》 把它评为5颗星 她还喜欢 《浪漫永远》 也把它评为5颗星 她没看过 《小爱犬》 也就没评分 这样我们没有这个评分数据 Alice 很不喜欢 《无尽狂飙》 或是 《剑与空手道》 ...

用 n_u 表示用户数量  n_m 将用来表示电影数量  r(i, j) 表示用户 i 是否给电影 j 评过分  y(i, j) 它表示用户 j 给电影 i 的评分 

推荐系统问题就是 给定这些 r(i, j) 和 y(i, j) 数值 然后浏览全部数据 关注所有没有电影评分的地方 并试图预测 这些带问号的地方 应该是什么数值 

Content Based Recommendations基于内容的建议

我们假设每部电影有两种特征  分别用x1和x2表示 x1表示这部电影 属于爱情电影的程度 x2表示这部电影 是动作电影的程度 

为了进行预测 我们可以把对 每个观众打分的预测 当成一个独立的线性回归问题 具体来说 比如每一个用户j 我们都学习出一个参数θ(j) 
我们来看一个具体的例子吧 现在假如我们想预测 Alice对电影 《小爱犬》 是如何评价的 那么这部电影 有一个参数向量x(3)等于[1 0.99 0] 其中1是截距项 然后是两个特征 0.99和0 
假如说 对于这个例子 你已经知道Alice的 参数向量θ(1)  它的值等于 [0 5 0] 因此 我们对 这一项的预测 就等于θ(1)的转置 乘以x(3) 因此我对这个值的预测 其结果将为4.95 

我们用r(i,j)=1 来表示用户j 对电影i进行了评分 y(i,j)则表示用户j 对电影i的评分值 
我们用m(j) 来表示用户j评价过的电影数 

我们的优化目标如上

J是我们要最小化的最优化目标函数 接下来 为了 求出这个最小值 如果你想要用 梯度下降来更新的话 你可能会用到这些式子 

你也可以用在 更高级的优化算法 比如聚类下降 或者L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno Algorithm) 或者别的方法 来最小化代价函数J 

Collaborative Filtering协作过滤

Collaborative Filtering协作过滤

一种构建推荐系统的方法 叫做协同过滤(collaborative filtering) 这种算法能够 自行学习所要使用的特征 

我们建一个数据集 假定对每一部电影 我们找一些人来 告诉我们这部电影 浪漫指数是多少 动作指数是多少 这样做难度很大 也很花费时间 而且通常 你还会希望得到除这两个特征之外的其他指数 那么你怎样才能得到这些特征呢? 

所以 让我们转移一下问题 假如我们 有某一个数据集 我们并不知道特征的值是多少 所以比如我们得到一些 关于电影的数据 不同用户对电影的评分 我们并不知道每部电影 到底有多少浪漫的成分 也不知道到底每部电影里面动作成分是多少 于是我把所有的问题都打上问号 

现在我们稍稍改变一下这个假设 假设我们采访了每一位用户 而且每一位用户都告诉我们 他们是否喜欢 爱情电影 以及 他们是否喜欢动作电影 这样 Alice 就有了对应的参数 θ(1) Bob 的是 θ(2) Carol 的是 θ(3) Dave 的是 θ(4) 我们还有这样的假设 假如 Alice 告诉我们 她十分喜欢 爱情电影 于是 Alice 的特征 x1 对应的值就是5 假设 Alice 告诉我们 她非常不喜欢动作电影 于是这一个特征就是0  于是 我们假定 某种程度上 我们就可以着眼于用户 看看任意的用户 j 对应的 θ(j) 是怎样的 这样就明确地告诉了我们 他们对不同题材电影的喜欢程度 

如果我们能够从用户那里 得到这些 θ 参考值 那么我们理论上就能 推测出每部电影的  x1 以及 x2 的值 

我们来看个例子 假如我们看电影1 《爱到最后》 假设我们不知道 这部电影的主要内容 所以也不要在意电影的名字 我们知道的就是 Alice 喜欢这部电影 Bob 喜欢这部电影 Carol 和 Dave 不喜欢它 我们可以推断 这可能是一部爱情片 而不太可能是动作片 

特征向量 x(1) 应该是什么 才能让 θ(1) 的转置 乘以x(1) 约等于5 也就是 Alice 的评分值 然后 θ(2) 的转置乘以 x(1) 也近似于5  而 θ(3) 的转置 乘以 x(1) 约等于0 这是 Carol 的评分 而 θ(4) 的转置乘以 x(1) 也约等于0 由此可知 x(1) 应该用 [1 1.0 0.0] 这个向量表示 第一个1 是截距项 这样才能得出 Alice Bob Carol 和 Dave 四个人 对电影评分的结果 

由此及之 我们可以 继续列举 试着 弄明白 其他电影的合理特征 

让我们将这一学习问题标准化到任意特征 x(i) 假设我们的用户 告诉了我们的偏好 就是说用户们 已经给我们提供了 θ(1) 到 θ(nu) 的值 而我们想知道 电影 i 的 特征向量 x(i) 我们能做的 是列出以下的最优化的问题 

这就是我们 如何从一部特定的电影中 学习到特征的方法 

但我们要做的是 学习出所有电影的 所有特征 所以我现在要做的是 在此加上另外的一个求和  然后最小化整个这个目标函数 针对所有的电影 这样你就会得到图下的最优化的问题 如果你将这个最小化 就应该能得到所有电影的 一系列合理的特征 

如果我们能知道 θ 就能学习到 x 如果我们知道 x 也会学出 θ 来 那么 随机猜 θ 的值 学习出 不同电影的特征 给出已有的一些电影的 原始特征 然后我们可以继续 迭代 不停重复 优化θ x θ x θ 这非常有效 如果你 这样做的话 你的算法将会收敛到 一组合理的电影的特征 以及一组对合理的 对不同用户参数的估计 这就是基本的协同过滤算法 

这实际并不是最后 我们将要使用的算法 下一节我们将改进这个算法 让其在计算时更为高效 

协同过滤算法指的是 当你执行这个算法时 你通过一大堆用户 得到的数据 这些用户实际上在高效地 进行了协同合作 来得到每个人 对电影的评分值 只要用户对某几部电影进行评分 每个用户就都在帮助算法 更好的学习出特征 这样 通过自己 对几部电影评分之后 我就能帮助系统更好的学习到特征 这些特征可以 被系统运用 为其他人 做出更准确的电影预测 协同的另一层意思 是说每位用户 都在为了大家的利益 学习出更好的特征 这就是协同过滤 

Collaborative Filtering Algorithm协作过滤算法

首先 如果给你几个特征表示电影 我们可以使用这些资料去获得用户的参数数据 第二 如果给你用户的参数数据 你可以使用这些资料去获得电影的特征 我们将会使用这些概念 并且将它们合并成 协同过滤算法 (Collaborative Filtering Algorithm) 

我们之前做过的事情 其中之一是 假如你有了电影的特征 你就可以解出 这个最小化问题 为你的用户找到参数 θ 然后我们也 知道了 如果你拥有参数 θ 你也可以用该参数 通过解一个最小化问题 去计算出特征 x 所以你可以做的事 是不停地重复这些计算 或许是随机地初始化这些参数 然后解出 θ 解出 x 解出 θ 解出 x 但实际上呢 存在一个更有效率的算法 让我们不再需要再这样不停地 计算 x 和 θ 而是能够将 x 和 θ 同时计算出来 

上图的下面就是这种算法 我们所要做的 是将这两个优化目标函数 给合为一个 所以我要来定义 这个新的优化目标函数 J 它依然是一个代价函数 是我特征 x 和参数 θ 的函数 它其实就是上面那两个优化目标函数 但我将它们给合在一起 (注意:这里没有截距项x0和θ0)

首先我们将会把 x 和 θ 初始为小的随机值 
接下来 用 梯度下降 或者某些其他的高级优化算法 把这个代价函数最小化 
梯度下降法 的更新式如上 这公式里  x 和 θ 都是n 维 
最后 给你一个用户 如果这个用户 具有一些参数 θ 以及给你一部电影 带有已知的特征 x 我们可以预测 这部电影会被 θ 转置乘以 x 给出怎样的评分 

Low Rank Matrix Factorization低秩矩阵分解

Vectorization: Low Rank Matrix Factorization矢量化:低秩矩阵分解

举例:一位用户最近看上一件产品 有没有其它相关的产品 你可以推荐给他 

我将要做的是 实现一种选择的方法 写出协同过滤算法的预测情况 

首先 将这些用户的电影评分 进行分组并存到 一个矩阵Y中 y(i, j) 是用户 j 对电影 i 给出的评分 其值等于 θ(j)转置乘x(i) 

为了能有 一个向量化的方法以计算 这些矩阵的预测值 你可以计算大写X矩阵乘 大写Θ矩阵的转置 这样就给出了一种向量化的方法 以计算这个矩阵 

我们用的这个协同过滤 算法还有另外一个名字 我们现在正在使用的这个算法 也被称作是 低秩矩阵分解 

当你 学习某个特征 其实并不需要知道 这些不同的特征将会变成什么样的  但如果你运行这个算法 这些特征将会完美地捕获 实践中 这些特征是很难以可视化的 也很难计算出这些特征到底是什么 通常来说 特征学习对于 捕获哪些是 电影的重要或显著的属性 是很有意义的 也正是这样才有了你对某些电影的喜欢或不喜欢 

现在你已经 对特征参数向量进行了学习 那么我们就会有一个很方便的方法 来度量两部电影之间的相似性 例如说 电影i有一个特征向量x(i) 你是否能找到一部 不同的电影 j 保证两部电影的特征向量 之间的距离x(i)和x(j)很小 那就能 很有力地表明 电影 i 和电影 j 在某种程度上有相似 至少在某种意义上 某些人喜欢电影 i 或许更有可能也对电影 j 感兴趣 

Implementational Detail: Mean Normalization实现细节:均值标准化

为了了解均值归一化这个想法的动机 我们考虑这样一个例子 有一个用户没有给任何电影评分 之前我们有四个用户 Alice Bob Carol 和 Dave 我现在加上了第五个用户 Eve 她没有给任何电影评分 假如说 n 等于2  我们要学习出 一个参数向量θ(5) 这是一个二维向量 

这个优化目标的 第一项 用户 Eve 没给任何电影打过分 所以r(i,j)=0  所以第一项 完全不影响 θ(5) 的值 影响 θ(5) 值的唯一一项 是第三项 这就是说 我们想选一个向量 θ(5) 使得λ/2[(θ(5)_1)^2+(θ(5)_2)^2]最小 那么你最终得到的 就会是 θ(5)=[0;0]  因此我们得到的结果是 我们会预测 Eve 给所有电影的评分 都是零星 但是这个结果看起来并没什么用 这样 我们还是没有任何好方法 来把电影推荐给她 

均值归一化的想法可以让我们解决这个问题 下面介绍它是如果工作的 

和以前一样 我们把所有评分放到矩阵Y里 然后实现均值归一化 计算 每个电影所得评分的均值 存在一个向量µ中  然后把所有的电影评分减去平均评分 这些问号没变 所以每个电影 在新矩阵Y中的 平均评分都是0 然后对新的Y使用协同过滤算法 来学习 我的参数 θ(j) 和特征变量 x(i) 

当我想要做 电影评分预测时  对用户j对电影i的评分 我要预测它为 θ(j) 转置乘以 x(i) (其中 x 和 θ 都是 均值归一化的数据集中学习出的参数 )但是因为我已经对数据集 减去了均值 所以为了 给电影i预测评分 我要把这个均值加回来 

如果 Eve 没给任何电影评分 我们就对这个新用户 Eve 一无所知 我们要做的就是预测 她对每个电影的评分 就是这些电影所得的平均评分 

最后再补充一下  如果有些电影是没有评分的 这个情形类似于 有的用户没有给任何电影评分的情况 你可以对不同的 进行归一化 使得它们的均值为0  

参考资料

https://www.coursera.org/learn/machine-learning/

猜你喜欢

转载自blog.csdn.net/junjun150013652/article/details/80922369