吴恩达老师机器学习笔记异常检测(一)

明天就要开组会了,天天在办公室划水都不知道讲啥。。。

今天开始异常检测的学习,同样代码比较简单一点

异常检测的原理就是假设样本的个特征值都呈高斯分布,选择分布较离散的样本的作为异常值。这里主要注意的是通过交叉验证对阈值的选择和F1score的应用。

原始数据:
在这里插入图片描述
代码如下:

load('ex8data1.mat');
[m n]=size(X);
X_mean=mean(X);
theta=(sum((X-X_mean).^2))./m; % 用无标签样本建立高斯分布模型
P=exp(-(Xval-X_mean).^2./(theta.*2).^2).*(1./sqrt(theta.*pi.*2));
P=prod(P,2);
F1_best=0; % F1score越大,模型越稳健
 
for e=0:0.001:0.3 % 通过对有标签样本交叉验证选取合适的阈值
    P(:,2)=(P(:,1)<e); 
    c=P(:,2)+yval;
    tp=sum(c==2); % 计算异常样本正确分类的数量
    c=P(:,2)-yval;
    fp=sum(c==1); % 计算把正确样本划分为错误样本的数量
    fn=sum(c==-1); % 计算把错误样本划分为正确样本的数量
    prec=tp/(tp+fp); % 计算精确度
    rec=tp/(tp+fn); % 计算召回率
    F1=2*prec*rec/(prec+rec); % 计算F1score
    if F1_best<F1
        F1_best=F1;
        e_best=e;
    end
end
P(:,2)=(P(:,1)<e_best);
scatter(Xval(:,1),Xval(:,2),8,P(:,2),'filled');

最后结果如下:
在这里插入图片描述
后面第二个多维数据的练习就懒得做了,如果正式做的记得要平均分配好交叉训练集和验证集。

Optional:如果数据并不是很明显的呈高斯分布,可以通过log(x)或者x^0.3之类的函数来让数据呈明显高斯分布。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_21567935/article/details/83623556