R中的循环需要很长时间才能完成

时间:2018-05-28 20:38:59

标签: r for-loop time cluster-analysis nested-loops

我试图在R中重现这个等式来做核心K-Means聚类:enter image description here

但是我创建它的循环需要很长时间才能完成,而且我不知道如何改进它,这里是代码部分给出的例子问题:

c=3
for (g in 1:c) { 
  ans = 0
  for (k in 1:nrow(iris)) {
    for (l in 1:nrow(iris)) {
      ans = ans + (iris[k,'cluster']==g) *(iris[l,'cluster']==g)*kernelmatrix[k,l]
      }
    }
  third[g] = ans
  }   

这是一个伪代码,因为它只是完整函数的一部分,表达式(iris[l,'cluster']==g)来验证元素iris[l,'cluster']是否属于集群{{ 1}},g它是内核操作的kernelmatrix[k,l]矩阵中的一个元素。

我知道nxn不是'对循环来说太好了,所以我不知道如何改进循环。

编辑:这里是kernelmatrix部分的代码,但我认为这对代码来说并不重要(你们都读取数据,可以认为这是像虹膜这样的数据集:< / p>

R

3 个答案:

答案 0 :(得分:0)

您是否尝试使用Kernlab package之类的内容?许多软件包作者都会用C ++实现这样的东西,所以即使你已经为这个代码提供了矢量化,这个代码也会比手工方程高得多(如果你想让它合理地执行,这是必不可少的步骤)。

答案 1 :(得分:0)

R解释器确实很慢。使用for循环或其他循环结构似乎并不重要。因此,尽量减少实际R代码的数量,并在性能出现问题时,考虑重写C中的代码。仅将R用作“驱动程序”。

在您的情况下,有几个明显的问题:

您的计算应该是对称的(如果您的内核函数是对称的)。如果你利用这个,你的速度会快两倍。如果该点不在集群中,则内部循环根本不需要运行。你总结的只是零。

你做的选择k * k次。如果是循环,则将它们移出,仅执行k次。然后矢量化所有操作。

为了变得更快,尝试使用矩阵运算替换整个内部两个循环(将在C中运行,而不是使用两个R解释器循环......)。天真地,乘法。但后来意识到你只是在做选择。所以你要写的是sum(kernelmatrix [selection,selection]),对吧?

答案 2 :(得分:-1)

这可能是一个开始:

data("iris")
iris <- as.data.frame(iris, stringsAsFactors = FALSE)
ans <- 1:nrow(iris)
third <- ans + as.numeric(iris[,'Sepal.Length']==5)*as.numeric(iris[,'Sepal.Length']==4)

但没有数据集和内核矩阵定义

很难