Я хочу создать кластеры из многомерного набора данных в местах на плоскости (x, y), в два этапа. На первом шаге (уже выполненном) я использовал более плотный набор данных и разделился на предыдущие классы. На втором этапе кластеризации я хочу использовать эту предварительную информацию для уточнения и создания окончательного кластера. Это данные о почве и растениях сельскохозяйственного района. Я не смог выполнить второй шаг и попытался использовать пакеты "foreach" и "doParallel" R, но безуспешно. R сообщает, что функция% dopar% не была найдена. Сначала я запустил код с несколькими строками «для». Процесс был очень медленным. Я прервал. Я видел, что можно было использовать параллельные вычисления, но у меня нет этих знаний. Я установил пакеты "foreach" и "doParallel". Просто с помощью foreach я могу выполнить небольшие части кода и убедиться, что он действительно работает. Но когда я ввожу% dopar% после параметра «foreach», R сообщает об ошибке, когда не нашел эту функцию.
# Последний столбец набора данных (p + 1) указывает априорные классы.
require(foreach)
require(doParallel)
require(geoR)
# Произведение различий между переменными
Z<-function(dados,var,ponto1,ponto2){
return(as.numeric(dados$data[ponto1,var]-dados$data[ponto2,var]))
}
Оценка ядра с априорной информацией
Klambda<-function(dados,ponto1,ponto2){
dmatriz<-as.matrix(dist(dados$coords))
if(dmatriz[ponto1,ponto2]>=2.23){return(0)}
if(dados$data[ponto1,p+1]!=dados$data[ponto2,p+1]){return(0.2*(0.75*(2.23^2-dmatriz[ponto1,ponto2]^2))}
if(dados$data[ponto1,p+1]==dados$data[ponto2,p+1]){return(0.8*(0.75*(2.23^2-dmatriz[ponto1,ponto2]^2))}
}
Числитель
Numerador<-function(dados,ponto1,ponto2,var1,var2){
result=0
foreach(k=1:n)%dopar%{
kl = Klambda(dados,ponto1,k)
foreach(l=1:n)%dopar%{
result=result+(kl *Klambda(dados,ponto2,l)*Z(dados,var1,k,l)*Z(dados,var2,k,l))
}
}
return(result)
}
Знаменатель
Denominador<-function(dados,ponto1,ponto2){
n=nrow(dados$data)
result=0
foreach(k=1:n)%dopar%{
foreach(l=1:n)%dopar%{
result=result+(Klambda(dados,ponto1,k)*Klambda(dados,ponto2,l))
}
}
return(2*result)
}
# Гамма: прямая и поперечная вариабельность
GammaHat<-function(dados,ponto1,ponto2,var1,var2){return(Numerador(dados,ponto1,ponto2,var1,var2)/Denominador(dados,ponto1,ponto2))
}
Несхожесть
Dlambda<-function(dados,ponto1,ponto2){
result=0
foreach(i=1:p)%dopar%{
foreach(j=1:p)%dopar%{
result=result+GammaHat(dados,ponto1,ponto2,i,j)
}
}
return(result)
}
Матрица несходства
MatrizD<-array(dim=c(n,n))
system.time(
foreach(k=1:n)%dopar%{
foreach(l=1:n)%dopar%{
if(l<=k){
MatrizD[k,l]<- Dlambda(d,k,l)
}
MatrizD[l,k]<-MatrizD[k,l]
}
}
)
Для тестового файла (12 местоположений, 3 переменные плюс априорный класс) без foreach код для матрицы различий занимает около 100 секунд. Тем не менее, я еще не мог выполнить для фактического набора данных (102 балла, 23 переменных плюс априорный класс).
x y var1 var2 var3 Class
1 1 0,245 0,514 0,048 1
1 2 0,825 0,427 0,100 1
1 3 0,873 0,803 0,452 1
2 1 0,452 0,801 0,510 1
2 2 0,243 0,855 0,303 1
2 3 0,640 0,108 0,954 1
3 1 0,834 0,185 0,418 1
3 2 0,998 0,160 0,787 2
3 3 0,596 0,030 0,840 2
4 1 0,506 0,264 0,503 2
4 2 0,975 0,441 0,011 2
4 3 0,466 0,138 0,482 2