【问题标题】:R loops and data.frameR循环和data.frame
【发布时间】:2015-09-15 17:01:30
【问题描述】:

部分代码是

sse <-c()                         
k <- c()    

for (i in seq(3, 15, 1)) {                        

  y_pred <-knn(train = newdata.training, test = newdata.test,
               cl = newdata.trainLabels, k=i)

  pred_y <- as.numeric(levels(y_pred)[y_pred])            
  sse[i] <- sum((newdata.trainLabels-pred_y)^2)   

  k[i] <- i                                
}

pred_y 是每个i 的列。我想创建一个包含所有 13 列的数据框。可以通过使用for 循环来完成吗?否则如何实现?我需要建议。

【问题讨论】:

    标签: r algorithm k-means


    【解决方案1】:

    您可以使用foreach,如果您的 CPU 中有多个内核,它可以并行运行。这是非并行代码:

    library("iterators")
    library("foreach")
    library("FNN")
    
    data(iris3)
    newdata.training <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
    newdata.test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
    newdata.trainlabels <- factor(c(rep(1,25), rep(2,25), rep(3,25)))
    
    k.values = seq(3, 15, 1)
    start = 2  # to index sse array using k.values
    sse = numeric(length = length(k.values))
    results = foreach(i = iter(k.values),.combine = cbind) %do%
    {
      y_pred <-knn(train = newdata.training, test = newdata.test,
                   cl = newdata.trainlabels, k=i, prob = TRUE)
    
      pred_y <- as.numeric(levels(y_pred)[y_pred])            
      sse[i - start] <- sum((as.numeric(newdata.trainlabels)-pred_y)^2) 
      pred_y 
    }
    
    results1 = data.frame(results)
    colnames(results1) = k.values
    

    这是并行版本:

    # Parallel version
    library("iterators")
    library("foreach")
    library("parallel")
    library("doParallel")
    library("FNN")
    
    
    data(iris3)
    newdata.training <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
    newdata.test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
    newdata.trainlabels <- factor(c(rep(1,25), rep(2,25), rep(3,25)))
    
    num.cores = detectCores()
    clusters <- makeCluster(num.cores)
    registerDoParallel(clusters)
    k.values = seq(3, 15, 1)
    start = 2  # to index sse array using k.values
    sse = numeric(length = length(k.values))
    results = foreach(i = iter(k.values),.combine = cbind, .packages=c("FNN")) %dopar%
    {
      y_pred <-knn(train = newdata.training, test = newdata.test,
                   cl = newdata.trainlabels, k=i, prob = TRUE)
    
      pred_y <- as.numeric(levels(y_pred)[y_pred])            
      sse[i - start] <- sum((as.numeric(newdata.trainlabels)-pred_y)^2) 
      pred_y 
    }
    
    results1 = data.frame(results)
    colnames(results1) = k.values
    stopCluster(clusters)
    

    非并行代码和并行代码之间只有一些区别。首先,需要加载额外的库。其次,您需要创建和注册将执行并行计算的集群(并在完成后停止集群)。第三,foreach 使用%dopar% 中缀运算符而不是%do%。第四,foreach函数需要.packages参数将KNN传递给每个集群。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多