Я подозреваю, что ваша проблема заключается в том, чтобы без числовых полей данных в «mydades». Линия ошибки:
NA/NaN/Inf in foreign function call (arg 6)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Многие функции в R фактически вызывают базовые, более эффективные реализации C, вместо того, чтобы иметь алгоритм, реализованный только в R. Если вы наберете только «knn» в своей консоли R, вы можете проверить реализацию R «knn». Там существует следующая строка:
Z <- .C(VR_knn, as.integer(k), as.integer(l), as.integer(ntr),
as.integer(nte), as.integer(p), as.double(train), as.integer(unclass(clf)),
as.double(test), res = integer(nte), pr = double(nte),
integer(nc + 1), as.integer(nc), as.integer(FALSE), as.integer(use.all))
где .C означает, что мы называем функцию С именем «VR_knn» прилагаемых аргументы функции. Поскольку у вас есть две ошибки
NAs introduced by coercion
Я думаю, что два из as.double/as.integer звонки терпят неудачу, и ввести значения NA. Если мы начинаем считать параметры, то шестой аргумент:
as.double(train)
, которые могут потерпеть неудачу в таких случаях, как:
# as.double can not translate text fields to doubles, they are coerced to NA-values:
> as.double("sometext")
[1] NA
Warning message:
NAs introduced by coercion
# while the following text is cast to double without an error:
> as.double("1.23")
[1] 1.23
Вы получаете два из ошибок принуждения, которые, вероятно, данных «, как. double (train) 'и' as.double (test) '. Так как вы не даете нам точные сведения о том, как «mydades» есть, вот некоторые из моих лучших догадок (и искусственных многомерных данных нормального распределения):
library(MASS)
mydades <- mvrnorm(100, mu=c(1:6), Sigma=matrix(1:36, ncol=6))
mydades <- cbind(mydades, sample(LETTERS[1:5], 100, replace=TRUE))
# This breaks knn
mydades[3,4] <- Inf
# This breaks knn
mydades[4,3] <- -Inf
# These, however, do not introduce the coercion for NA-values error message
# This breaks knn and gives the same error; just some raw text
mydades[1,2] <- mydades[50,1] <- "foo"
mydades[100,3] <- "bar"
# ... or perhaps wrongly formatted exponential numbers?
mydades[1,1] <- "2.34EXP-05"
# ... or wrong decimal symbol?
mydades[3,3] <- "1,23"
# should be 1.23, as R uses '.' as decimal symbol and not ','
# ... or most likely a whole column is non-numeric, since the error is given twice (as.double problem both in training AND test set)
mydades[,1] <- sample(letters[1:5],100,replace=TRUE)
Я бы держать оба числовые данные и класс метки в одной матрице, может быть, вы могли бы разделить данные, как:
mydadesnumeric <- mydades[,1:6] # 6 first columns
mydadesclasses <- mydades[,7]
Использование вызовов
str(mydades); summary(mydades)
также может помочь вам/нам в поиске проблемные записи данных и сотрудничества скопируйте их в числовые записи или опустив нечисловые поля.
Остальная часть кода запуска (после разрыва данных), как это предусмотрено Вами:
N <- nrow(mydades)
permut <- sample(c(1:N),N,replace=FALSE)
ord <- order(permut)
mydades.shuffled <- mydades[ord,]
prop.train <- 1/3
NOMBRE <- round(prop.train*N)
mydades.training <- mydades.shuffled[1:NOMBRE,]
mydades.test <- mydades.shuffled[(NOMBRE+1):N,]
# 7th column seems to be the class labels
knn(train=mydades.training[,-7],test=mydades.test[,-7],mydades.training[,7],k=5)
Можете ли вы предоставить фиктивные данные, чтобы мы могли сами попытаться воспроизвести ошибку? Это было бы очень полезно, поскольку, несмотря на то, что вы предоставили полученную ошибку, мой французский язык просто в порядке (и если мы сможем воспроизвести ошибку, мы можем получить английскую инструкцию об ошибке, которая, скорее всего, вернет результаты Google) , –
Это поможет, если вы также можете предоставить небольшой набор данных для 'mydades', который, как вы знаете, воспроизводит эту ошибку. –