在KNN算法中使用马氏距离的问题

我是一名学生,正在做作业,需要使用马氏距离作为参数来实现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.8iono <- as.matrix(iono)#生成索引以选择矩阵的行train_idx <- sample(x = nrow(iono), size = p*nrow(iono), replace = FALSE)test_idx <- c(1:nrow(iono))[-train_idx]#生成包含训练/测试数据的矩阵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]# -------- 实现马氏距离函数用于KNN# x - 训练数据矩阵# xtest - 测试数据矩阵# cx - 马氏距离参数矩阵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)}# --------------- 使用马氏距离的KNN算法knn_custom <- function(Xtrain, Xtest, Ytrain, k, M){# ------ 获取所有Xtest(Mxd)到所有Xtrain(Nxd)的距离矩阵Dist(MxN)# ------ 使用学习到的度量Dist <- mahalanobis_xy_knn(Xtest,Xtrain, M)#   Dist <- dist()#dados <- data.frame(Dist, Ytrain)Yhat <- matrix(0, nrow = nrow(Xtest), ncol = 1) label_um <- 0label_dois <- 0# ---- 计算每个Xtest的标签for(i in 1:length(Yhat)){# 将Dist和Y组合成数据框dados <- data.frame(Dist[i,], Ytrain)# 根据距离排序数据框ind <- order(dados$Dist.i...)# 取最接近的K个标签k_labels_proximos <- Y[ind[1:k]]# 检查多数票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] <- 1else if(label_um < label_dois) Yhat[i] <- 2label_um <- 0label_dois <- 0}return(Yhat)}# ------------- 学习马氏距离度量#dados <- data.frame(iono_test_x,iono_test_y)M_cov <- cov(iono)inv_m_cov <- pseudoinverse(iono)M_ident <- diag(ncol(iono))# ------ 应用带有协方差矩阵的马氏距离的K-NNsaida_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没有显示错误的位置,所以我无法修复它。问题出在比较上吗?


回答:

如果你能分享你的数据结构和一些数据观察结果就好了。我假设你的数据集”Ionosphere”与这个相同:https://www.rdocumentation.org/packages/mlbench/versions/2.1-1/topics/Ionosphere

如果错误来自于这行代码:

M_cov <- cov(iono)

检查在执行协方差函数时,iono数据集是否包含非数值变量,例如因子/字符串/缺失值。你可以使用下面的函数检查结构:

str(iono)

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注