0

我需要一个像Java 中的 Matlab 的 trimmean()这样的函数,我不想重新发明轮子。

有人知道为此准备好实现吗?(是的,我知道我很快就能做到,但如果有人已经为社区做出了贡献,我不会在这上面浪费时间。

我搜索了一些替代方案,但我只找到了部分和占位符实现(如thisthis)。

任何建议都值得赞赏,最好是我可以使用的 Maven 依赖项。

提前致谢!

4

2 回答 2

1

这也将起作用。

public static void trimmean(ArrayList<Double> numbers, final double percentage) 
{
    if (percentage < 0 || percentage > 1) {
        throw new IllegalArgumentException();
    }

    int size = numbers.size();
    int removeOutlierPer = (int) (size * percentage);
    int removeOutlierCount = removeOutlierPer / 2;
    removeOutlierCount = (int) Math.floor(removeOutlierCount);
    System.out.println("Remove outliers count :: " + removeOutlierCount);

    Collections.sort(numbers);
    System.out.println("Sorted list :: " + numbers);

    for (int i = 0; i < removeOutlierCount; i++) {
        numbers.remove(i);
        numbers.remove(numbers.size() - 1);
    }

    System.out.println("After outliers removal :: " + numbers);

    double sum = 0;

    for (int k = 0; k < numbers.size(); k++) {
        sum = sum + numbers.get(k);

    }

    System.out.println("Sum of outliers array :: " + sum);
    double avg = sum / numbers.size();
    DecimalFormat dec = new DecimalFormat("#0.000");
    System.out.println("After Trim Mean :: " + dec.format(avg));
}
于 2021-08-20T06:25:49.837 回答
0

只是为了档案,我找到了一个可以接受的解决方案Colt

public static void trimmean(final double[] arr, final int percent) {
    if ( percent < 0 || 100 < percent ) {
        throw new IllegalArgumentException("Unexpected value: " + percent);
    }

    if ( 0 == arr.length ) {
        return Double.NaN;
    }

    final int n = arr.length;
    final int k = Math.round(n * ( percent / 100.0 ) / 2.0); // Check overflow
    final DoubleArrayList list = new DoubleArrayList( arr );
    list.sort();
    
    return Descriptive.winsorizedMean( list, Descriptive.mean( list ), k, k );
}
于 2012-04-17T09:16:28.073 回答