全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
6240 7
2018-10-01
比如说计算矩阵中每行之间的重叠率,得到一个相似性矩阵。
代码如下,用的是两个for循环,这个代码针对小数据量没问题,一旦到大数据量,计算速度就超级慢。
所以,请大牛给出利用apply家族函数解决办法?多谢!!!

H <- matrix(sample(c(0,1),30,replace = T), 5, 6)
Sim <- matrix(0, nrow(H), nrow(H))

for(i in 1:nrow(H)){
  for(j in 1:nrow(H)){
    if(rowSums(H)[i]!=0 | rowSums(H)[j]!=0){
      Sim[i,j] <- length(intersect(which(H[i,]>0), which(H[j,]>0)))/(rowSums(H)[i]+rowSums(H)[j])
    }
  }
}


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2018-10-1 12:09:46
理论上说apply使用方便,能让变得代码简洁。但本质上其实也是循环。
建议优化一下算法。比如把rowSums的结果存起来调用,避免反复计算;如果[i,j]和[j,i]是一样的话就不要算两次
另外这代码的意思是矩阵的每个元素都是0、1吗……但如果两行完全一样(含非0项)也只有0.5?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-10-2 01:08:05
1楼已是正解,仅作补充

1. 当前代码中,每个 nrow(H)、rowSums(H)[i] 这样的写法都是一次数据结构遍历,应使用中间变量如 row.current <- nrow(H) 一次性赋值后代入循环,就楼主的算法而言,这个性能提升应该比较明显
2. 虽然楼主要求的是行相似性,但算法中体现的是具体某个单元的数据特征,换句话说,减少嵌套并不能本质上减少你循环的总次数
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-10-2 11:16:32
你这个问题可以用矩阵相乘来简化。一行代码就可以了:

H %*% t(H) / outer(rowSums(H), rowSums(H), "+")

不过,这种方法快是快,但很耗内存!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-10-2 21:36:15
fdsasdfddsa 发表于 2018-10-1 12:09
理论上说apply使用方便,能让变得代码简洁。但本质上其实也是循环。
建议优化一下算法。比如把rowSums的结 ...
多谢,以后写代码需要先考虑清楚,这样就简洁很多!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-10-2 21:37:21
爱思考大帝 发表于 2018-10-2 01:08
1楼已是正解,仅作补充

1. 当前代码中,每个 nrow(H)、rowSums(H) 这样的写法都是一次数据结构遍历,应使 ...
多谢!在这里学到一个经验,就是要简化代码!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群