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