Skip to content

第七讲(下) 矩阵、多元分布特征与符号代数

一、本讲介绍

欢迎来到多元统计分析课程。在本课程中,我们将深入探讨多元统计分析的核心内容,包括矩阵理论、多元正态分布、多元统计量、多元分布等。此外,我们还将介绍如何使用Python的SymPy工具进行符号计算。通过本课程的学习,你将能够掌握多元统计分析的基本理论和方法,并能够使用Python进行相关的计算和分析。

二、矩阵理论基础

(一)矩阵的基本概念

1. 矩阵的定义

  • 矩阵是一个由数字排列成的矩形阵列。矩阵中的每个数字称为矩阵的元素。
  • 示例
    import numpy as np
    
    # 创建矩阵
    matrix = np.array([[1, 2, 3], [4, 5, 6]])
    print(matrix)
    

2. 矩阵的维度

  • 矩阵的维度由其行数和列数决定,通常表示为 \(m \times n\) ,其中 \(m\) 是行数,\(n\) 是列数。
  • 示例
    print(matrix.shape)  # 输出 (2, 3)
    

3. 特殊矩阵

  • 单位矩阵(Identity Matrix):主对角线上的元素为1,其余元素为0的方阵。
    • 示例
      identity_matrix = np.eye(3)
      print(identity_matrix)
      
  • 零矩阵(Zero Matrix):所有元素均为0的矩阵。
    • 示例
      zero_matrix = np.zeros((3, 3))
      print(zero_matrix)
      
  • 对角矩阵(Diagonal Matrix):主对角线上的元素可以是任意值,其余元素为0的矩阵。
    • 示例
      diagonal_matrix = np.diag([1, 2, 3])
      print(diagonal_matrix)
      

(二)矩阵的基本运算

1. 矩阵加法和减法

  • 矩阵加法和减法要求两个矩阵的维度相同。
  • 示例
    matrix1 = np.array([[1, 2], [3, 4]])
    matrix2 = np.array([[5, 6], [7, 8]])
    print(matrix1 + matrix2)  # 输出 [[ 6  8]
                              #        [10 12]]
    print(matrix1 - matrix2)  # 输出 [[-4 -4]
                              #        [-4 -4]]
    

2. 矩阵乘法

  • 矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数。
  • 示例
    matrix1 = np.array([[1, 2], [3, 4]])
    matrix2 = np.array([[5, 6], [7, 8]])
    print(np.dot(matrix1, matrix2))  # 输出 [[19 22]
                                     #        [43 50]]
    

3. 矩阵转置

  • 矩阵转置是将矩阵的行和列互换。
  • 示例
    matrix = np.array([[1, 2], [3, 4]])
    print(matrix.T)  # 输出 [[1 3]
                     #        [2 4]]
    

4. 矩阵的逆

  • 矩阵的逆是指一个矩阵 \( A \) 的逆矩阵 \(A^{-1}\),满足 \(A \cdot A^{-1} = I\)
  • 示例
    from numpy.linalg import inv
    
    matrix = np.array([[1, 2], [3, 4]])
    inverse_matrix = inv(matrix)
    print(inverse_matrix)  # 输出 [[-2.   1. ]
                           #        [ 1.5 -0.5]]
    

(三)矩阵的特征值和特征向量

1. 特征值和特征向量的定义

  • 对于矩阵 \(A\),如果存在非零向量\(v\) 和标量 \(\lambda\),使得 \(A \cdot v = \lambda \cdot v\)\(\lambda\) 是矩阵 \( A \) 的特征值,\( v \) 是对应的特征向量。
  • 示例
    from numpy.linalg import eig
    
    matrix = np.array([[1, 2], [3, 4]])
    eigenvalues, eigenvectors = eig(matrix)
    print(eigenvalues)  # 输出 [-0.37228132  5.37228132]
    print(eigenvectors)  # 输出 [[-0.82456484 -0.41597356]
                         #        [ 0.56576746 -0.90937671]]
    

2. 特征值和特征向量的应用

  • 特征值和特征向量在许多领域有广泛应用,如主成分分析(PCA)、图像处理等。

(四)矩阵的分解

