今天我试图调试我的代码,偶然发现一些让我的解决方案无用的东西。我通常试图计算的是以下两个矩阵的多维L2范数。只要我不使用scale(),一切工作都正常。尽管如此,一旦我缩放矩阵,三种使用方法的解决方案就不再一样了。我在这里错过了什么?规模问题()和多维Lp规范问题
set.seed(655)
df.a <- data.frame(A = sample(100:124, 24), B = sample(1:24, 24), C = sample(1:24, 24), D = rep(0, times=24))
df.b <- data.frame(A = sample(125:148, 24), B = sample(25:48, 24), C = sample(1:24, 24), D = sample(1:100, 24))
为此,我有三个不同的方法:
sapply功能和rowSums的开方
sse <- function(x1, x2) sum((x1 - x2)^2) distanceChangeByTech <- function(x) { sse(df.a[,x], df.b[,x]) } help1 <- t(data.frame(sapply(colnames(df.a), distanceChangeByTech))) dist_sap <- sqrt(rowSums(help1))
使用多维欧几里得距离RCPP:
multiEucl <- cxxfunction(signature(x="matrix", y="matrix"), plugin="Rcpp", body=' Rcpp::NumericMatrix dx(x); Rcpp::NumericMatrix dy(y); const int N = dx.nrow(); const int M = dx.ncol(); double sum = 0; for(int i=0; i<N; i++){ for(int j=0; j<M; j++){ sum = sum + pow(dx(i,j) - dy(i,j), 2); } } return wrap(sqrt(sum)); ')
多维LP-规范使用RCPP:
multiPNorm <- cxxfunction(signature(x="matrix", y="matrix", p="numeric"), plugin="Rcpp", body=' Rcpp::NumericMatrix dx(x); Rcpp::NumericMatrix dy(y); double dp = Rcpp::as<double>(p); const int N = dx.nrow(); const int M = dx.ncol(); double sum = 0; double rsum = 0; for(int i=0; i<N; i++){ for(int j=0; j<M; j++){ sum = sum + pow(abs(dx(i,j) - dy(i,j)), dp); } } rsum = pow(sum, 1/dp); return wrap(rsum); ')
当我试图在此首先运作良好。
> multiEucl(as.matrix(df.a), as.matrix(df.b))
[1] 366.1543
> multiPNorm(as.matrix(df.a), as.matrix(df.b), 2)
[1] 366.1543
> sqrt(rowSums(help1)) sapply.colnames.df.a...distanceChangeByTech.
366.1543
但只要我缩放矩阵,这是我想要做的,因为我会做基于这些distancemeasures一个群集,存在故障。解决方案不再一样了!这是什么造成的?我正在使用这些命令进行缩放。
df.a <- as.data.frame(scale(df.a))
df.a[is.na(df.a)] <- 0
df.b <- as.data.frame(scale(df.b))
df.b[is.na(df.b)] <- 0
> multiEucl(as.matrix(df.a), as.matrix(df.b))
[1] 12.51781
> multiPNorm(as.matrix(df.a), as.matrix(df.b), 2)
[1] 8.944272
> sqrt(rowSums(help1))
sapply.colnames.df.a...distanceChangeByTech.
12.51781