我有一个双值列表,我想在其中找到异常值。weka 是否提供任何算法来解决问题?
3 回答
在这篇工作论文(第一个链接)中,您拥有使用 WEKA 的异常值算法的全文实现。
此外,使用的算法是
S 在论文“<a href="http://www.geo.upm.es/postgrado/CarlosLopez/papers/AlgorithmsForSpatialOutlierDetection.pdf" rel="noreferrer">A Unified Approach to Detecting Spatial Outliers”中提出. Shekhar 等人。该论文展示了几个空间异常值检测测试。例如,变异函数云显示与邻域关系相关的数据点。对于每对位置,绘制位置处属性值之间的绝对差的平方根与位置之间的欧几里得距离。在表现出强空间依赖性的数据集中,在表现出强空间依赖性的数据集中,属性差异的方差会随着位置之间距离的增加而增加。彼此靠近但具有较大属性差异的位置可能表示空间异常值,即使在非空间检查数据集时两个位置的值可能看起来是合理的。其他异常值检测算法的一个主要缺点导致一些真正的空间异常值被忽略并且一些错误的空间异常值被识别。
对于异常值检测算法,您可以查看此SIAM 教程。
您可能需要计算的是列表中数字的平均值和标准差。手动编写这些代码应该相对简单,请参阅http://www.mathsisfun.com/data/standard-deviation-formulas.html。
您还可以使用Apache Math Commons 库进行计算。
package test;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
double[] data = { 20, 65, 72, 75, 77, 78, 80, 81, 82, 83 };
double[] data1 = null;
double[] data2 = null;
if (data.length % 2 == 0) {
data1 = Arrays.copyOfRange(data, 0, data.length / 2);
data2 = Arrays.copyOfRange(data, data.length / 2, data.length);
} else {
data1 = Arrays.copyOfRange(data, 0, data.length / 2);
data2 = Arrays.copyOfRange(data, data.length / 2 + 1, data.length);
}
double q1 = getMedian(data1);
double q3 = getMedian(data2);
double iqr = q3 - q1;
double lowerFence = q1 - 1.5 * iqr;
double upperFence = q3 + 1.5 * iqr;
System.out.println("Lower Fence: " + lowerFence);
System.out.println("Upper Fence: " + upperFence);
}
public static double getMedian(double[] data) {
if (data.length % 2 == 0)
return (data[data.length / 2] + data[data.length / 2 - 1]) / 2;
else
return data[data.length / 2];
}
}