明天就要开组会了,天天在办公室划水都不知道讲啥。。。
今天开始异常检测的学习,同样代码比较简单一点
异常检测的原理就是假设样本的个特征值都呈高斯分布,选择分布较离散的样本的作为异常值。这里主要注意的是通过交叉验证对阈值的选择和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');
最后结果如下:
后面第二个多维数据的练习就懒得做了,如果正式做的记得要平均分配好交叉训练集和验证集。