算法思想
假设有如下图片,如何去除其中的离群点呢?
1,遍历集合{W}中的所有点,以某点p为圆心,以 r 为半径画圆,统计圆内有多少个点(不包含点p自身),假设有N个。
2,若N小于某个阈值T,则将该点p从集合{W}中剔除;若若N大于等于阈值T,则保留该点p。
3,重复执行步骤1、2。
时间复杂度为O(N^2)。
显然,比如若取半径 r 为3倍的BC点间距,取阈值T=1时,A点作为离群点被剔除;取阈值T=2时,BC两点也被剔除;取阈值T=3时,DEF三点也被剔除;
点与点之间的间距一般采用欧氏距离即可,也可以根据实际需要灵活变通,比如曼哈顿城市距离等等。
代码实现
/*
* @作用:根据最近邻思想。若某点在指定半径内的邻点数量大于某阈值,则认为此点正常,否则作为离群点剔除.
* @ allPts:所有的点(候选点,可能含有需要被排除的伪点).
* @ selectedPts:最终挑选出来的点.
* @ radius: 半径.
* @ minNeighborCnt:邻居的数量阈值.
*/