机器学习之旅(九)

吴恩达教授的机器学习课程的第九周相关内容:

1、异常检测(Anomaly Detection)

1.1、问题的动机

异常检测(Anomaly detection)问题。这是机器学习算法的一个常见应用。 这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。
机器学习之旅(九)上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该
组数据的可能性就越低。
这种方法称为密度估计,表达如下:
机器学习之旅(九)
模型 p (x ) 为我们其属于一组数据的可能性, 通过上式 检测非正常用户。
小结:异常检测主要是为了在大部分是正常样本的情况下检测出异常样本。

1.2、高斯分布

高斯分布,也称为正态分布。通常如果我们认为变量 x 符合高斯分布 x N ~ ( , )   2 则其概率密度函数为:
机器学习之旅(九)机器学习中对于方差我们通常只除以 m 而非统计学中的(m-1)。
小结:高斯分布的概率密度公式及均值方差。

1.3、算法

异常检测算法:
机器学习之旅(九)一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p(x) :
机器学习之旅(九)下面的三维图表表示的是密度估计函数, z 轴为根据两个特征的值所估计 p (x ) 值:
机器学习之旅(九)我们选择一个ϵ\epsilon,将p(x)=ϵp\left ( x \right )=\epsilon作为我们的判定边界,当p(x)>ϵp\left ( x \right )> \epsilon时预测数据为正常数据,否则则为异常。
小结:用高斯分布来推出异常检测算法。

1.4、开发和评价一个异常检测系统

异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 y 的值来告诉我
们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数
据:
6000 台正常引擎的数据作为训练集
2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
2000 台正常引擎和 10 台异常引擎的数据作为测试集
具体的评价方法如下:

  1. 根据测试集数据,我们估计特征的平均值和方差并构建 p(x)函数
  2. 对交叉检验集,我们尝试使用不同的ϵ\epsilon值作为阀值,并预测数据是否异常,根据 F1值或者查准率与查全率的比例来选择
  3. 选出ϵ\epsilon后,针对测试集进行预测,计算异常检验系统的 F1 值,或者查准率与查全率之比
    小结:异常检测系统的大体实现步骤。

1.5、异常检测与监督学习对比

之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对
比有助于选择采用监督学习还是异常检测:

机器学习之旅(九)
小结:异常检测与监督学习的异同。

1.6、选择特征

对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征:
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够
工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x=log(x+c),其中 c
为非负常数; 或者x=xcx=x^{c} , c 为 0-1 之间的一个分数,等方法。
机器学习之旅(九)误差分析:
一个常见的问题是一些异常的数据可能也会有较高的 p(x)值,因而被算法认为是正常的。
这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察
能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征
后获得的新算法能够帮助我们更好地进行异常检测。
机器学习之旅(九)我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征。
小结:将一些特征组合,形成更好的新特征。增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。

1.7、多元高斯分布

图中是两个相关特征, 洋红色的线(根据 ε 的不同其范围可大可小) 是一般的高斯分布模型获得的判定边界,很明显绿色的 x 所代表的数据点很可能是异常值,但是其 p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
机器学习之旅(九)在一般的高斯分布模型中,我们计算 p(x) 的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算p(x) 。
我们首先计算所有特征的平均值,然后再计算协方差矩阵:
机器学习之旅(九)下面我们来看看协方差矩阵是如何影响模型的:
机器学习之旅(九)上图是 5 个不同的模型,从左往右依次分析:

  1. 是一个一般的高斯分布模型
  2. 通过协方差矩阵,令特征 1 拥有较小的偏差,同时保持特征 2 的偏差
  3. 通过协方差矩阵,令特征 2 拥有较大的偏差,同时保持特征 1 的偏差
  4. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
  5. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
    原高斯分布模型和多元高斯分布模型的比较:
    机器学习之旅(九)机器学习之旅(九)小结:多元高斯分布。

1.8、使用多元高斯分布进行异常检测

