主要讲异常检测 和 推荐系统
第十五章
给定数据集 x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据 xtest 是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性p(x)。
欺诈检测:
X(i) = 用户的第 i 个活动特征
模型 p(x) =ε我们其属于一组数据的可能性
通过 p(x)<ε检测非正常用户
一个例子是检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量,CPU 的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。
高斯分布
我们可以利用已有的数据来预测总体中的 μ 和 σ2 的计算方法如下:
注:机器学习中对于方差我们通常只除以 m 而非统计学中的(m-1)。
异常检测算法
对于给定的数据集x(1),x(2),...,x(m) ,我们要针对每一个特征计算μ 和 σ2 的估计值。
一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p(x):
当 p(x)<ε 时,为异常
我们选择一个 ε,将 p(x)=ε 作为我们的判定边界,当 p(x)>ε 时预测数据为正常数据,否则则为异常。
开发和评价一个异常检测系统
异常检测算法是一个非监督学习算法(也有监督学习的部分),意味着我们无法根据结果变量 y 的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系 统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训 练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有 10000 台正常引擎的数据,有 20台异常引擎的数据。我们这样分配数据:
6000 台正常引擎的数据作为训练集
2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
2000 台正常引擎和 10 台异常引擎的数据作为测试集
测评方法如下:
1. 根据测试集数据,我们估计特征的平均值和方差并构建 p(x)函数
2. 对交叉检验集,我们尝试使用不同的 ε 值作为阀值,并预测数据是否异常,根据 F1值或者查准率与查全率的比例来选择 ε
3. 选出 ε 后,针对测试集进行预测,计算异常检验系统的F1 值,或者查准率与查全率之比
异常检测与监督学习的对比
选择特征
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x = log(x+c),其中 c 为非负常数; 或者 x=xc,c 为 0-1 之间的一个分数,等方法。
误差分析
一个常见的问题是一些异常的数据可能也会有较高的 p(x)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用 CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。
多元高斯分布
有时候一个高斯分布无法判断出误差,如上图,而多元高斯分布则会解决这种问题。
在一般的高斯分布模型中,我们计算 p(x)的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算 p(x)。我们首先计算所有特征的平均值,然后再计算协方差矩阵:
注:其中 μ 是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。最后我们计算多元高斯分布的 p(x):
(想到了概率统计中的最大似然估计)
|Σ|是定矩阵,在 Octave中用 det(sigma)计算
Σ1 是逆矩阵,会影响模型
以上各个图分别展示了Σ1对模型的不同方面的影响。
1. 是一个一般的高斯分布模型
2. 通过协方差矩阵,令特征 1拥有较小的偏差,同时保持特征 2 的偏差
3. 通过协方差矩阵,令特征 2拥有较大的偏差,同时保持特征 1 的偏差
4. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关
性
5. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关
多元高斯分布和高斯分布的关系: 高斯分布是多元分布的一个子集,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型了。
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。
第十六章 推荐系统 (such as movies )
前三部电影是爱情片,后两部则是动作片,我们可以看出 Alice 和 Bob 似乎更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。
下面引入一些标记:
nu 代表用户的数量
nm 代表电影的数量
r(i,j)如果用户 i 给电影 j 评过分则 r(i,j)=1
y(i,j)代表用户 i 给电影 j 的评分
mj 代表用户 j 评过分的电影的总数
我们要基于这些特征来构建一个推荐系统算法。 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如θ(1)是第一个用户的模型的参数。于是,我们有:
θ(j)用户 j 的参数向量
x(i)电影 i 的特征向量
对于用户 j 和电影 i,我们预测评分为:(θ(j))Tx(i)
代价函数
针对用户 j,该线性回归模型的代价为预测误差的平方和,加上归一化项:
其中 i:r(i,j)表示我们只计算那些用户 j评过分的电影。在一般的线性回归模型中,误差项和归一项应该都是乘以 1/2m,在这里我们将 m 去掉。并且我们不对方差项θ0 进行归一
化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数
求和:如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为
协同过滤
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。我们的优化目标便改为同时针对 x 和θ 进行。
注:在协同过滤从算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。
协同过滤算法使用步骤如下:
1. 初始x(1),x(2),...,x(nm),θ(1),θ(2),...,θ(nu)为一些随机小值
2. 使用梯度下降算法最小化代价函数
3. 在训练完算法后,我们预测(θ(j))Tx(i)为用户 j 给电影 i 的评分
注:在协同过滤从算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。
协同过滤算法使用步骤如下:
1. 初始x(1),x(2),...,x(nm),θ(1),θ(2),...,θ(nu)为一些随机小值
2. 使用梯度下降算法最小化代价函数
3. 在训练完算法后,我们预测(θ(j))Tx(i)为用户 j 给电影 i 的评分
低矢矩阵分解
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。例如,如果一位用户正在观看电影 x(i),我们可以寻找另一部电影x(j),依据两部电影的特征向量之间的距离||x(i)-x(j)||的大小。
均值归一化处理
如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为 Eve 推荐电影呢?
我们首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
然后我们利用这个新的 Y 矩阵来训练算法。 如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测(θ(j))T(x(i))+μi 对于 Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。