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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找一组双精度值中的异常值相关的知识,希望对你有一定的参考价值。

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

答案

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

此外,使用的算法是

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

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

另一答案

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

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

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

以上是关于查找一组双精度值中的异常值的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中查找三个值中的最大值

确定一个值是不是在 Java 中的一组值中的最快方法是啥?

剔除“异常值”的一般原则是什么?

C++ 在 Map 中的类的一组值中插入一个值

在 VBA 中的字典值中查找最大值/最小值

替换查找表值中的列