如何在R中用谱分解计算airquality数据集协方差矩阵的逆与平方根
基于谱分解计算协方差矩阵的逆与平方根
你使用的协方差矩阵属于实对称正定矩阵,谱分解的标准形式为 matr = V %*% diag(L) %*% t(V),其中V是正交特征向量矩阵,L是按降序排列的正特征值向量。基于谱分解的性质,直接对特征值做对应变换即可得到目标矩阵:
1. 计算协方差矩阵的逆
- 原理:正定矩阵的逆的谱分解形式为
matr⁻¹ = V %*% diag(1/L) %*% t(V),只需将每个特征值取倒数即可。 - 对应R实现代码:
# 按你当前累加分量的逻辑实现逆矩阵计算 inv_mat <- (1/L[1]) * V[,1] %*% t(V[,1]) + (1/L[2]) * V[,2] %*% t(V[,2]) + (1/L[3]) * V[,3] %*% t(V[,3]) + (1/L[4]) * V[,4] %*% t(V[,4]) + (1/L[5]) * V[,5] %*% t(V[,5]) + (1/L[6]) * V[,6] %*% t(V[,6]) # 验证结果:和R内置求逆函数结果对比,差值接近0即为正确 max(abs(inv_mat - solve(matr)))
如果不想手动累加分量,也可以用更简洁的矩阵运算写法:
inv_mat_simple <- V %*% diag(1/L) %*% t(V)
2. 计算协方差矩阵的平方根
- 原理:正定矩阵的对称平方根(满足
sqrt_mat %*% sqrt_mat = matr)的谱分解形式为matr^(1/2) = V %*% diag(sqrt(L)) %*% t(V),只需将每个特征值取算术平方根即可。 - 对应R实现代码:
# 按累加分量的逻辑实现平方根矩阵计算 sqrt_mat <- sqrt(L[1]) * V[,1] %*% t(V[,1]) + sqrt(L[2]) * V[,2] %*% t(V[,2]) + sqrt(L[3]) * V[,3] %*% t(V[,3]) + sqrt(L[4]) * V[,4] %*% t(V[,4]) + sqrt(L[5]) * V[,5] %*% t(V[,5]) + sqrt(L[6]) * V[,6] %*% t(V[,6]) # 验证结果:平方根矩阵自乘和原协方差矩阵差值接近0即为正确 max(abs(sqrt_mat %*% sqrt_mat - matr))
简洁版矩阵运算写法:
sqrt_mat_simple <- V %*% diag(sqrt(L)) %*% t(V)
内容的提问来源于stack exchange,提问作者user15866126
相关产品推荐
相关产品推荐

