基于自定义Mahalanobis距离计算距离矩阵出现全零问题如何修复
问题原因
- 变量未定义错误
- 定义系数矩阵W时调用了不存在的
w3变量,导致W矩阵无法正常生成 make_dm调用overall_dist时传入了未定义的参数p,该参数在距离计算逻辑中无实际作用
- 定义系数矩阵W时调用了不存在的
- 维度不匹配错误
你用于生成距离矩阵的样本集X是2维特征矩阵,每个样本长度为2,而测试用的a、b是3维向量,若W按照3维场景定义为3阶方阵,和2维向量做矩阵乘法时会出现维度不匹配,计算直接失败 - 全零结果是因为距离矩阵初始化值为全零,计算报错后赋值操作终止,矩阵保留了初始值
修复方案
首先删除无用的p参数,根据样本特征维度调整W的定义,确保W是和特征维度匹配的方阵(标准马氏距离场景下W为样本协方差矩阵的逆矩阵),修正后代码如下:
# 马氏距离计算函数,删除无用的p参数 overall_dist<-function(a, b, c, W){ if(c=="Mahalanobis dist"){ diff_vec <- a - b dist <- t(diff_vec) %*% W %*% diff_vec dist <- sqrt(as.numeric(dist)) } return(dist) } # 2维特征场景下W定义为2阶单位阵(可替换为实际的协方差逆矩阵) w1<-c(1,0) w2<-c(0,1) W<-rbind(w1,w2) # 样本矩阵 X<-matrix(c(-1,1,2,-1,2,3,1,2,3,0), nrow=5, ncol=2, byrow = TRUE) # 距离矩阵生成函数 make_dm<-function(mat, W){ n <- nrow(mat) matrix_dist<-matrix(0, nrow = n, ncol = n) for (i in 1:n) { for (j in 1:(i-1)){ matrix_dist[i,j] <- overall_dist(mat[i,], mat[j,], c="Mahalanobis dist", W) matrix_dist[j,i] <- matrix_dist[i,j] } } return(matrix_dist) } # 执行计算 make_dm(X, W)
如果需要处理3维样本,补充w3的定义即可,例如:
w3 <- c(0,0,1) W <- rbind(w1,w2,w3)
内容的提问来源于stack exchange,提问作者Vorrven
相关产品推荐
相关产品推荐

