机器学习之旅(九)
吴恩达教授的机器学习课程的第九周相关内容:
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 ) 值:
我们选择一个,将作为我们的判定边界,当时预测数据为正常数据,否则则为异常。
小结:用高斯分布来推出异常检测算法。
1.4、开发和评价一个异常检测系统
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 y 的值来告诉我
们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数
据:
6000 台正常引擎的数据作为训练集
2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
2000 台正常引擎和 10 台异常引擎的数据作为测试集
具体的评价方法如下:
- 根据测试集数据,我们估计特征的平均值和方差并构建 p(x)函数
- 对交叉检验集,我们尝试使用不同的值作为阀值,并预测数据是否异常,根据 F1值或者查准率与查全率的比例来选择
- 选出后,针对测试集进行预测,计算异常检验系统的 F1 值,或者查准率与查全率之比
小结:异常检测系统的大体实现步骤。
1.5、异常检测与监督学习对比
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对
比有助于选择采用监督学习还是异常检测:
小结:异常检测与监督学习的异同。
1.6、选择特征
对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征:
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够
工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x=log(x+c),其中 c
为非负常数; 或者 , c 为 0-1 之间的一个分数,等方法。
误差分析:
一个常见的问题是一些异常的数据可能也会有较高的 p(x)值,因而被算法认为是正常的。
这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察
能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征
后获得的新算法能够帮助我们更好地进行异常检测。
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征。
小结:将一些特征组合,形成更好的新特征。增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
1.7、多元高斯分布
图中是两个相关特征, 洋红色的线(根据 ε 的不同其范围可大可小) 是一般的高斯分布模型获得的判定边界,很明显绿色的 x 所代表的数据点很可能是异常值,但是其 p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,我们计算 p(x) 的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算p(x) 。
我们首先计算所有特征的平均值,然后再计算协方差矩阵:
下面我们来看看协方差矩阵是如何影响模型的:
上图是 5 个不同的模型,从左往右依次分析:
- 是一个一般的高斯分布模型
- 通过协方差矩阵,令特征 1 拥有较小的偏差,同时保持特征 2 的偏差
- 通过协方差矩阵,令特征 2 拥有较大的偏差,同时保持特征 1 的偏差
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
原高斯分布模型和多元高斯分布模型的比较:
小结:多元高斯分布。
1.8、使用多元高斯分布进行异常检测
多元高斯分布和多元正态分布:
我有一组样本 是一个 n 维向量,我想我的样本来自一个多元高斯分布。
我如何尝试估计我的参数 和以及标准公式?
让我们以这种方法而只需将其插入到异常检测算法。那么,我们如何把所有这一切共同开发一个异常检测算法?
首先,我们把我们的训练集,和我们的拟合模型,我们计算 p(x),要知道,设定 描述的一样。
如图, 该分布在*最多,越到外面的圈的范围越小。
其中:协方差矩阵其中:协方差矩阵为:
原始模型和多元高斯分布比较如图:
小结:多元高斯分布在异常检测算法上的应用。
2、推荐系统
2.1、问题形式化
讲推荐系统有两个原因:第一、 仅仅因为它是机器学习中的一个重要的应用。讨论推荐系统地第二个原因是:通过推荐系统,我们将领略一小部分特征学习的思想。
假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分
小结:推荐系统的浅显介绍。
2.2、基于内容的推荐系统
在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。
在我们的例子中,我们可以假设每部电影都有两个特征,如 x1代表电影的浪漫程度, x2代表电影的动作程度。
则每部电影都有一个特征向量,如 x(1) 是第一部电影的特征向量为[0.9 0]。
下面我们要基于这些特征来构建一个推荐系统算法。 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如是第一个用户的模型的参数。 于是,我们有:
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
小结:在知道相关特征向量时基于内容的推荐。
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.5lambda(sum(sum(Theta.2))+sum(sum(X.2)));
X_grad = X_grad + lambda * X;
Theta_grad = Theta_grad + lambda * Theta;