在R中缩放n×p矩阵X,使X%*%t(X)对角线元素全为1
用R的scale函数实现行归一化,使X%*%t(X)对角线全为1
原理说明
要满足diag(X %*% t(X)) = rep(1, n),本质是让矩阵每一行的欧几里得范数(平方和开根号)等于1——因为X %*% t(X)的第i个对角线元素,就是X第i行向量与自身的内积(即该行元素的平方和)。
具体实现步骤
- 计算X每行的L2范数;
- 利用
scale函数对转置后的矩阵按列缩放(对应原矩阵的行); - 转置回原矩阵形状,得到缩放结果。
代码示例
# 构造测试矩阵(3行2列) X <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2) # 计算每行的L2范数 row_norms <- sqrt(rowSums(X^2)) # 处理范数为0的行(避免除以0错误) row_norms[row_norms == 0] <- 1 # 用scale函数实现行归一化 X_scaled <- t(scale(t(X), center = FALSE, scale = row_norms)) # 验证结果:对角线元素应全部为1 diag(X_scaled %*% t(X_scaled))
代码解释
t(X):将原矩阵转置,把行转换为列,适配scale函数默认按列处理的逻辑;scale(..., center = FALSE):关闭中心化(仅做缩放操作,不需要减去行均值);scale(..., scale = row_norms):指定每列(对应原矩阵的行)的缩放因子为该行的L2范数,实现每行除以自身范数;t(...):将处理后的矩阵转置回原形状,得到行归一化后的结果。
内容的提问来源于stack exchange,提问作者Pame
相关产品推荐
相关产品推荐

