2013-06-01 86 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

您能否提供虛擬數據,以便我們自己嘗試重現錯誤?這是非常有用的,因爲即使你提供了你收到的錯誤,我的法語也沒問題(如果我們能夠重現錯誤,我們可以得到英文錯誤聲明,這將更有可能返回谷歌結果) 。 –

+0

如果你也可以爲'mydades'提供一個小的虛擬數據集,那麼你就知道會重現這個錯誤。 –

回答

17

我懷疑你的問題在於對「mydades」有非數字數據的字段。錯誤行:

NA/NaN/Inf in foreign function call (arg 6) 

讓我懷疑對C語言實現的knn函數調用失敗。 R中的許多函數實際上調用底層的,更高效的C實現,而不是用R實現的算法。如果在R控制檯中鍵入'knn',則可以檢查'knn'的R實現。存在以下行:

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」與所提供的功能參數的C函數。由於你有兩個錯誤

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 

你得到兩個強制錯誤,這可能是由「給出的。雙(火車)'和'as.double(測試)'。因爲你沒有爲我們提供瞭如何「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

通過@ Teemu偉大的答案。

由於這是一個很好閱讀的問題,我將從分析角度給出相同的答案。

KNN函數通過計算點之間的歐幾里德距離來分類數據點。這是一個需要數字的數學計算。因此,KNN中的所有變量都必須能夠強制數字化。

爲KNN數據準備通常包括三個步驟:
(1)修正所有NA或「」值
(2)轉換到所有因素的一組布爾值,每個電平中的影響因子
( 3)將每個變量的值標準化到0:1的範圍,以便沒有變量的範圍對距離測量有過大的影響。

0

我還指出,使用整數時,函數似乎失敗。在調用knn函數之前,我需要將所有內容轉換爲「num」類型。這包括目標特徵,R中的大多數方法使用因子類型。因此,as.numeric(my_frame $ target_feature)是必需的。