R_Language 板


LINE

require(magrittr) data(iris) set.seed(1) data <- iris[sample(nrow(iris)) ,] # 打散資料 Xtrain <- data[1:100,1:4] Xtest <- data[101:150,1:4] M <- nrow(Xtrain) N <- nrow(Xtest) distmatrix <- matrix(0,nrow = M,ncol = N) for(i in 1:M){ for(j in 1:N){ distmatrix[i,j]<- sum((Xtrain[i,]-Xtest[j,])^2) %>% sqrt() } } 最近在implement knn 的 distancematrix 想在厚臉皮的問問看 這種常見的操作要怎麼 轉成非迴圈寫法 我用迴圈寫塞的好慢喔 我自己只想到這樣 就卡住了 (matrix(rep(Xtest[1,],nrow(Xtrain)),ncol=ncol(Xtrain),byrow = T)-Xtrain)^2 %>% apply(X=. ,1,sum)%>%sqrt --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.91.75.186 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1585193311.A.644.html
1F:→ locka: 避免把 apply 搭配 %>% pipeline 運算子 因為他會把前半部 03/26 11:38
2F:→ locka: 的向量結果做完才會一個一個丟pipeline 這樣一定超慢(有錯 03/26 11:38
3F:→ locka: 請指正) 03/26 11:38
4F:推 VIATOR: expand.grid和apply一起用可以取代nested loop 03/26 13:28
params <- expand.grid(M=seq(M), N=seq(N)) distmatrix2 <- matrix(mapply(function(i,j) sqrt(sum((Xtrain[i,]-Xtest[j,])^2)), params$M, params$N), nrow = M, ncol = N) 有點看不懂 mapply這段 有人可以解釋一下他是怎麼運作的嗎 # EQUIVALENT TO OP's distance identical(distmatrix, distmatrix2) 老外的解法 ※ 編輯: empireisme (219.91.75.186 臺灣), 03/26/2020 14:34:27 ※ 編輯: empireisme (219.91.75.186 臺灣), 03/26/2020 14:46:28 ※ 編輯: empireisme (219.91.75.186 臺灣), 03/26/2020 14:58:34
5F:推 andrew43: function(i,j)裡的i和j就是params$M和params$N 03/26 23:10
6F:→ andrew43: 每做一次function都是拿M和N各一個元素 03/26 23:13
7F:→ andrew43: 就此例而言,distmatrix[i, j] <- 改成 03/27 10:01
8F:→ andrew43: rbind(Xtrain[i, ], Xtest[j, ]) %>% dist 會快不少。 03/27 10:01
9F:→ andrew43: 或是只有一次dist硬幹 https://i.imgur.com/feLrQO1.jpg 03/27 10:28
10F:→ andrew43: 小改正 https://i.imgur.com/YkTAJF4.jpg 03/27 10:31
11F:→ empireisme: 謝a大,但是用dist函數不就代表不能自己定義距離的意 03/27 18:40
12F:→ empireisme: 思? 03/27 18:40
13F:→ andrew43: 對,但有不少距離定義在R中是由C寫成的。你看看?dist 03/27 18:43
14F:→ andrew43: 中的method有沒有你想用的,其它package也有提供 03/27 18:43
15F:→ andrew43: 例如生態學家常用的vegan::vegdist() 03/27 18:44
16F:推 Gjerry: 我想你的寫法會比較慢可能不是用 apply 就能解決。一個一 03/28 03:02
17F:→ Gjerry: 個算值然後填入矩陣,在R裡面比較沒有效率。可以考慮用矩 03/28 03:02
18F:→ Gjerry: 陣運算,一次計算完整個 row 再填入矩陣,會會很多。 03/28 03:02
19F:→ empireisme: 矩陣運算我就是有點卡住 03/28 19:30
20F:推 andrew43: 針對矩陣運算,例如,不要一列對一列算,而是改成一矩 03/28 20:56
21F:→ andrew43: 陣對一矩陣算。技巧是你需要額外先造出一堆以列重複的 03/28 20:56
22F:→ andrew43: 矩陣使得二個矩陣大小相等而可以直接相減,於是迴圈只 03/28 20:56
23F:→ andrew43: 剩一層。效果如何待測試。若有興趣歡迎繼續發文討論。 03/28 20:56
24F:→ empireisme: 其實我有做到那邊,在本文的最後一段 03/29 00:42
25F:→ empireisme: 但是那時候想說還是有一層迴圈就沒繼續做了 03/29 00:42
26F:→ andrew43: 一樣的,你可以創造出兩個非常多重複列但重複方式不同 03/29 01:22
27F:→ andrew43: 的大矩陣以達成所以的對應情況,於是完全不用迴圈了。 03/29 01:22
28F:推 andrew43: 技巧上可用rep產生不同的重複列號索引來生成二個大矩陣 03/29 01:27
29F:→ andrew43: 。 03/29 01:27
30F:→ empireisme: ok 03/30 13:57
31F:→ Gjerry: 也許可以這樣寫,在我電腦上其實用 for 的function比較快 03/30 14:55
32F:→ Gjerry: https://imgur.com/5UZT7m3.jpg 03/30 14:55
33F:→ andrew43: 抱歉前一大段手邊沒電腦,現在補上 03/30 16:51
34F:→ andrew43: https://ideone.com/zlHh25 03/30 16:51
35F:→ empireisme: 大神們感恩! 03/30 20:53







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燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP