【问题标题】:Reducing the number of computations in matrix comparison减少矩阵比较中的计算次数
【发布时间】:2015-08-28 23:51:48
【问题描述】:

我正在编写一个算法来计算元素之间的距离。例如,我有一个包含 3 行和 2 列的数据集(学生 A、B 和 C)及其身高。我必须取所有元素的距离差并计算一个矩阵。所有可能的计算都是 A-A、A-B、A-C、B-A、B-B、B-C、C-A、C-B、C-C。但是 A-B 和 B-A 的绝对差值是相等的。

目前我使用 if 条件来避免比较相似的元素(A-A,B-B)。但是仍然有重复的计算。我的目标是避免重复计算。

例如,如果 A-B 完成,则不会计算 B-A,并且 A-B 的值将分配给正确的矩阵位置。如果有人能就此向我提供建议会很有帮助。

更新: 场景:我有 3 个files(data_A、data_B 和 data_C)。将这些文件视为模型。每个模型都有一组属性(A、B、C、D)。不同的模型有不同的属性。例如 data_A (A,B,C),data_B 有 (A,D,C),data_C 有 (A,B,C)。

我的目标是根据模型的共同属性来比较模型。首先,我扫描模型并找出所有模型共有的属性。在这种情况下,只有 A 和 C。接下来,我将根据共同属性对每个模型进行成对比较。例如,我将计算 data_A 中的 A 和 data_B 中的 A、data_A 中的 C 和 data_B 中的 C 的欧几里得距离。首先,我将计算每对的平方差之和,然后计算该值的平方根。对每个模型对中的所有代谢物对重复此操作,最后平方根距离的累积值将为我提供模型之间的单个距离值。

我的问题在于我的算法,如果我将 data_A 与 data_B 进行比较,我不必进行反向计算(即 data_B 与 data_A)。目前,我只忽略了使用 if 条件对同一数据集进行的比较。下面是我的代码。这可能不是最佳的编写方式。

setwd("E:/Assignment")
uniqueDataSets = list.files(pattern = "\\.csv$")
commonVariables = c("A","C")

#To store the distances
results  = data.frame(DataSet1 = character(), DataSet2 = character(), Distance=numeric() , stringsAsFactors = F)

for(i in 1:length(uniqueDataSets)) #loading the files as reference file
{
  currentDataSetName = uniqueDataSets[i]
  currentDataSet = read.csv(currentDataSetName)

  for(j in 1:length(uniqueDataSets)) #loading the file as comparison files
  {
    comparedDataSetName = uniqueDataSets[j]
    comparedDataSet = read.csv(comparedDataSetName)

    totalDistance = 0
    tempDist = 0

    if(currentDataSetName != comparedDataSetName) #Ignoring comparison if it's the same data set
    {
      for(k in 1:length(commonVariables)) #computing pair wise distance for each metabolite
      {
        var1 = currentDataSet[commonVariables[k]]
        var2 = comparedDataSet[commonVariables[k]]

        tempDist = sqrt(sum((var1 - var2)^2))
        totalDistance = totalDistance + tempDist #cumulative value of the distance between 2 models
      }

    } else{
      totalDistance = 0
    }

    results = rbind(results, data.frame(DataSet1=currentDataSetName, DataSet2 = comparedDataSetName, Distance =totalDistance))

  }
}

【问题讨论】:

  • 也许你想要?dist
  • 组合由combn 函数返回。距离“矩阵”并不是真正的 R 矩阵,但 @jeremycg 似乎已经满足了您的要求。
  • @BoundedDust 我认为你是对的。我不确定将其指定为 R 问题是否正确。我正在寻找一个通用的答案。但我会用 R 编程。

标签: r algorithm matrix


【解决方案1】:

R 内置了这个:

x <- matrix(c(1.56, 1.64, 1.75), nrow = 3)
row.names(x) <-c("a", "b", "c")
dist(x)

【讨论】:

  • 感谢您的回答。这里距离计算是我自己的功能。在那种情况下,我应该如何指定?在 dist() API 中,它仅支持预定义的距离度量。
  • 这取决于您的函数输入和输出 - 可以将这些数据和一些示例数据放在您的问题中以获得更具体的答案。
【解决方案2】:

使用@jeremycg 数据的其他方式:

utils::combn(x, m=2, FUN=diff)
combn(x, m=2, FUN=`-`)

诚然,对于大型数据集,这些速度要慢一些。他们都给:

[1] 0.08 0.19 0.11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多