Re: [問題]不使用for改使用apply寫法的可能性

作者: empireisme (empireisme)   2020-03-26 11:28:27
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
作者: locka (locka)   2020-03-26 11:38:00
避免把 apply 搭配 %>% pipeline 運算子 因為他會把前半部的向量結果做完才會一個一個丟pipeline 這樣一定超慢(有錯請指正)
作者: VIATOR (阿布拉卡達不拉)   2020-03-26 13:28:00
expand.grid和apply一起用可以取代nested loop
作者: andrew43 (討厭有好心推文後刪文者)   2020-03-26 23:10:00
function(i,j)裡的i和j就是params$M和params$N每做一次function都是拿M和N各一個元素就此例而言,distmatrix[i, j] <- 改成rbind(Xtrain[i, ], Xtest[j, ]) %>% dist 會快不少。或是只有一次dist硬幹 https://i.imgur.com/feLrQO1.jpg小改正 https://i.imgur.com/YkTAJF4.jpg
作者: empireisme (empireisme)   2020-03-27 18:40:00
謝a大,但是用dist函數不就代表不能自己定義距離的意思?
作者: andrew43 (討厭有好心推文後刪文者)   2020-03-27 18:43:00
對,但有不少距離定義在R中是由C寫成的。你看看?dist中的method有沒有你想用的,其它package也有提供例如生態學家常用的vegan::vegdist()
作者: Gjerry   2020-03-28 03:02:00
我想你的寫法會比較慢可能不是用 apply 就能解決。一個一個算值然後填入矩陣,在R裡面比較沒有效率。可以考慮用矩陣運算,一次計算完整個 row 再填入矩陣,會會很多。
作者: empireisme (empireisme)   2020-03-28 19:30:00
矩陣運算我就是有點卡住
作者: andrew43 (討厭有好心推文後刪文者)   2020-03-28 20:56:00
針對矩陣運算,例如,不要一列對一列算,而是改成一矩陣對一矩陣算。技巧是你需要額外先造出一堆以列重複的矩陣使得二個矩陣大小相等而可以直接相減,於是迴圈只剩一層。效果如何待測試。若有興趣歡迎繼續發文討論。
作者: empireisme (empireisme)   2020-03-29 00:42:00
其實我有做到那邊,在本文的最後一段但是那時候想說還是有一層迴圈就沒繼續做了
作者: andrew43 (討厭有好心推文後刪文者)   2020-03-29 01:22:00
一樣的,你可以創造出兩個非常多重複列但重複方式不同的大矩陣以達成所以的對應情況,於是完全不用迴圈了。技巧上可用rep產生不同的重複列號索引來生成二個大矩陣。
作者: empireisme (empireisme)   2020-03-30 13:57:00
ok
作者: Gjerry   2020-03-30 14:55:00
也許可以這樣寫,在我電腦上其實用 for 的function比較快https://imgur.com/5UZT7m3.jpg
作者: andrew43 (討厭有好心推文後刪文者)   2020-03-30 16:51:00
抱歉前一大段手邊沒電腦,現在補上https://ideone.com/zlHh25
作者: empireisme (empireisme)   2020-03-30 20:53:00
大神們感恩!

Links booklink

Contact Us: admin [ a t ] ucptt.com