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

问题描述 投票:2回答:3

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

java statistics weka outliers
3个回答
5
投票

In this work paper(第一个链接),您可以使用WEKA全文实现异常算法。

此外,使用的算法是

在S. Shekhar等人的文章“A Unified Approach to Detecting Spatial Outliers”中提出。本文介绍了几种空间离群检测试验。例如,变差函数云显示由邻域关系相关的数据点。对于每对位置,绘制位置处的属性值与位置之间的欧几里德距离之间的绝对差的平方根。在表现出强空间依赖性的数据集中,属性差异数据集中的方差表现出强烈的空间依赖性,属性差异的方差将随着位置之间的距离的增加而增加。彼此接近但具有较大属性差异的位置可能表示空间异常值,即使在非空间检查数据集时两个位置的值可能看起来合理。其他异常值检测算法的一个主要缺点导致忽略一些真正的空间异常值,并且识别出一些错误的空间异常值。

对于异常值检测算法,您可以查看此SIAM tutorial


1
投票

您可能需要计算的是列表中数字的均值和标准差。手动编码应该相对简单,参考http://www.mathsisfun.com/data/standard-deviation-formulas.html

您也可以使用Apache Math Commons library进行计算。


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];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.