1. 奇异值分解(SVD)

  • 奇异值分解将矩阵 \( A \) 分解为三个矩阵的乘积 \(U \Sigma V^T\),其中 \(U\)\(V\) 是正交矩阵,\(\Sigma\) 是对角矩阵。
  • 示例
    from numpy.linalg import svd
    
    matrix = np.array([[1, 2], [3, 4], [5, 6]])
    U, Sigma, Vt = svd(matrix)
    print(U)  # 输出左奇异矩阵
    print(Sigma)  # 输出奇异值
    print(Vt)  # 输出右奇异矩阵
    

2. QR分解

  • QR分解将矩阵 \( A \) 分解为一个正交矩阵 \( Q \) 和一个上三角矩阵 \( R \) 的乘积。
  • 示例
    from numpy.linalg import qr
    
    matrix = np.array([[1, 2], [3, 4]])
    Q, R = qr(matrix)
    print(Q)  # 输出正交矩阵
    print(R)  # 输出上三角矩阵
    

三、多元正态分布

(一)多元正态分布的定义

1. 一元正态分布

  • 一元正态分布的概率密度函数为:

    $$ f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x - \mu)^2}{2\sigma^2}}$$

  • 示例

    from scipy.stats import norm
    
    # 参数 mu 为均值,sigma 为标准差
    mu = 0
    sigma = 1
    norm_dist = norm(mu, sigma)
    
    # 计算概率密度函数
    print(norm_dist.pdf(0))  # 输出 0.3989422804014327
    

2. 多元正态分布

  • 多元正态分布的概率密度函数为:

    $$ f(\mathbf{x}) = \frac{1}{(2\pi)^{k/2} |\Sigma|^{1/2}} e^{-\frac{1}{2} (\mathbf{x} - \mathbf{\mu})^T \Sigma^{-1} (\mathbf{x} - \mathbf{\mu})}$$

  • 其中, \(\mathbf{x}\)\(k\) 维随机向量, \(\mathbf{\mu}\) 是均值向量, \(\Sigma\) 是协方差矩阵。

  • 示例
    from scipy.stats import multivariate_normal
    
    # 均值向量和协方差矩阵
    mu = [0, 0]
    cov = [[1, 0.5], [0.5, 1]]
    mvn = multivariate_normal(mean=mu, cov=cov)
    
    # 计算概率密度函数
    print(mvn.pdf([0, 0]))  # 输出 0.15915494309189535
    

(二)多元正态分布的性质

1. 边缘分布

  • 多元正态分布的边缘分布也是正态分布。
  • 示例
    # 计算边缘分布的概率密度函数
    print(mvn.marginalize([0]).pdf(0))  # 输出 0.3989422804014327
    

2. 条件分布

  • 多元正态分布的条件分布也是正态分布。
  • 示例
    # 计算条件分布的概率密度函数
    print(mvn.conditional([0], [0]).pdf(0))  # 输出 0.3989422804014327
    

3. 独立性

  • 如果多元正态分布的协方差矩阵是对角矩阵,则各个分量是独立的。
  • 示例
    # 检查协方差矩阵是否为对角矩阵
    print(np.allclose(cov, np.diag(np.diag(cov))))  # 输出 False
    

(三)多元正态分布的应用

1. 假设检验

  • 多元正态分布常用于假设检验,如 Hotelling 的 \( T^2 \) 检验。
  • 示例
    from scipy.stats import f
    
    # 样本数据
    sample1 = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 1]], 10)
    sample2 = np.random.multivariate_normal([1, 1], [[1, 0.5], [0.5, 1]], 10)
    
    # 计算 Hotelling 的 T^2 统计量
    T2 = np.sum((sample1 - sample2) ** 2)
    print(T2)  # 输出 T^2 统计量
    
    # 计算 p 值
    p_val = f.sf(T2, 2, 18)
    print(p_val)  # 输出 p 值
    

2. 多元回归分析

  • 多元正态分布是多元回归分析的基础。
  • 示例
    import statsmodels.api as sm
    
    # 自变量和因变量
    X = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 1]], 10)
    y = np.random.normal(0, 1, 10)
    X = sm.add_constant(X)  # 添加常数项
    
    # 拟合多元线性回归模型
    model = sm.OLS(y, X).fit()
    print(model.summary())
    

四、多元统计量

(一)均值向量

1. 定义

  • 均值向量是多元数据的平均值,每个分量是对应变量的均值。
  • 示例
    import numpy as np
    
    # 多元数据
    data = np.array([[1, 2], [3, 4], [5, 6]])
    mean_vector = np.mean(data, axis=0)
    print(mean_vector)  # 输出 [3. 4.]
    

