查找一组双精度值中的异常值

时间:2013-05-10 10:46:23

标签: java statistics weka outliers

我有一个双值列表,我想在其中找到异常值。 weka是否提供任何算法来解决问题?

3 个答案:

答案 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];
    }
}