`
frank-liu
  • 浏览: 1684073 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Kendall tau distance理解与分析

 
阅读更多

简介

    Kendall tau distance这个概念在平时如果不是专门接触到相关工作的话会显得比较陌生。它主要是一个用来比较两个向量之间相似度的概念。在一些数据分析和搜索引擎的结果相似度ranking里会有很多的应用。这里针对它的定义和计算做一个总结。

 

概念分析

    Kendall tau distance这个概念似乎比较少见,在网上搜索也没找到太多详细的介绍。总的来说,它是用来量化的衡量几组向量之间的偏差的。这样粗看起来还是很难理解。怎么来定义一个偏差呢?我们总该有一个标准吧,比如说多少个元素不一样,以及它们不一样的位置如何等等。

    举例来说,比如说我们有这样的一个数组[1, 2, 3, 4, 5]那么对于它来说,它就是一个标准顺序排列的一个序列。这个序列里元素不重复而且所有元素都是递增的。现在有另外一个数组,比如说[2, 3, 1, 5, 4]。对于它来说,它肯定和前面的数组不一样,也就是说有偏差。该怎么来量化这种偏差呢?

    我们看,对于前面这个标准序列,它里面每个元素都比排它后面到元素小。而对于后面这个序列来说,它却不是这样,比如说第一个元素是2,它后面有元素1比它小,对于3, 5也是。这样,从数学的概念来说,它存在有3个逆序。所以说,逆序数量就相当于是它和基准序列的偏差。实际上Kendall tau distance虽然是描述两个序列之间的偏差。它也就是一个序列相当于一个基准序列的逆序数。

    关于逆序计算和分析可以参照我前面的一篇文章

 

实现

    现在,我们再进一步细化前面讨论的过程。首先进行比较计算的两个序列可以通过定义两个数组来实现。为了使得问题简化,可以定义两个int数组。因为要计算它们的差异,所以它们每个元素都是唯一的而且两个数组长度一样。

    在前面讨论的地方,计算Kendall tau distance是一个序列针对基准序列来计算逆序数。但是要进行比较的两个序列并不一定是我们前面提到的理想情况。它们可能没有一个是基准序列。这个时候该怎么办呢?

   我们先来看这样一个数组a=[3, 4, 0, 1, 2]。由于这种序列的限制,它里面每个元素和下标都是唯一的。假设a[i]里有每个唯一的元素,那么对应的下标i就和这个元素形成一个唯一的映射。因此也可以说这是一种描述一个元素和它位置一一映射的关系:

     如果我们对map数据结构比较熟悉的话,会发现这相当于是一个特殊的map。通过它们的关系,既可以从某个元素得到它的索引位置,也可以从它的索引位置得到该元素。在前面数组里,从某个索引得到某个元素的时间很快,就是一个常量,可是如果要从某个元素得到它的索引,则比较复杂,需要去查询整个数组。这样,可以利用该数组的特性,建立一个反向映射,用一个数组来保存它们的关系。概括起来就是

ainv[a[i]] = i 。对于数组a[i]来说,i相当于是key,通过它可以常量时间内得到a[i]的值,而对于ainv[]来说,a[i]是key,通过它也可以常量时间内得到对应的索引i。

    这样,通过ainv[], a[]这两个数组可以建立起一个数组元素和索引的双向映射。

    以上面数组为例,我们构造的ainv[]数组如下:

     在回到前面的问题中。我们这里建立了一个数组元素和索引的关系。如果对于两个不同的数组,而且它们两个都不是基准数组的话,就需要将它们做一个转换才行。比如说,我们将一个数组转换成基准数组。当然,既然一个要转换的话,另外一个也需要对应的转换。这个转换该怎么做呢?

    在上述的a[]和ainv[]数组中,如果我们从头开始以i = 0开始去遍历a[i],然后返回ainv[a[i]],得到的正好就是一个基准序列[0, 1, 2, 3, 4],这个序列表示a[]数组里所有元素的索引。如果我们取对应另外一个数组的元素,比如b[]来作为映射的key,则它返回的结果相当于经过ainv[]的一个转换运算。我们的映射关系为

   bnew[i] = ainv[b[i]]; 一个对应的示例如下图:

    最终得出的数组bnew[]相当于数组b针对数组a 索引映射确定的索引顺序,求这个序列的逆序则就可以确定它们之间最终的Kendall tau distance。

    于是,我们最终得到如下的代码:

 

public static long distance(int[] a, int[] b) {
    if(a.length != b.length)
        throw new IllegalArgumentException("Array dimensions disagree");
    int n = a.length;
    int[] ainv = new int[n];
    for(int i = 0; i < n; i++)
        ainv[a[i]] = i;

    int[] bnew = new int[n];
    for(int i = 0; i < n; i++)
        bnew[i] = ainv[b[i]];

    return Inversions.count(bnew);
}

 

 

总结

    Kendall tau distance的问题比较绕。首先一个问题就是要确定一个衡量两个数组差别的方式。这里是用一个数组相当于一个基准数组的逆序数来衡量它们的差别。逆序数越大说明差别越大。最麻烦的问题就是当两个数组都不是基准数组的时候要将一个转换成基准数组,而这个时候另外一个数组也要做对应的变化。该怎么来变化呢?通过一个数组的元素-->索引映射数组建立一个映射关系。这个关系如果应用到该数组上的时候相当于返回了一个基准数组。它相当于应用了一个数学函数。而将其应用到另外一个比较的数组时,相当于对应的数组也和该数组做了一个转换成基准数组的运算。这样得到的这个数组再来求逆序数就可以了。

 

参考材料

http://algs4.cs.princeton.edu/25applications/KendallTau.java.html

http://functionspace.com/topic/4675/Kendall-Tau-distance

http://shmilyaw-hotmail-com.iteye.com/blog/1769047

Algorithms

  • 大小: 10.8 KB
  • 大小: 10.6 KB
  • 大小: 18.9 KB
分享到:
评论

相关推荐

    ktau.rar_Kendall matlab_kendall tau

    To calculate Kendall s Tau for a time serie.

    Kendall's tau 算法最大值分析

    通过对Kendall's tau 距离最大值的计算和分析,我们可以更好地理解算法在不同情况下的表现,从而选择出在一致性上最优秀的排序策略。这在优化算法设计、提升系统性能,以及解决实际的排序问题中都具有重要的指导意义...

    Mann-Kendall Tau-b with Sen's Method(增强型):非参数趋势检验,包括使用 Mann-Kendall Tau 技术的 Sen 斜率方法-matlab开发

    Mann-Kendall Tau非参数函数计算表示等距数据的趋势强度和方向的系数。 虽然您不需要统计工具箱来计算 Tau,但您确实需要它来测试显着性。 此函数将计算Tau-a和Tau-b,重要性(以及各种支持统计数据),以及非参数...

    MATLAB泰森斜率+MK趋势分析函数代码

    MATLAB泰森斜率+MK趋势分析函数代码 Mann-Kendall Tau (aka Tau-b) with Sen's Method (enhanced)

    mann_kendall趋势分析

    **Mann-Kendall趋势分析**是一种非参数统计方法,常用于检测时间序列中的趋势变化。这种方法不依赖于数据的特定分布,因此适用于各种类型的数据,包括非正态分布、存在异常值或缺失值的情况。在环境科学、气候变化...

    Kendall's tau相似程度指标

    两个序列,例如S1 = {a, b, c, d}、 S2 = {a, c, b, d},如何度量它们的相似...由同样元素组成,只是元素的排列顺序不同的两个序列,如果其顺序完全一致,则Kendall's tau值为1,如果完全反序其Kendall's tau值为0。

    Mann-kendall趋势分析的Matlab程序.rar

    在数据分析和环境科学中,Mann-Kendall趋势测试是一种广泛应用的方法,用于检测时间序列数据中的趋势。这个Matlab程序正是为了实现这一统计分析而设计的。Matlab是一款强大的编程和计算环境,它提供了丰富的数学函数...

    趋势分析软件kendall

    趋势分析软件Kendall是一款专用于水质趋势分析的工具,其核心功能是帮助科研人员、环保工作者以及水处理行业的专业人士对水质数据进行深入研究,识别并理解水体中各项指标随时间的变化规律。Kendall软件的名字来源于...

    数据_Mann-Kendall秩次相关检验法_秩和检验_相关分析_秩次_趋势_

    在数据分析和环境科学等领域,Mann-Kendall秩次相关检验法是一种常用的趋势检测和突变分析工具。这种方法不依赖于数据的分布类型,因此在处理非正态分布或者存在缺失值的数据时尤为适用。本篇文章将深入探讨Mann-...

    序列相关数据斜率的季节性 Kendall 检验:使用 tau-a、b 的季节性趋势和间隔的季节性斜率,说明序列相关性。-matlab开发

    具有和不具有序列依赖性的数据的季节性 Kendall 趋势检验。 Tau-b 季节性:考虑关系(和多次观察,除了数据在子函数中预处理,每个给定季节的多次观察使用中位数进行平均)。 Tau-a 季节性:不将每个季节的多次...

    Delphi Mann-Kendall 趋势和突变检验分析

    Delphi Mann-Kendall趋势和突变检验分析是一种在统计学和环境科学中广泛应用的方法,用于检测时间序列数据中的趋势和突变点。这个工具利用Delphi编程语言的强大功能,为用户提供了一种直观且高效的手段来分析数据...

    Mann-Kendall(MK)趋势分析.py

    mk趋势检验代码,可计算水文、气象序列的趋势,并判断趋势的显著性,只要安装Python3以及numpy库即可计算,在test数组中输入自己的序列即可,不会可私信。相关文章见...欢迎下载。

    基于Mann_Kendall分析的昆明降雨与气温变化趋势研究

    ### 基于Mann-Kendall分析的昆明...综上所述,基于Mann-Kendall分析的昆明降雨与气温变化趋势研究,不仅为我们提供了关于气候变化趋势的深入理解,也为相关领域的决策者提供了科学依据,有助于制定更加精准的应对策略。

    mann-kendall趋势分析matlab代码.zip_Matlab代码_kendall_mann_时间序列_趋势分析

    通过阅读和理解这段代码,你可以学习如何在实际问题中应用Mann-Kendall趋势分析。此外,代码可能还包含了异常处理、可视化和其他辅助功能,以提高分析的完整性和可读性。 总之,Mann-Kendall趋势分析是一种实用的...

    Mann-Kendall检验.zip

    总之,Mann-Kendall检验是一种强大的工具,能够帮助研究人员检测和理解时间序列中的趋势和突变。通过提供的MATLAB程序,用户可以方便地对数据进行分析,得出关于趋势和突变的结论。对于那些不熟悉统计软件的用户,...

    MK.zip_MK趋势分析_计算Mann-kendall突变

    2. **气象学习资料.url**:这是一个链接,指向与气象学相关的学习资源,可能包含进一步的理论背景、案例研究或相关软件教程,有助于用户深入理解MK突变检验在气象学中的应用。 3. **MK**:这个文件可能是源代码、...

    conditional-Kendall-s-tau:R代码,用于使用双变量生存数据计算条件肯德尔tau

    R代码,用于计算具有未经审查或接受审查的双变量连续结果的条件肯德尔tau 刘向宇,井静宁和李若莎开发的代码。 Liu X,Ning,J,Cheng,Y,Huang,X,Li,R.一种用于评估条件关联和条件一致性的灵活而健壮的方法。...

    Kendall’s W分析方法在医学数据处理中的应用及在SPSS中的实现方法.pdf

    Kendall's W分析方法是一种非参数统计方法,由Kendall在1938年提出,最初是用于评估多组等级数据的一致性,即多个人对同一组事物按照等级评定的结果是否具有相似性。该方法逐渐被应用到医学、心理学、社会学等多个...

    Kendall检验在水文序列趋势分析中的研究.doc

    【Kendall检验在水文序列趋势分析中的研究】 水文序列分析是水利工程和环境科学中的关键环节,它涉及到对水文...未来的研究可以进一步探索Kendall检验在其他领域和复杂情境中的适用性,以及与其他趋势分析方法的比较。

    Mann-Kendall趋势检验程序Matlab代码_突变检测_M-K趋势检验_

    总的来说,Mann-Kendall趋势检验提供了一种灵活且不依赖数据分布的方法来分析时间序列数据的趋势,而Matlab则为实现这一过程提供了强大的平台。通过理解和应用这个Matlab代码,你可以更深入地分析你的数据,发现潜在...

Global site tag (gtag.js) - Google Analytics