Numpy np.cov返回矩阵维度大于输入的问题咨询
搞懂numpy cov函数输出5×5矩阵的原因
嘿,我来帮你理清这个困惑——问题完全出在np.cov()的默认行为上,咱们一步步拆解:
首先,np.cov()默认把每个输入数组的行当作一个变量,列当作该变量的观测值。而且当你传入多个数组时,它会自动把所有输入的行堆叠到一起,形成一个包含所有变量的大矩阵,再计算这些变量之间的协方差。
看看你的输入:
u是(1,2)的数组:这代表1个变量,有2个观测值(数值是8和3)e是(4,2)的数组:这代表4个变量,每个变量都有2个观测值(比如第一个变量是2和2,第二个是5和5,以此类推)
当你调用np.cov(u,e)时,numpy会把u的1行和e的4行合并成一个(5,2)的矩阵,相当于总共有5个变量,每个变量对应2个观测:
# 手动模拟numpy的合并操作 combined_vars = np.vstack([u, e]) # 合并后是这样的: # [[8, 3], # [2, 2], # [5, 5], # [1, 6], # [7, 4]]
协方差矩阵的维度是变量数量 × 变量数量,所以5个变量自然就输出了5×5的矩阵,这完全符合numpy的逻辑哦。
如果你实际想计算的是2维观测数据的协方差
比如你把u和e的每一行都当作一个2维的观测样本,那你需要告诉numpy切换处理方式——把列当作变量,行当作观测。只需要设置rowvar=False参数就行:
# 先合并所有观测样本 all_observations = np.vstack([u, e]) # 计算2个维度之间的协方差矩阵(结果是2×2) cov_2d = np.cov(all_observations, rowvar=False)
再给你验证一下结果的合理性
比如输出里第一行第一列的12.5,就是第一个变量[8,3]的样本方差:
按照样本方差公式 $\frac{\sum(x_i - \bar{x})2}{n-1}$,这里均值$\bar{x}=(8+3)/2=5.5$,计算得$\frac{(8-5.5)2 + (3-5.5)^2}{2-1}=6.25+6.25=12.5$,和输出完全匹配,这也印证了咱们的解释是对的~
内容的提问来源于stack exchange,提问作者jtam
相关产品推荐
相关产品推荐