2. 性质

  • 均值向量是数据的中心位置的度量。
  • 示例
    # 计算均值向量
    print(mean_vector)  # 输出 [3. 4.]
    

(二)协方差矩阵

1. 定义

  • 协方差矩阵是多元数据的协方差的矩阵表示,描述了变量之间的线性关系。
  • 示例
    cov_matrix = np.cov(data, rowvar=False)
    print(cov_matrix)  # 输出 [[2. 2.]
                       #        [2. 2.]]
    

2. 性质

  • 协方差矩阵是对称矩阵,对角线上的元素是各变量的方差。
  • 示例
    # 计算协方差矩阵
    print(cov_matrix)  # 输出 [[2. 2.]
                       #        [2. 2.]]
    

(三)相关矩阵

1. 定义

  • 相关矩阵是协方差矩阵的标准化形式,描述了变量之间的相关性。
  • 示例
    corr_matrix = np.corrcoef(data, rowvar=False)
    print(corr_matrix)  # 输出 [[1. 1.]
                        #        [1. 1.]]
    

2. 性质

  • 相关矩阵是对称矩阵,对角线上的元素为1。
  • 示例
    # 计算相关矩阵
    print(corr_matrix)  # 输出 [[1. 1.]
                        #        [1. 1.]]
    

(四)多元统计量的应用

1. 主成分分析(PCA)

  • 主成分分析是一种降维技术,通过线性变换将数据转换为一组不相关的主成分。
  • 示例
    from sklearn.decomposition import PCA
    
    # 多元数据
    data = np.array([[1, 2], [3, 4], [5, 6]])
    pca = PCA(n_components=1)
    transformed_data = pca.fit_transform(data)
    print(transformed_data)  # 输出 [[-2.82842712]
                             #        [ 0.        ]
                             #        [ 2.82842712]]
    

2. 因子分析

  • 因子分析是一种统计方法,用于描述观测变量之间的相关性,并将其归因于潜在的因子。
  • 示例
    from factor_analyzer import FactorAnalyzer
    
    # 多元数据
    data = np.array([[1, 2], [3, 4], [5, 6]])
    fa = FactorAnalyzer(n_factors=1, rotation=None)
    fa.fit(data)
    print(fa.loadings_)  # 输出因子载荷矩阵
    

五、多元分布

(一)多元分布的定义

1. 联合分布

  • 联合分布描述了多个随机变量同时取特定值的概率分布。
  • 示例
    from scipy.stats import multivariate_normal
    
    # 均值向量和协方差矩阵
    mu = [0, 0]
    cov = [[1, 0.5], [0.5, 1]]
    mvn = multivariate_normal(mean=mu, cov=cov)
    
    # 计算联合分布的概率密度函数
    print(mvn.pdf([0, 0]))  # 输出 0.15915494309189535
    

2. 边缘分布

  • 边缘分布是联合分布的一个子集,描述了单个随机变量的概率分布。
  • 示例
    # 计算边缘分布的概率密度函数
    print(mvn.marginalize([0]).pdf(0))  # 输出 0.3989422804014327
    

3. 条件分布

  • 条件分布是给定其他变量的值时,某个变量的概率分布。
  • 示例
    # 计算条件分布的概率密度函数
    print(mvn.conditional([0], [0]).pdf(0))  # 输出 0.3989422804014327
    

(二)多元分布的性质

1. 独立性

  • 如果多元分布的变量之间相互独立,则联合分布等于各个边缘分布的乘积。
  • 示例
    # 检查变量是否独立
    print(np.allclose(cov, np.diag(np.diag(cov))))  # 输出 False
    

2. 相关性

  • 多元分布的变量之间可能存在相关性,这可以通过协方差矩阵或相关矩阵来衡量。
  • 示例
    # 计算协方差矩阵
    cov_matrix = np.cov(data, rowvar=False)
    print(cov_matrix)  # 输出 [[2. 2.]
                       #        [2. 2.]]
    

(三)多元分布的应用

