自定义Mahalanobis Distance实现与R内置函数结果不一致问题
手动实现马氏距离函数与R内置函数结果不一致的问题排查
自定义马氏距离函数代码
#'mahalanobis_distance #' #'Calculates the mahalanobis_distance given the input data #' #'@param point Point to calculate the mahalanobis_distance #'@param sample_mean Sample mean #'@param sample_covariance_matrix Sample Covariance Matrix #' #'@return Mahalanobis distance associated to the point #' #'@examples #' #'@export mahalanobis_distance <- function(value, sample_mean, sample_covariance_matrix) { # Ensure value and sample_mean are vectors value <- as.matrix(value) sample_mean <- as.matrix(sample_mean) if (ncol(value) != ncol(sample_mean)) { stop("Dimensions of value and sample_mean do not match") } # Calculate the difference vector diff_vector <- value - sample_mean # Calculate the inverse of the covariance matrix inverted_covariance_matrix <- solve(sample_covariance_matrix) # Calculate the Mahalanobis distance mahalanobis_dist <- sqrt(t(diff_vector) %*% inverted_covariance_matrix %*% diff_vector) return(as.numeric(mahalanobis_dist)) }
测试数据生成代码
inputData = t(matrix(c(3,2,3.5,12,4.7,4.1,5.2,4.9,7.1,6.1,6.2,5.2,14,5.3),2,7,dimnames=list(c("r","d")))); inputData = data.frame(inputData); if (is.data.frame(inputData)) { inputData = as.matrix(inputData); } else { stop("inputData must be a dataframe") }
测试代码
mahalanobis_mat_vector = c(); for(i in 1:nrow(inputData)){ mahalanobis_mat_vector = c(mahalanobis_mat_vector, mahalanobis_distance(inputData[i,], sampleMeans, covariance_matrix)); } distances = mahalanobis_mat_vector; message("My mahalanobis distance vector: "); print(distances); distances = mahalanobis(inputData, sampleMeans, covariance_matrix); message("R own function mahalanobis(): "); print(distances);
结果对比
自定义函数输出:
[1] 1.5243357 2.1412611 0.6774662 0.3867442 0.2811000 0.1497338 2.0931872
R内置mahalanobis()函数输出:
[1] 2.32359939 4.58499903 0.45896039 0.14957109 0.07901719 0.02242021 4.38143269
两者结果存在明显差异,需排查自定义函数的实现错误。
内容的提问来源于stack exchange,提问作者mbtz
相关产品推荐
相关产品推荐

