【发布时间】:2018-11-07 10:47:47
【问题描述】:
我试图在 R 中重现这个方程来进行内核 K-Means 聚类:
但是我创建的循环需要很长时间才能完成,我不知道如何改进它,这是给出问题的代码部分的示例:
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']是否属于集群g,而kernelmatrix[k,l]是来自nxn 内核操作矩阵。
我知道R 不太适合循环,所以我不知道如何改进循环。
编辑:这是带有 kernelmatrix 部分的代码,但我认为这对代码并不重要(你们都读取数据的地方,可以认为这是任何数据集,例如 iris:
## Euclidian Distance
# Remember:
#1.|| a || = sqrt(aDOTa),
#2. d(x,y) = || x - y || = sqrt((x-y)DOT(x-y))
#3. aDOTb = sum(a*b)
d<-function(x,y){
aux=x-y
dis=sqrt(sum(aux*aux))
return(dis)
}
##Radial Basis Function Kernel
# Remember :
# 1.K(x,x')=exp(-q||x-x'||^2) where ||x-x'|| is could be defined as the
# euclidian distance and 'q' it's the gamma parameter
rbf<-function(x,y,q=0.2){
aux<-d(x,y)
rbfd<-exp(-q*(aux)^2)
return(rbfd)
}
#
#calculating the kernel matrix
kernelmatrix=matrix(0,nrow(data),nrow(data))
for(i in 1:nrow(data)){
for(j in 1:nrow(data)){
kernelmatrix[i,j]=rbf(data[i,1:(ncol(data)-1)],data[j,1:(ncol(data)-1)],q)
}
}
【问题讨论】:
-
正如你所说,R 不适合 for 循环。您的代码似乎“可矢量化”,因此
apply()家族应该可以解决问题。另一种解决方案是使用Rcpp。 -
实际上 R 在循环方面很出色,尤其是最近的更新 - 请参阅 post。我在代码中看到的问题是它有 3 个
for循环。可以dput(kernelmatrix)吗? -
iris 没有
cluster列? -
没有,但这相当于每个物种对应一个数字
-
你有没有尝试找到已经有计算kk mreas功能的包?例如rdocumentation.org/packages/kernlab/versions/0.9-26/topics/…
标签: r for-loop time cluster-analysis nested-loops