通过忽略for循环来计算余弦相似度的有效方法

时间:2018-01-26 21:04:20

标签: r parallel-processing data.table lapply stringdist

我正在尝试使用R中stringdist包的stringdist函数来计算余弦相似度。我想通过计算每行baseline_dt的余弦相似度并取所有值的均值来获得scoring_dt中每行的平均余弦相似度。我使用下面的代码成功获得结果。但是,我正在寻找高效的代码,因为嵌套for循环对于大型数据集来说非常慢。

 baseline_dt <- read.table(text="id Product.Group.Code   R1   R2   R3   R4   S1   S2   S3   U1   U2   U3 U4 U6
    91  65418                164 0.68 0.70 0.50 0.59   NA   NA 0.96   NA 0.68   NA NA NA
    93  57142                164   NA 0.94   NA   NA 0.83   NA   NA 0.54   NA   NA NA NA
    99  66740                164 0.68 0.68 0.74   NA 0.63 0.68 0.72   NA   NA   NA NA NA
    100 76712                164 0.54 0.54 0.40   NA 0.39 0.39 0.39 0.50   NA 0.50 NA NA
    101 56463                164 0.67 0.67 0.76   NA   NA 0.76 0.76 0.54   NA   NA NA NA
    125 11713                164   NA   NA   NA   NA   NA 0.88   NA   NA   NA   NA NA NA",header=TRUE)


 scoring_dt <- read.table(text="id Product.Group.Code   R1   R2   R3   R4   S1   S2   S3   U1   U2   U3 U4 U6
11  999                164 0.68 0.70 0.50 0.59   0.7   NA 0.96   NA 0.68   NA NA NA
22  555                164   0 0.94   0   NA 0.83   0.6   NA 0.54   NA   NA NA NA",header=TRUE)

请在下面找到R代码。

dc  <- setNames(data.frame(matrix(ncol = 3, nrow = 0)), c("baseline_id", "scoring_id", "cosine_score"))
    dt  <- setNames(data.frame(matrix(ncol = 2, nrow = 0)), c("scoring_id", "Avg_cosine_score"))
    predictor <- c("R1" ,"R2" ,"R3" ,"R4", "S1", "S2", "S3", "U1", "U2" ,"U3", "U4" ,"U6")

    id <-"id"
    baseline_dt <- data.table::setDT(baseline_dt)
    scoring_dt <- data.table::setDT(scoring_dt)

    for(i in 1:length(scoring_dt[[id]])){

      for(j in 1:length(baseline_dt[[id]])){

        dc[j,1] <- baseline_dt[[id]][j]
        dc[j,2] <- scoring_dt[[id]][i]
        cos <- stringdist::stringdist(as.character(baseline_dt[ ,predictor ,with=F][j,]),as.character(scoring_dt[,predictor,with=F][i,]),
                                      method=method,nthread=8)
        cos[is.na(cos)] <- 0
        dc[j,3] <- 1-mean(cos)
      }
      dt[i,1] <- scoring_dt[[id]][i]
      dt[i,2] <- mean(dc[,3])
    }

    View(dt)

我希望将我的代码转换为更高效的代码。 我尝试过foreach并行循环,但似乎没有什么能加速我的代码。

**注意 - 我有混合数据字符以及二进制(0&amp; 1),这就是我使用stringdist函数的原因。我不能使用lsa包中的余弦函数。

0 个答案:

没有答案