第七讲(下) 矩阵、多元分布特征与符号代数
一、本讲介绍
欢迎来到多元统计分析课程。在本课程中,我们将深入探讨多元统计分析的核心内容,包括矩阵理论、多元正态分布、多元统计量、多元分布等。此外,我们还将介绍如何使用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. 一元正态分布
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:
(二)符号计算基础
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 进行符号计算。
八、参考文献
- Python官方文档:https://docs.python.org/
- NumPy官方文档:https://numpy.org/doc/
- SciPy官方文档:https://docs.scipy.org/doc/scipy/
- Statsmodels官方文档:https://www.statsmodels.org/stable/index.html
- SymPy官方文档:https://docs.sympy.org/latest/index.html