多元高斯分布和多元正态分布:
机器学习之旅(九)我有一组样本 是一个 n 维向量,我想我的样本来自一个多元高斯分布。
我如何尝试估计我的参数 μ\mu\sum以及标准公式?
机器学习之旅(九)让我们以这种方法而只需将其插入到异常检测算法。那么,我们如何把所有这一切共同开发一个异常检测算法?
机器学习之旅(九)首先,我们把我们的训练集,和我们的拟合模型,我们计算 p(x),要知道,设定 μ\mu描述的一样\sum
机器学习之旅(九)
如图, 该分布在*最多,越到外面的圈的范围越小。
其中:协方差矩阵其中:协方差矩阵\sum为:
机器学习之旅(九)原始模型和多元高斯分布比较如图:
机器学习之旅(九)
小结:多元高斯分布在异常检测算法上的应用。

2、推荐系统

2.1、问题形式化

讲推荐系统有两个原因:第一、 仅仅因为它是机器学习中的一个重要的应用。讨论推荐系统地第二个原因是:通过推荐系统,我们将领略一小部分特征学习的思想。
假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分
机器学习之旅(九)
机器学习之旅(九)
小结:推荐系统的浅显介绍。

2.2、基于内容的推荐系统

在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。
在我们的例子中,我们可以假设每部电影都有两个特征,如 x1代表电影的浪漫程度, x2代表电影的动作程度。
机器学习之旅(九)
则每部电影都有一个特征向量,如 x(1) 是第一部电影的特征向量为[0.9 0]。
下面我们要基于这些特征来构建一个推荐系统算法。 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如θ(1)\theta ^{\left ( 1 \right )}是第一个用户的模型的参数。 于是,我们有:
机器学习之旅(九)
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
机器学习之旅(九)
小结:在知道相关特征向量时基于内容的推荐。

2.3、协同过滤

在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
机器学习之旅(九)但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。
机器学习之旅(九)
小结:没有用户和电影的相关特征时,使用协同过滤。

2.4、协同过滤算法

机器学习之旅(九)
小结:协同过滤算法的优化目标。

2.5、向量化:低秩矩阵分解

在上几节视频中,我们谈到了协同过滤算法,本节视频中我将会讲到有关该算法的向量化实现,以及说说有关该算法你可以做的其他事情。
我们有五部电影,以及四位用户,那么 这个矩阵 Y 就是一个 5 行 4 列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
机器学习之旅(九)推出评分:
机器学习之旅(九)找到相关影片:
机器学习之旅(九)
小结:协同过滤算法的向量实现及评分和相关内容的推出。

2.6、推行工作上的细节:均值归一化

让我们来看下面的用户评分数据:
机器学习之旅(九)如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为 Eve 推荐电影呢?
我们首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有 用户对该电影评分的平均值:
机器学习之旅(九)然后我们利用这个新的 Y 矩阵来训练算法。
如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测
机器学习之旅(九)
对于 Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。
小结:利用均值归一化为新用户进行相关预测。

3、第九周编程题

1、estimateGaussian.m
mu=mean(X)’;
sigma2=var(X)’*((m-1)/m);
2、selectThreshold.m

cvPredictions = (pval < epsilon);
tp=sum((cvPredictions == 1) &(yval == 1));
fp=sum((cvPredictions == 1) &(yval == 0));
fn=sum((cvPredictions == 0) &(yval == 1));
tn=sum((cvPredictions == 0) &(yval == 0));
prec=tp/(tp+fp);
rec=tp/(tp+fn);
F1=2precrec/(prec+rec);
3、cofiCostFunc.m

J = 1/2 * sum(sum(((X * Theta’ - Y).^2).*(R == 1)));
X_grad=((X * Theta’ - Y).*R)*Theta ;
Theta_grad=((X * Theta’ - Y).R)'X;
J = J + 0.5
lambda
(sum(sum(Theta.2))+sum(sum(X.2)));
X_grad = X_grad + lambda * X;
Theta_grad = Theta_grad + lambda * Theta;