0

我是一名学生,我正在尝试做这个作业,我需要使用 Mahalanobis 距离作为参数来执行 KNN 算法,但由于某种我无法弄清楚的原因,我的代码无法正常工作。

我不是R大师,实际上我只知道基础知识。

library(FNN)
library(readr)
library(pvclass)
library(corpcor)
iono <- read_csv("C:/Users/bruno/Dropbox/Eng. Computação/17.2/IA/Prática Ionosphere/ionosphere.data.txt", 
             col_names = FALSE)
p <- 0.8
iono <- as.matrix(iono)
#gerar indices para selecionar linhas da matriz
train_idx <- sample(x = nrow(iono), size = p*nrow(iono), replace = FALSE)
test_idx <- c(1:nrow(iono))[-train_idx]

#gerar as matrizes com os dados de treinamento/teste
iono_train_x <- iono[train_idx, 1:34]
iono_train_y <- iono[train_idx, 35]
iono_test_x <- iono[test_idx, 1:34]
iono_test_y <- iono[test_idx, 35]

# -------- Implementando a Funcao de Distancia Mahalanobis para KNN
# x - matriz de dados treinamento
# xtest - matriz de dados de teste
# cx - matriz de parametros de mahalanobis
mahalanobis_xy_knn <- function(xtest, x, cx) {

Mdist <- matrix(0, nrow = nrow(xtest), ncol = nrow(x))
for(i in 1:nrow(xtest)){
Mdist[i,] <- mahalanobis(x = x, center = xtest[i, ], cov = cx, inverted = TRUE)
}

return(Mdist)
}


# --------------- Algoritmo KN com Métrica da Mahalanobis
knn_custom <- function(Xtrain, Xtest, Ytrain, k, M){

# ------ Obtem as Distancias Dist(MxN) de todos Xtest(Mxd) para todos Xtrain(Nxd)
# ------ Usando a Métrica Aprendida
Dist <- mahalanobis_xy_knn(Xtest,Xtrain, M)
#   Dist <- dist()
#dados <- data.frame(Dist, Ytrain)

Yhat <- matrix(0, nrow = nrow(Xtest), ncol = 1) 

label_um <- 0
label_dois <- 0
# ---- Calcula o Label de Cada Xtest
for(i in 1:length(Yhat)){
# Agrupa Dist e Y num data frame
dados <- data.frame(Dist[i,], Ytrain)
# Ordena Data frame segundo a Distancia
ind <- order(dados$Dist.i...)
# Toma os K Labels mais Próximos
k_labels_proximos <- Y[ind[1:k]]
# Verifica a maioria
for(j in 1:k){
  if (k_labels_proximos[j] == 1) label_um <- label_um + 1
  else label_dois <- label_dois + 1
}

if(label_um > label_dois) Yhat[i] <- 1
else if(label_um < label_dois) Yhat[i] <- 2

label_um <- 0
label_dois <- 0
}

return(Yhat)
}


# ------------- Aprendizado da Metrica de Mahalanobis
#dados <- data.frame(iono_test_x,iono_test_y)
M_cov <- cov(iono)
inv_m_cov <- pseudoinverse(iono)
M_ident <- diag(ncol(iono))

# ------ Aplicar o K-NN com a Métrica Mahalanobis com matriz de Covariancia
saida_knn_maha <- knn_custom(train_idx, iono_test_x, iono_test_y, k, M_cov)
acc_knn_maha <- sum(iono_test_y == saida_knn_maha)/length(iono_test_y) * 100

当我尝试运行代码时,这是我得到的错误:

Error: is.numeric(x) || is.logical(x) is not TRUE

RStudio 没有告诉我错误在哪里,所以我无法修复它。问题在于比较?

4

1 回答 1

1

如果您可以共享数据的结构和一些数据观察结果,那就太好了。我会假设您的数据集“Ionosphere”与这个相同:https ://www.rdocumentation.org/packages/mlbench/versions/2.1-1/topics/Ionosphere

如果错误来自这一行:

M_cov <- cov(iono)

检查这里 iono 的数据集(执行协方差函数时)是否包含非数字变量,例如因子/str/缺失值。您可以使用以下功能检查结构:

str(iono)

执行 cov 函数时,应排除所有非数字变量以避免此类问题。

于 2018-01-16T00:22:44.483 回答