吴恩达机器学习(二十一)—— ex8:Anomaly Detection and Recommender Systems (MATLAB + Python)

吴恩达机器学习系列内容的学习目录 → \rightarrow 吴恩达机器学习系列内容汇总

  本次练习对应的基础知识总结 → \rightarrow 异常检测推荐系统

  本次练习对应的文档说明和提供的MATLAB代码 → \rightarrow 提取码:7g7b

  本次练习对应的完整代码实现(MATLAB + Python版本) → \rightarrow Github链接

一、异常检测

  在本练习中,我们将实现异常检测算法以检测服务器计算机中的异常行为。该特征为每个服务器响应的吞吐量(mb/s)和延迟(ms)。当我们的服务器正在运行时,我们收集了 m = 307 m = 307 m=307个它们行为方式的样本,因此有一个未标记的数据集 { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } \{x^{(1)},x^{(2)},...,x^{(m)}\} { x(1),x(2),...,x(m)}。我们认为绝大多数的样本是“正常的”(非异常的),即服务器正常运行,但在该数据集中也可能有一些服务器异常运行。
  我们将使用高斯模型来检测数据集中的异常样本。我们将首先从2D数据集上开始,允许可视化算法正在进行的内容。在该数据集上,我们将拟合高斯分布,然后找到具有非常低的概率的值,可以被视为异常。之后,我们将应用异常检测算法于具有很多维度的较大数据集。我们将在这部分练习中使用ex8.m。
  ex8.m的第一部分将可视化数据集,如图1所示。

在这里插入图片描述

图1 第一个数据集

1.1 高斯分布

  要进行异常检测,我们将首先需要使模型去拟合数据的分布。
  给定训练集 { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } \{x^{(1)},x^{(2)},...,x^{(m)}\} { x(1),x(2),...,x(m)}(其中 x ( i ) ∈ R n x^{(i)}∈R^{n} x(i)Rn),我们想要估计每个特征 x ( i ) x^{(i)} x(i)的高斯分布。对于每个特征 i = 1 , . . . , n i = 1,...,n i=1,...,n,我们需要找到参数 μ i μ_{i} μi σ i 2 \sigma_{i}^{2} σi2拟合第 i i i维的数据 { x i ( 1 ) , x i ( 2 ) , . . . , x i ( m ) } \{x_{i}^{(1)},x_{i}^{(2)},...,x_{i}^{(m)}\} { xi(1),xi(2),...,xi(m)}(每个样本的第 i i i个维度)。
  高斯分布由下式给出 p ( x ; μ , σ 2 ) = 1 2 π σ e ( − ( x − μ ) 2 2 σ 2 ) p(x; \mu , \sigma ^{2})=\frac{1}{\sqrt{2\pi \sigma }}e^{(-\frac{(x-\mu )^{2}}{2\sigma ^{2}})} p(x;μ,σ2)=2πσ 1e(2σ2(xμ)2)其中, μ μ μ是均值, σ 2 \sigma ^{2} σ2是方差。

1.2 估计高斯参数

  我们可以使用以下等式估计第 i i i个特征的参数 ( μ i , σ i 2 ) (μ_{i},\sigma_{i} ^{2}) (μi,σi2)。要计算均值,我们将使用 μ i = 1 m ∑ j = 1 m x i ( j ) \mu_{i} =\frac{1}{m}\sum ^{m}_{j=1}x_{i}^{(j)} μi=m1j=1mxi(j)对于方差。我们使用 σ i 2 = 1 m ∑ j = 1 m ( x i ( j ) − μ i ) 2 \sigma_{i} ^{2}=\frac{1}{m}\sum ^{m}_{j=1}(x_{i} ^{(j)}-\mu_{i} )^{2} σi2=m1j=1m(xi(j)μi)2  我们的任务是完成 estimateGaussian.m中的代码。此函数输入数据矩阵 X X X,应该输出一个保存所有 n n n个特征均值的n维向量 μ \mu μ,以及输出另一个保存所有特征方差的n维向量 σ 2 \sigma^{2} σ2。我们可以在每个特征和每个训练样本中使用for循环实现这一点(向量化实现可能更有效)。要注意的是,在MATLAB中,当计算 σ i 2 \sigma_{i}^{2} σi2时,var函数(默认情况下)使用 1 m − 1 \frac{1}{m-1} m11,而不是 1 m \frac{1}{m} m1
  完成estimateGaussian.m需要填写以下代码:

mu = mean(X)';
%var normalizes V by N-1 if N>1,where N is the sample size. 
% sigma2 = var(X) * (n -1) / n;
for i = 1:n
    X(:,i) = X(:,i) - mu(i);
end
sigma2 = 1 / m * sum(X .^2)';

  完成estimateGaussian.m的代码后,ex8.m的下一部分将可视化拟合高斯分布的轮廓。我们可以得到图2。从图中可以看到大多数样本在具有最高概率的区域中,而异常样本在具有较低概率的区域中。

在这里插入图片描述

图2 拟合数据分布的高斯分布轮廓

1.3 选择阈值 ε ε ε

  现在我们已经估计了高斯参数,可以研究在该分布的情况下哪个样本具有非常高的概率,哪个样本具有非常低的概率。低概率样本更可能是我们数据集中的异常点。一种确定哪个样本是异常的方法是基于交叉验证集来选择阈值。在这一部分的练习中,我们将使用F1分数在交叉验证集上实现算法,以选择阈值 ε ε ε
  我们现在应该完成selectThreshold.m中的代码。为此,我们将使用交叉验证集 { ( x c v ( 1 ) , y c v ( 1 ) ) \{(x_{cv}^{(1)},y_{cv}^{(1)}) { (xcv(1),ycv(1)),…, ( x c v ( m c v ) , y c v ( m c v ) ) } (x_{cv}^{(m_{cv})},y_{cv}^{(m_{cv})})\} (xcv(mcv),ycv(mcv))},其中标签 y = 1 y = 1 y=1对应于异常样本, y = 0 y = 0 y=0对应于正常样本。对于每个交叉验证样本,我们将计算 p ( x c v ( i ) ) p(x_{cv}^{(i)}) p(xcv(i))。所有这些概率 p ( x c v ( 1 ) ) p(x_{cv}^{(1)}) p(xcv(1)),…, p ( x c v ( m c v ) ) p(x_{cv}^{(m_{cv})}) p(xcv(mcv))的向量在向量pval中并传递给selectThreshold.m,相应的标签 y c v ( 1 ) y_{cv}^{(1)} ycv(1),…, y c v ( m c v ) y_{cv}^{(m_{cv})} yc<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值