R循环和data.frame
Posted
技术标签:
【中文标题】R循环和data.frame【英文标题】:R loops and 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
循环来完成吗?否则如何实现?我需要建议。
【问题讨论】:
【参考方案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
传递给每个集群。
【讨论】:
是包knn
还是fnn
?
@DeanMacGregor 这是 FNN:快速最近邻算法 cran.r-project.org/web/packages/FNN/FNN.pdf以上是关于R循环和data.frame的主要内容,如果未能解决你的问题,请参考以下文章