2013-06-01 6 views
9

я пытаюсь запустить эту строку:Ошибка с функцией Knn

knn(mydades.training[,-7],mydades.test[,-7],mydades.training[,7],k=5) 

, но я всегда получаю эту ошибку:

Error in knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : 
    NA/NaN/Inf in foreign function call (arg 6) 
In addition: Warning messages: 
1: In knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : 
    NAs introduced by coercion 
2: In knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : 
    NAs introduced by coercion 

Любая идея пожалуйста?

PS: mydades.training и mydades.test определяются следующим образом:

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,] 
+0

Можете ли вы предоставить фиктивные данные, чтобы мы могли сами попытаться воспроизвести ошибку? Это было бы очень полезно, поскольку, несмотря на то, что вы предоставили полученную ошибку, мой французский язык просто в порядке (и если мы сможем воспроизвести ошибку, мы можем получить английскую инструкцию об ошибке, которая, скорее всего, вернет результаты Google) , –

+0

Это поможет, если вы также можете предоставить небольшой набор данных для 'mydades', который, как вы знаете, воспроизводит эту ошибку. –

ответ

17

Я подозреваю, что ваша проблема заключается в том, чтобы без числовых полей данных в «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) 
10

Великий ответ на @ Теему.

Поскольку это хорошо прочитанный вопрос, я дам тот же ответ с точки зрения аналитики.

Функция KNN классифицирует точки данных путем вычисления евклидова расстояния между точками. Это математический расчет, требующий чисел. Поэтому все переменные в KNN должны быть численными.

Подготовка данных для KNN часто включает в себя три задачи:
(1) исправить все NA или «» значения
(2) Преобразование всех факторов в набор логических значений, по одному для каждого уровня в факторе
(3) Нормализовать значения каждой переменной до диапазона 0: 1, чтобы диапазон переменных не оказывал чрезмерно большого влияния на измерение расстояния.

0

Я также хотел бы указать, что функция, похоже, терпит неудачу при использовании целых чисел. Мне нужно было преобразовать все в тип «num» до вызова функции knn. Сюда входит целевая функция, в которой большинство методов в R используют тип фактора. Таким образом, требуется as.numeric (my_frame $ target_feature).

Смежные вопросы