本算法参照《数据挖掘概念与技术》第三版,算法中有需要人工设定的参数:r距离阈值和f分数阈值。距离阈值以目标对象为圆心,半径为r的范围;分数阈值f的范围(0,1),从伪代码中可以看到,它的本质还是计数统计。因此,基于距离的离群点检测其实是基于密度的聚类算法DBSCAN的简化版。其实现伪代码如下(原书截图):
以下为算法的Matlab实现程序:
clc;
clear;
%读取数据文件,生成点矩阵
fileID = fopen('D:\matlabFile\Outlier Detect\DBO.txt');
DS=textscan(fileID,'%f %f');
fclose(fileID);
%将cell类型转换为矩阵类型,这里只假设原数据为二维属性,且是二维的坐标点
D=cat(2,DS{1},DS{2});
%获得数据矩阵的行数
Row=size(D,1);
%设定距离门限
r=3;
%设定分数(fraction)门限,范围 0<f<1
f=0.5;
%离群点保存
Outlier=[];
for i=1:Row
count=0;
for j=1:Row
if i==j
continue;
end
%计算两点之间的距离
dist=sqrt((D(i,1)-D(j,1))^2+(D(i,2)-D(j,2))^2);
%如果小于距离门限,计数器加一
if dist<=r
count=count+1;
end
end
%如果小于分数门限,则为离群点
if count<f*Row
Outlier(size(Outlier,1)+1,:)=D(i,:);
end
end
%显示数据点及离群点
scatter(D(:,1),D(:,2),'filled');
hold on
scatter(Outlier(:,1),Outlier(:,2),'filled','r');
以下为实验数据,选用了二维坐标数据,请下载保存为DBO.txt文件
15.1 8.2
16.3 7.8
14.2 9.0
13.6 6.9
17.3 9.4
15.6 8.8
16.9 7.4
15.9 8
16.4 7.3
9.4 3.9
10.3 6.7
14.9 13.1
仿真结果如下:
版权声明:本文为博主原创文章,未经博主允许不得转载。