我有一个双值列表,我想在其中找到异常值。 weka是否提供任何算法来解决问题?
答案 0 :(得分:5)
In this work paper(第一个链接),您可以使用WEKA实现异常算法的全文。
此外,使用的算法是
在S. Shekhar等人的论文“A Unified Approach to Detecting Spatial Outliers”中提出。论文显示 几个空间离群检测试验。例如,a variogram-cloud显示邻域相关的数据点 关系。对于每对位置,平方根 位置与属性值之间的绝对差异 绘制了位置之间的欧几里德距离。在数据集中 表现出强烈的空间依赖性,属性的变化 差异数据集表现出强烈的空间依赖性 属性差异的方差将随着增加而增加 位置之间的距离。彼此靠近的地方, 但是如果属性差异很大,则可能表示空间 异常值,即使两个位置的值可能看起来都是 在非空间检查数据集时是合理的。一个主要的 其他异常值检测算法的缺点导致一些真实性 空间异常值被忽略,一些虚假的空间异常值被忽略 识别。
对于异常值检测算法,您可以查看此SIAM tutorial。
答案 1 :(得分:1)
您可能需要计算的是列表中数字的均值和标准差。手动编码应该相对简单,参考http://www.mathsisfun.com/data/standard-deviation-formulas.html。
您也可以使用Apache Math Commons library进行计算。
答案 2 :(得分:0)
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];
}
}