当前位置: 首页 > 知识库问答 >
问题:

标准偏差不是可传递的?

丁晋
2023-03-14

考虑到要比较的对象(< code>Word)有两个定义为< code>int的属性,我试图实现一个比较器。

我想从这两个值中得到均方差(可能更多,但现在是2),并根据哪个对象具有最低的值对我的列表进行排序。但显然,它说我的方法不是基于这个问题的传递的(我假设,因为我有同样的异常)。但我看不到如何,这里它将只比较均方差的结果。

我是否对数学感到困惑,没有考虑一个特殊的例子,指出这个方法不是传递的,或者我做错了什么?

对列表排序:

for(Map.Entry<String,List<Word>> entry: list.entrySet()){
 Collections.sort(entry.getValue(), Collections.reverseOrder(new SimpleComparator()));
 ...
}

比较器类别:

import java.util.Comparator;

public class SimpleComparator implements Comparator<Word> {
    @Override
    public int compare(Word word1, Word word2) {
        int b1,b2,f1,f2;
        double average1,average2, result1,result2;
        b1 = word1.getAttr1();
        b2 = word2.getAttr1();
        f1 = word1.getAttr2();
        f2 = word2.getAttr2();
        average1 = (b1-f1)/2;
        average2 = (b2-f2)/2;
        result1 = Math.sqrt((Math.pow(b1-average1,2)+Math.pow(f1-average1,2))/2);
        result2 = Math.sqrt((Math.pow(b2-average2,2)+Math.pow(f2-average2,2))/2);
        return (int)(result1 - result2);
    }
}

共有2个答案

贲言
2023-03-14

您的比较(x1,x2)方法违反了以下条件:

实现者必须确保 compare(x, y)==0 意味着 sgn(compare(x, z))==sgn(compare(y, z)) 对于所有 z。

这是您的方法的反例,其中比较(w1, w2)=0

public static void main(String[] args) {

 Word w1=new Word(2,5);
 Word w2=new Word(1,5);
 Word w3=new Word(2,4);

    System.out.println(Math.signum(getStandardDeviation(w1, w3))==Math.signum(getStandardDeviation(w2, w3)));
}

public static double getStandardDeviation(Word word1,Word word2)
{
    int b1,b2,f1,f2;
    double average1,average2, result1,result2;
    b1 = word1.getAttr1();
    b2 = word2.getAttr1();
    f1 = word1.getAttr2();
    f2 = word2.getAttr2();
    average1 = (b1-f1)/2;
    average2 = (b2-f2)/2;
    result1 = Math.sqrt((Math.pow(b1-average1,2)+Math.pow(f1-average1,2))/2);
    result2 = Math.sqrt((Math.pow(b2-average2,2)+Math.pow(f2-average2,2))/2);
    return (int)(result1 - result2);
}

}

孙岳
2023-03-14

您应该使用< code > math . signum(result 1-result 2),如果结果为负,它将生成-1;如果结果为零,它将生成0;如果结果为正,它将生成1。确保将结果保存为double——将double转换为int时发生的截断会产生不准确的结果。

相反,请将您的html" target="_blank">返回语句替换为:

return (int) Math.signum( result1 - result2 );

在这种情况下,<code>0.9-0.3</code>的结果将是<code>0.6</code>,其符号将是<code>1。但是,如果我们将双精度<code>0.6</code>转换为int,结果将是<code>0</code>,而不是<code>1</code>,这表明它们相等。然而,我们知道这不是事实。其原因是,当将数字数据类型转换为精度较低的类型时,该值不会被舍入-它只会丢失精度,这意味着小数点后的值会下降。

请参见Comparator.comare(T,T)的JavaDocs

实现者必须确保所有的x和y都有sgns()) == -sgns(比较(y, x))。

 类似资料:
  • 我对标准差的计算有点执着,如果你能在下面的两个问题上给我一些帮助,那就太好了。 代码 问题1:我如何计算这个的标准误差(平均值的标准偏差)? 代码 问题2:如何计算累积标准偏差? 非常感谢!!(很抱歉数据格式错误!)

  • 返回数组数组的标准偏差。 使用 Array.reduce() 来计算均值,方差已经值的方差之和,方差的值,然后确定标准偏差。 您可以省略第二个参数来获取样本标准偏差,或将其设置为 true 以获得总体标准偏差。 const standardDeviation = (arr, usePopulation = false) => { const mean = arr.reduce((acc, va

  • 问题内容: 我想澄清一下,我正在寻找一种使用Streams计算标准偏差的方法(我目前有一种工作方法可以计算并返回SD,但不使用Streams)。 我正在使用的数据集紧密匹配,如Link中所示。如该链接所示,能够对我的数据进行分组并获得平均值,但无法弄清楚如何获取SD。 码 我还检查了DoubleSummaryStatistics上的链接,但似乎对SD没有帮助。 问题答案: 您可以将自定义收集器用于

  • 我有一个集合列表和每个集合的一些基本统计数据(项目数、最小值、最大值、平均值、标准差)。我想计算所有集合的相同统计数据。计算总计数、最小最大值和平均值很容易,但我不确定如何计算总标准偏差。 数据如下所示: 同时生成所有集合的统计信息:

  • 问题内容: 使用Python,假设我正在运行已知数量的项目,并且能够计时处理每个项目要花费的时间,以及运行所花费的总时间以及到目前为止所处理项目的数量。我目前正在计算飞行中的平均值,但是如果说单个项目花费的时间特别长(几秒钟而不是几毫秒),则可能会导致偏差。 我想展示一个运行中的标准偏差。如何在不保存每个记录的情况下执行此操作? 问题答案: 我使用的是Welford方法,它给出的结果更准确。该链接