LA6 计算协方差矩阵
题目来源:牛客网
描述
编写一个 Python 函数来计算给定向量集的协方差矩阵。该函数应该采用一个列表列表,其中每个内部列表代表一个特征及其观察结果,并返回一个协方差矩阵。
输入描述:
输入给定向量集。
输出描述:
输出协方差矩阵。
示例1
输入:
[[7, 8, 9], [10, 11, 12]]
输出:
[[1.0, 1.0], [1.0, 1.0]]
Σ i j = 1 m − 1 ∑ k = 1 m ( X i k − μ i ) ( X j k − μ j ) \Sigma_{ij} = \frac{1}{m-1} \sum_{k=1}^{m} (X_{ik} - \mu_i)(X_{jk} - \mu_j) Σij=m−11k=1∑m(Xik−μi)(Xjk−μj)
import numpy as np
def calculate_covariance_matrix(vectors):
# 补全代码
features = len(vectors)
samples = len(vectors[0])
samples_mean = [sum(sublist)/len(sublist) for sublist in vectors]
covariance_matrix = [[0 for _ in range(features)] for _ in range(features)]
for i in range(features):
for j in range(i, features):
covariance =sum ((vectors[i][k] - samples_mean[i]) * (vectors[j][k]-samples_mean[j]) for k in range(samples)) / (samples-1)
covariance_matrix[i][j] = covariance
covariance_matrix[j][i] = covariance
# return np.cov(vectors, rowvar=True).tolist() # 精度不太一样
return covariance_matrix
# 主程序
if __name__ == "__main__":
# 输入
ndarrayA = input()
# 处理输入
import ast
A = ast.literal_eval(ndarrayA)
# 调用函数计算
output = calculate_covariance_matrix(A)
# 输出结果
print(output)
协方差
协方差(Covariance)是衡量两个随机变量之间线性关系的统计量。它描述了两个变量如何一起变化。
- 正值:如果协方差为正,说明当 X X X增大时, Y Y Y也倾向于增大;当 X X X减小时, Y Y Y也倾向于减小。这表示 X X X和 Y Y Y之间存在正相关关系。
- 负值:如果协方差为负,说明当 X X X增大时, Y Y Y倾向于减小;当 X X X减小时, Y Y Y倾向于增大。这表示 X X X和 Y Y Y之间存在负相关关系。
- 零值:如果协方差为零,说明 X X X和 Y Y Y之间没有线性关系。但这并不一定意味着 X X X和 Y Y Y完全独立,因为协方差只能衡量线性关系,不能捕捉非线性关系。
协方差矩阵
协方差矩阵是一个用来描述多维随机变量之间协方差的矩阵。对于一个 n n n维随机变量 X = ( X 1 , X 2 , … , X n ) \mathbf{X} = (X_1, X_2, \ldots, X_n) X=(X1,X2,…,Xn),其协方差矩阵 Σ \Sigma Σ是一个 n × n n \times n n×n的矩阵,其中第 i i i行第 j j j列的元素是 X i X_i Xi和 X j X_j Xj的协方差,即:
Σ i j = Cov ( X i , X j ) = E [ ( X i − μ i ) ( X j − μ j ) ] \Sigma_{ij} = \text{Cov}(X_i, X_j) = E[(X_i - \mu_i)(X_j - \mu_j)] Σij=Cov(Xi,Xj)=E[(Xi−μi)(Xj−μj)]
其中 μ i = E [ X i ] \mu_i = E[X_i] μi=E[Xi]是 X i X_i Xi的期望值。
协方差矩阵具有以下性质:
- 它是一个对称矩阵,即 Σ i j = Σ j i \Sigma_{ij} = \Sigma_{ji} Σij=Σji。
- 它的对角线元素是各个随机变量的方差,即 Σ i i = Var ( X i ) \Sigma_{ii} = \text{Var}(X_i) Σii=Var(Xi)。
如果用数据样本计算协方差矩阵,假设我们有 m m m个样本点 x 1 , x 2 , … , x m \mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_m x1,x2,…,xm,每个样本点是一个 n n n维向量,那么样本协方差矩阵 Σ \Sigma Σ可以表示为:
Σ = 1 m − 1 ∑ k = 1 m ( x k − μ ) ( x k − μ ) T \Sigma = \frac{1}{m-1} \sum_{k=1}^{m} (\mathbf{x}_k - \mathbf{\mu})(\mathbf{x}_k - \mathbf{\mu})^T Σ=m−11∑k=1m(xk−μ)(xk−μ)T
其中 μ \mathbf{\mu} μ是样本均值向量,定义为:
μ = 1 m ∑ k = 1 m x k \mathbf{\mu} = \frac{1}{m} \sum_{k=1}^{m} \mathbf{x}_k μ=m1∑k=1mxk
协方差矩阵的具体案例说明
假设我们有三个随机变量 X 1 , X 2 , X 3 X_1, X_2, X_3 X1,X2,X3,并且有以下4个样本观测值:
X 1 X_1 X1 | X 2 X_2 X2 | X 3 X_3 X3 |
---|---|---|
2 | 3 | 5 |
4 | 6 | 8 |
6 | 9 | 11 |
8 | 12 | 14 |
1. 计算每个随机变量的均值
首先,计算每个随机变量的均值:
μ 1 = 2 + 4 + 6 + 8 4 = 5 \mu_1 = \frac{2 + 4 + 6 + 8}{4} = 5 μ1=42+4+6+8=5
μ 2 = 3 + 6 + 9 + 12 4 = 7.5 \mu_2 = \frac{3 + 6 + 9 + 12}{4} = 7.5 μ2=43+6+9+12=7.5
μ 3 = 5 + 8 + 11 + 14 4 = 10 \mu_3 = \frac{5 + 8 + 11 + 14}{4} = 10 μ3=45+8+11+14=10
2. 计算每个随机变量与其均值的偏差
接下来,计算每个样本点与均值的偏差:
X 1 − μ 1 X_1 - \mu_1 X1−μ1 | X 2 − μ 2 X_2 - \mu_2 X2−μ2 | X 3 − μ 3 X_3 - \mu_3 X3−μ3 |
---|---|---|
2 − 5 = − 3 2 - 5 = -3 2−5=−3 | 3 − 7.5 = − 4.5 3 - 7.5 = -4.5 3−7.5=−4.5 | 5 − 10 = − 5 5 - 10 = -5 5−10=−5 |
4 − 5 = − 1 4 - 5 = -1 4−5=−1 | 6 − 7.5 = − 1.5 6 - 7.5 = -1.5 6−7.5=−1.5 | 8 − 10 = − 2 8 - 10 = -2 8−10=−2 |
6 − 5 = 1 6 - 5 = 1 6−5=1 | 9 − 7.5 = 1.5 9 - 7.5 = 1.5 9−7.5=1.5 | 11 − 10 = 1 11 - 10 = 1 11−10=1 |
8 − 5 = 3 8 - 5 = 3 8−5=3 | 12 − 7.5 = 4.5 12 - 7.5 = 4.5 12−7.5=4.5 | 14 − 10 = 4 14 - 10 = 4 14−10=4 |
3. 计算协方差矩阵
协方差矩阵的每个元素 Σ i j \Sigma_{ij} Σij 是通过计算 ( X i − μ i ) (X_i - \mu_i) (Xi−μi) 和 ( X j − μ j ) (X_j - \mu_j) (Xj−μj) 的乘积的平均值来得到的。具体公式为:
Σ i j = 1 m − 1 ∑ k = 1 m ( X i k − μ i ) ( X j k − μ j ) \Sigma_{ij} = \frac{1}{m-1} \sum_{k=1}^{m} (X_{ik} - \mu_i)(X_{jk} - \mu_j) Σij=m−11k=1∑m(Xik−μi)(Xjk−μj)
其中 m m m 是样本数量,这里是4。
计算 Σ 11 \Sigma_{11} Σ11( X 1 X_1 X1 和 X 1 X_1 X1 的协方差,即 X 1 X_1 X1 的方差):
Σ 11 = 1 4 − 1 [ ( − 3 ) 2 + ( − 1 ) 2 + 1 2 + 3 2 ] = 1 3 [ 9 + 1 + 1 + 9 ] = 20 3 ≈ 6.67 \Sigma_{11} = \frac{1}{4-1} [(-3)^2 + (-1)^2 + 1^2 + 3^2] = \frac{1}{3} [9 + 1 + 1 + 9] = \frac{20}{3} \approx 6.67 Σ11=4−11[(−3)2+(−1)2+12+32]=31[9+1+1+9]=320≈6.67
计算 Σ 12 \Sigma_{12} Σ12( X 1 X_1 X1 和 X 2 X_2 X2 的协方差):
Σ 12 = 1 4 − 1 [ ( − 3 ) ( − 4.5 ) + ( − 1 ) ( − 1.5 ) + 1 × 1.5 + 3 × 4.5 ] = 1 3 [ 13.5 + 1.5 + 1.5 + 13.5 ] = 30 3 = 10 \Sigma_{12} = \frac{1}{4-1} [(-3)(-4.5) + (-1)(-1.5) + 1 \times 1.5 + 3 \times 4.5] = \frac{1}{3} [13.5 + 1.5 + 1.5 + 13.5] = \frac{30}{3} = 10 Σ12=4−11[(−3)(−4.5)+(−1)(−1.5)+1×1.5+3×4.5]=31[13.5+1.5+1.5+13.5]=330=10
计算 Σ 13 \Sigma_{13} Σ13( X 1 X_1 X1 和 X 3 X_3 X3 的协方差):
Σ 13 = 1 4 − 1 [ ( − 3 ) ( − 5 ) + ( − 1 ) ( − 2 ) + 1 × 1 + 3 × 4 ] = 1 3 [ 15 + 2 + 1 + 12 ] = 30 3 = 10 \Sigma_{13} = \frac{1}{4-1} [(-3)(-5) + (-1)(-2) + 1 \times 1 + 3 \times 4] = \frac{1}{3} [15 + 2 + 1 + 12] = \frac{30}{3} = 10 Σ13=4−11[(−3)(−5)+(−1)(−2)+1×1+3×4]=31[15+2+1+12]=330=10
计算 Σ 22 \Sigma_{22} Σ22( X 2 X_2 X2 和 X 2 X_2 X2 的协方差,即 X 2 X_2 X2 的方差):
Σ 22 = 1 4 − 1 [ ( − 4.5 ) 2 + ( − 1.5 ) 2 + 1. 5 2 + 4. 5 2 ] = 1 3 [ 20.25 + 2.25 + 2.25 + 20.25 ] = 45 3 = 15 \Sigma_{22} = \frac{1}{4-1} [(-4.5)^2 + (-1.5)^2 + 1.5^2 + 4.5^2] = \frac{1}{3} [20.25 + 2.25 + 2.25 + 20.25] = \frac{45}{3} = 15 Σ22=4−11[(−4.5)2+(−1.5)2+1.52+4.52]=31[20.25+2.25+2.25+20.25]=345=15
计算 Σ 23 \Sigma_{23} Σ23( X 2 X_2 X2 和 X 3 X_3 X3 的协方差):
Σ 23 = 1 4 − 1 [ ( − 4.5 ) ( − 5 ) + ( − 1.5 ) ( − 2 ) + 1.5 × 1 + 4.5 × 4 ] = 1 3 [ 22.5 + 3 + 1.5 + 18 ] = 45 3 = 15 \Sigma_{23} = \frac{1}{4-1} [(-4.5)(-5) + (-1.5)(-2) + 1.5 \times 1 + 4.5 \times 4] = \frac{1}{3} [22.5 + 3 + 1.5 + 18] = \frac{45}{3} = 15 Σ23=4−11[(−4.5)(−5)+(−1.5)(−2)+1.5×1+4.5×4]=31[22.5+3+1.5+18]=345=15
计算 Σ 33 \Sigma_{33} Σ33( X 3 X_3 X3 和 X 3 X_3 X3 的协方差,即 X 3 X_3 X3 的方差):
Σ 33 = 1 4 − 1 [ ( − 5 ) 2 + ( − 2 ) 2 + 1 2 + 4 2 ] = 1 3 [ 25 + 4 + 1 + 16 ] = 46 3 ≈ 15.33 \Sigma_{33} = \frac{1}{4-1} [(-5)^2 + (-2)^2 + 1^2 + 4^2] = \frac{1}{3} [25 + 4 + 1 + 16] = \frac{46}{3} \approx 15.33 Σ33=4−11[(−5)2+(−2)2+12+42]=31[25+4+1+16]=346≈15.33
4. 构建协方差矩阵
将上述计算结果填入矩阵中,得到协方差矩阵:
Σ = ( 6.67 10 10 10 15 15 10 15 15.33 ) \Sigma = \begin{pmatrix} 6.67 & 10 & 10 \\ 10 & 15 & 15 \\ 10 & 15 & 15.33 \end{pmatrix} Σ= 6.671010101515101515.33
这个矩阵描述了三个随机变量之间的协方差关系。对角线上的元素是每个变量的方差,非对角线上的元素是变量之间的协方差。