Я пытаюсь воспроизвести это уравнение в 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
не слишком хорош дляциклы, поэтому я не знаю, как улучшить это циклы.
РЕДАКТИРОВАТЬ: Вот код с частью ядра матрицы, но я думаю, что это не важно для кода (где вы все читаете данные, можетедумаю, что это любой набор данных, например, радужная оболочка, например:
## 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)
}
}