【问题标题】:Distributed algorithm for calculation of Pearson cross correlation matrix partitioned by time and key按时间和键划分的Pearson互相关矩阵计算的分布式算法
【发布时间】:2017-05-30 23:27:29
【问题描述】:

在我的数据在不同节点之间除以 id(例如:1-4)和时间(例如:Jan-Dec)的分布式环境中计算 Pearson 互相关矩阵的算法可能是什么。

例如:

Node A({id1, Jan}, {id2, Jan}); Node B({id3, Jan}, {id4, Jan}),
Node C({id1, Feb}, {id2, Feb}); Node A({id1, March}{id2, March}),
Node C({id3, Feb}, {id4, Feb}); Node B({id3, March}, {id4, March})

基本上,我的意思是说所有 id 的 Jan 数据不在一个节点上。

我想知道在不必将大数据从一个节点传送到另一个节点的情况下我可以使用什么策略,因为 Pearson 相关是成对计算。我可以在节点之间传输小的中间结果。我应该如何根据 id 和 time 对数据进行分区,以便有效地计算多个 id 之间的互相关矩阵。

选择的语言是 C++

【问题讨论】:

    标签: algorithm c++11 distributed-computing pearson-correlation


    【解决方案1】:

    两个数据向量之间的相关性为cor(X,Y) = cov(X,Y)/[sd(X) * sd(Y)]。有没有办法将这些分解成块计算?所需的基本计算(因为sd(X) = sqrt(cov(X,X))是

    cov(X,Y) = <X Y> - <X> <Y>
             = 1/N (sum[i] X[i] Y[i]) - 1/N (sum[i] X[i]) * 1/N (sum[i] Y[i])
    

    这是所有索引 i 的总和。然而,每个索引 i 对应于一个带有 N_n 事件的节点 n 和一个子索引(在该节点中)k_n

    cov(X,Y) = 1/N (sum[n] sum[k_n] X[k_n] Y[k_n])
             - 1/N^2 (sum[n] sum[k_n] X[k_n]) * (sum[n] sum[k_n] Y[i])
    

    由于N = sum[n] N_n,可以改写为

    cov(X,Y) = (sum[n] N_n/N 1/N_n sum[k_n] X[k_n] Y[k_n])
             - (sum[n] N_n/N 1/N_n sum[k_n] X[k_n]) * (sum[n] N_n/N 1/N_n sum[k_n] Y[i])
             = (sum[n] N_n/N <XY>_n) - (sum[n] N_n/N <X>_n) * (sum[n] N_n/N <Y>_n)
    

    因此,每个节点只需要报告其在节点内的条目数 N_n 以及 &lt;X&gt;_n, &lt;Y&gt;_n&lt;XY&gt;_n(以及,为了关联的目的,&lt;X^2&gt;_n&lt;Y^2&gt;_n)。然后可以通过将这些均值与适当的权重N_n/N(同样是N = sum[n] N_n)相加来计算全局协方差,以获得全局均值。

    编辑:LaTeX 版本

    由于没有 LaTeX 很难解析这些方程式,因此这里有一些更易于理解的图像版本。两个数据列表 X 和 Y 的协方差定义为

    其中每个数量 &lt;X&gt;, &lt;Y&gt;&lt;XY&gt; 是(列表 X、列表 Y 和成对产品列表 XY)的平均值。均值的计算可以分解为各个节点的加权和。调用 X、Y、XY 或 X^2 或 Y^2(计算相关性所必需的)Z 中的任何一个,Z 的平均值为:

    其中&lt;Z&gt;_k 是第 k 个节点上 Z 的平均值,N_k 是第 k 个节点上的数据点数。这将每个节点所需的信息量减少到N_k, &lt;X&gt;_k, &lt;Y&gt;_k, &lt;XY&gt;_k, &lt;X^2&gt;_k&lt;Y^2&gt;_k

    【讨论】:

    • 我无法理解。请您再解释一下,也许用一些图片。
    • 你在哪里找到了这种协方差公式?
    • N = sum[n] N_n 这一行是什么?
    • @RoshanMehta 这是协方差公式的两种标准形式之一,不幸的是,它很难编写,因为 stackoverflow 神秘地不支持 LaTeX。 N = sum[n] N_n 表示事件总数 N 是每个节点中事件 N_n 的总和。请记住,用更简单的表示法:cov(X,Y) = mean(XY) - mean(X)*mean(Y),驻留在不同节点上的数据的平均值等于每个节点上的平均值的加权平均值.
    【解决方案2】:

    看看这篇文章,因为它可以进一步解释它:https://en.wikipedia.org/wiki/Covariance_matrix

    让我们使用您测量的两个变量 X 和 Y,这意味着您可以提供两个长度相同的数组,以便 {x_i} 是 X 的测量值,而 {y_i} 是 Y 的测量值。

    从哲学的角度来看,两个变量 X 和 Y 的协方差表示 X 的变化对应 Y 的变化的概率有多强。

    要计算协方差矩阵,您需要三个元素:

    • 是 X 的算术平均值
    • 是 Y 的算术平均值
    • 是数组 X 和 Y 的元素乘积的算术平均值

    如果 cov(X,Y) = cov(Y,X) 并且 cov(X,X) = cov(Y,Y) = 1,您可以使用这些属性来最小化所需的计算量和要传输的数据,因为您只需要计算矩阵上对角线中的元素。

    例如,如果您有两个变量,则只需计算一个元素,对于三个变量,您需要计算 3 个元素,依此类推...

    【讨论】:

      【解决方案3】:

      本文对您有帮助吗? https://pdfs.semanticscholar.org/f02f/0df4922351375aa304de7de296393cdf7224.pdf

      "第一个算法是 Quadrant Correlation 的并行版本 (QC),第二个是 Maronna 方法的并行版本。 Parallel QC 使用并行矩阵库,可以处理 其数据中的一维异常值。平行 Maronna 方法 将独立的相关性计算除以 处理器并且能够检测一维和二维 数据中的异常值。”

      另一个类似的问题:Distributed cross correlation matrix computation

      【讨论】:

      • 这篇论文真的很烂。没有说明如何、为什么以及需要很多假设。
      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 2020-04-12
      • 2012-10-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多