使用NumPy时协方差矩阵无法求逆?出现奇异矩阵报错
协方差矩阵求逆报错“Singular matrix”的原因及解决方法
问题背景
给定数据:
- x = [255, 239, 213]
- y = [255, 240, 245]
执行以下代码时出现报错:
import numpy as np cov_matrix = np.cov(np.array([[255.0, 255.0], [239.0, 240.0], [213.0, 245.0]])) inv_matrix = np.linalg.inv(cov_matrix)
报错信息:
LinAlgError: Singular matrix
原因分析
奇异矩阵指的是不可逆的矩阵,核心原因是矩阵的秩小于其自身的维度。你的情况问题出在np.cov的输入维度规则:
np.cov默认以每行代表一个变量,每列代表一个样本来计算协方差。你传入的是3行2列的数组,相当于定义了3个变量,但每个变量只有2个样本。- 当变量数量(3)超过样本数量(2)时,协方差矩阵的秩最大只能等于样本数(2),但矩阵是3x3的,必然是奇异矩阵,无法求逆。
解决方法
将数据转置,让每个变量(x、y)作为一行,样本作为列,形成2行3列的数组:
import numpy as np # 正确构造数据:x和y各为一行,3个样本为列 data = np.array([[255, 239, 213], [255, 240, 245]]) cov_matrix = np.cov(data) inv_matrix = np.linalg.inv(cov_matrix)
此时得到的协方差矩阵是2x2的,秩为2,满足可逆条件,可正常求逆。
你也可以用np.linalg.matrix_rank(cov_matrix)查看矩阵的秩,验证原3x3矩阵的秩为2,确实不可逆。
内容的提问来源于stack exchange,提问作者Giuseppe Boezio
相关产品推荐
相关产品推荐

