R_Language 板


LINE

※ 引述《locka (locka)》之铭言: : (同是apply家族爱好者先shout out一下XD) : 以前看过版主C大跟其他前辈版友的讨论,结论是 apply 效率并没有比较好 : (印象中好像背後都还是用for回圈?!) : 不过我觉得向量化(vectorized)是R语言里面很重要的一个特性 : 也是functional programming跟其他程式语言不一样的地方 : 我自己也喜欢做for转apply的练习 : === 分隔线 === : 以下的写法只是随便写的(甚至可以说骨子里还是for的逻辑...) : 请其他版友分享更好的写法!! : 1. cross validation: : 1.a 还是用到folds : sapply(1:5,function(i){ : testIndexes <- which(folds==i,arr.ind=T) : # 做你想做的事情 : # ex: 找测试集的最大值跟训练集的最小值 : max_intest <- max(dataset[testIndexes,]) : min_intrain <- min(dataset[-testIndexes,]) : #回传结果 : c(max_intest,min_intrain) : }) : 其实这个跟for的写法根本换汤不换药XD : 1.b 使用split (不要用cut跟folds) : 原po原本的方法是先用sample()抽样打乱原始data的顺序後再用cut()指定组别 : 提供sapply + split的做法: : sapply(split(dataset,1:5),function(x){ : test <- x # test dataset : train <- dataset[-as.numeric(row.names(x)),] # train dataset : # 做你想做的 : c(max(test),max(train)) : }) : 这个做法直接把dataset分成5份然後将该dataframe传进sapply里 : 不过须注意这作法取样的顺序跟cut不一样 : cut是111..222...333...444..555(各20次) : split是12345...12345...12345...(共20次) : 不过因为一开始已经用sample打乱过顺序了,所以个人觉得後面cut或split应该没差 : (有错请指正>"<) library(pipeR) library(data.table) N <- 100000L x <- runif(N) * 10 y <- x+rnorm(N) * 0.1 num_folds <- 10L split_idx <- seq_len(N) %>>% cut(breaks=num_folds, labels = FALSE) %>>% sample dataset <- data.table(x, y, split_idx, key = "split_idx") library(microbenchmark) microbenchmark(apply_func = { models <- seq_len(num_folds)%>>% lapply( function(i){ lm(y ~ x, dataset[split_idx != i]) }) mse_folds <- seq_len(num_folds) %>>% sapply(function(i){ mean((predict(models[[i]], dataset[split_idx == i]) - dataset[split_idx == i]$y)^2) }) }, for_loop = { models <- vector("list", num_folds) mse_folds <- vector("numeric", num_folds) for (i in seq_len(num_folds)) { models[[i]] <- lm(y ~ x, dataset[split_idx != i]) mse_folds[i] <- mean((predict(models[[i]], dataset[split_idx == i]) - dataset[split_idx == i]$y)^2) } }, times = 20L ) # Unit: milliseconds # expr min lq mean median uq max neval # apply_func 192.4187 199.8315 236.0988 209.2901 284.0653 365.0350 20 # for_loop 198.8673 206.2947 230.8822 210.7969 260.0005 301.9913 20 基本上没差多少,开心用什麽就用什麽,重点还是forloop前的变数要allocate apply写法有很多种,有人是不存model,那就不用拆两段 有人直接一次return list(model, mse),这样也不用拆两段 我是觉得apply或是for-loop看coder开心就好XD 请参考 https://webptt.com/cn.aspx?n=man/R_Language/D5C7/M.1437921117.A.AC4.html : 2. 偷偷问的小问题 : x <- c(2:3) : y <- c(4:8) : sapply(x,function(i){ : i*y : }) : 其实我後来很常用 : sapply(x,function(){ : .... : }) 可以用microbenchmark去看效能,我猜其实没差 这个例子outer最快 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.170.73 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1585186274.A.9D9.html ※ 编辑: celestialgod (118.163.170.73 台湾), 03/26/2020 09:34:53
1F:推 locka: 谢谢大大!没想到还真的被钓出来了(欸 03/26 13:36
2F:→ locka: 可能我的使用情境来说都还不到效能瓶颈,所以以前不太需要 03/26 13:36
3F:→ locka: 注意效能问题,但还是很感谢C大分享! 03/26 13:36







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP