R循环和data.frame

标签 r algorithm k-means

部分代码为

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 循环来完成吗?否则如何实现?我需要建议。

最佳答案

您可以使用 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 传递给每个集群。

关于R循环和data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31112173/

相关文章:

algorithm - 高效构建阈值相似度图

c - 将多个文件内容写入单个文件的有效方法

algorithm - k表示聚类算法

open-source - 在哪里可以找到可靠的 K-medoid(不是 k-means)开源软件/工具?

r - 创建一个新列作为列表返回

r - 根据现有行向数据框添加行

algorithm - 什么时候用线段树什么时候用BIT

python - scikit-learn 如何知道集群中的文档?

r - 为什么 tidycensus 提供的面积与 sf::_st_area() 计算的面积不同

jquery - 为什么 JQuery 不影响 RMarkdown 中的表?