Почему вы выдаете ошибку% dopar%, не найденную даже после загрузки пакета foreach? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу создать кластеры из многомерного набора данных в местах на плоскости (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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...