我需要一个像Java 中的 Matlab 的 trimmean()这样的函数,我不想重新发明轮子。
有人知道为此准备好实现吗?(是的,我知道我很快就能做到,但如果有人已经为社区做出了贡献,我不会在这上面浪费时间。)
我搜索了一些替代方案,但我只找到了部分和占位符实现(如this或this)。
任何建议都值得赞赏,最好是我可以使用的 Maven 依赖项。
提前致谢!
这也将起作用。
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));
}
只是为了档案,我找到了一个可以接受的解决方案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 );
}