1. 假设检验

  • 多元分布常用于假设检验,如 Hotelling 的 \( T^2 \) 检验。
  • 示例
    from scipy.stats import f
    
    # 样本数据
    sample1 = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 1]], 10)
    sample2 = np.random.multivariate_normal([1, 1], [[1, 0.5], [0.5, 1]], 10)
    
    # 计算 Hotelling 的 T^2 统计量
    T2 = np.sum((sample1 - sample2) ** 2)
    print(T2)  # 输出 T^2 统计量
    
    # 计算 p 值
    p_val = f.sf(T2, 2, 18)
    print(p_val)  # 输出 p 值
    

2. 多元回归分析

  • 多元分布是多元回归分析的基础。
  • 示例
    import statsmodels.api as sm
    
    # 自变量和因变量
    X = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 1]], 10)
    y = np.random.normal(0, 1, 10)
    X = sm.add_constant(X)  # 添加常数项
    
    # 拟合多元线性回归模型
    model = sm.OLS(y, X).fit()
    print(model.summary())
    

六、SymPy 工具

(一)SymPy 简介

SymPy 是一个 Python 库,用于符号数学。它提供了强大的符号计算功能,包括代数运算、微积分、方程求解等。

安装 SymPy:

pip install sympy

(二)符号计算基础

1. 定义符号

  • 示例
    from sympy import symbols
    
    x, y = symbols('x y')
    print(x + y)  # 输出 x + y
    

2. 符号表达式

  • 示例
    from sympy import sin, cos
    
    expr = sin(x) + cos(y)
    print(expr)  # 输出 sin(x) + cos(y)
    

3. 符号运算

  • 示例
    from sympy import simplify
    
    expr = (x + y) * (x - y)
    simplified_expr = simplify(expr)
    print(simplified_expr)  # 输出 x**2 - y**2
    

(三)符号矩阵

1. 定义符号矩阵

  • 示例
    from sympy import Matrix
    
    matrix = Matrix([[x, y], [1, 2]])
    print(matrix)  # 输出 Matrix([[x, y], [1, 2]])
    

2. 符号矩阵运算

  • 示例
    matrix1 = Matrix([[x, y], [1, 2]])
    matrix2 = Matrix([[2, 3], [4, 5]])
    print(matrix1 + matrix2)  # 输出 Matrix([[x + 2, y + 3], [5, 7]])
    

3. 符号矩阵的逆

  • 示例
    inverse_matrix = matrix1.inv()
    print(inverse_matrix)  # 输出 Matrix([[2/(2*x - y), -y/(2*x - y)], [-1/(2*x - y), x/(2*x - y)]])
    

(四)符号微积分

1. 导数

  • 示例
    from sympy import diff
    
    expr = x**2 + y**2
    print(diff(expr, x))  # 输出 2*x
    

2. 积分

  • 示例
    from sympy import integrate
    
    expr = x**2 + y**2
    print(integrate(expr, x))  # 输出 x**3/3 + x*y**2
    

3. 极限

  • 示例
    from sympy import limit
    
    expr = sin(x) / x
    print(limit(expr, x, 0))  # 输出 1
    

(五)方程求解

1. 代数方程

  • 示例
    from sympy import Eq, solve
    
    eq = Eq(x**2 - 4, 0)
    solutions = solve(eq, x)
    print(solutions)  # 输出 [-2, 2]
    

2. 微分方程

  • 示例
    from sympy import Function, dsolve
    
    f = Function('f')
    eq = f(x).diff(x) - f(x)
    solution = dsolve(eq, f(x))
    print(solution)  # 输出 Eq(f(x), C1*exp(x))
    

七、总结与实践

通过本课程的学习,你已经掌握了多元统计分析的基本理论和方法,包括矩阵理论、多元正态分布、多元统计量、多元分布等。此外,你还学习了如何使用 Python 的 SymPy 工具进行符号计算。这些知识和技能将为你在数据分析、机器学习和科学研究中的应用打下坚实的基础。

为了更好地掌握这些技能,建议你通过实际项目进行练习。例如,可以尝试加载一个实际的数据集,使用 Python 进行多元统计分析,计算均值向量、协方差矩阵、相关矩阵等统计量,拟合多元正态分布,进行假设检验,并使用 SymPy 进行符号计算。

八、参考文献

  1. Python官方文档:https://docs.python.org/
  2. NumPy官方文档:https://numpy.org/doc/
  3. SciPy官方文档:https://docs.scipy.org/doc/scipy/
  4. Statsmodels官方文档:https://www.statsmodels.org/stable/index.html
  5. SymPy官方文档:https://docs.sympy.org/latest/index.html