文章目录
子空间学习(Subspace Learning)是机器学习和数据挖掘领域中的一种重要方法,主要用于处理
高维数据的降维
、
特征提取
、
数据表示
和
分类
等问题。这一概念源自线性代数,并在统计学、模式识别、计算机
视觉
等多个学科中得到广泛应用。以下是子空间学习的基本概念和几个关键方面的介绍:
基本概念
在数学中,尤其是在线性代数框架下,子空间指的是一个向量空间 (V) 内的非空集合,这个集合本身也是一个向量空间,满足加法封闭、标量乘法封闭以及包含零向量的性质。在机器学习的上下文中,子空间学习通常涉及寻找一个低维线性子空间
,该子空间能够有效捕获或近似高维数据的主要特征。
目的与应用
-
降维:高维数据往往伴随着维度灾难,即随着特征维度的增加,所需的样本数量呈指数级增长才能准确估计模型参数。子空间学习通过
将数据投影到低维空间
来缓解这个问题,降低计算复杂度并减少过拟合
风险。 -
特征提取:在许多情况下,原始数据的特征可能是
冗余或无关的
。通过子空间学习,可以提取出一组更具代表性的特征,这些特征能够更好地反映数据的本质结构。 -
数据可视化:将
高维数据映射到二维或三维空间
,以便人类直观理解和分析。 -
分类与聚类:在
低维
子空间中,数据的类别边界可能更加清晰,从而有利于分类和聚类算法的表现。
主要方法
-
主成分分析(PCA):是最经典的
线性
降维技术之一,它寻找数据方差最大
的方向,作为新的坐标轴。 -
线性判别分析(LDA):在考虑类别标签的情况下,寻找
最大化类别间距离
同时最小化类别内距离
的子空间。 -
独立成分分析(ICA):假设数据是由一些统计独立的源信号混合而成,目的是恢复这些源信号,常用于
盲源分离
问题。 -
非负矩阵分解(NMF):限制因子分解中的系数为非负,适合于
图像和文本数据
的表示,因为它可以产生更具有解释性的表示。 -
字典学习:通过学习一个原子集(字典)来表示数据,每个数据点可以用字典中的少数几个原子的线性组合来近似。
-
多视图学习:
当数据有多种表示(即多个视图)时,子空间学习旨在融合这些视图的信息,以增强模型的鲁棒性和泛化能力。
实现步骤
- 数据预处理:包括
标准化
、去噪
等操作,确保数据质量。 - 选择或设计子空间模型:根据问题需求选择合适的
子空间学习
算法。 - 参数调优:对于许多子空间学习算法,存在
超参数
需要通过交叉验证
等方式进行优化。 - 模型训练:利用选定的算法和数据进行模型训练,找到最佳的子空间。
- 降维与分析:将原始数据投影到学习到的子空间上,进行进一步的分析或应用。
子空间学习是现代数据分析和机器学习领域不可或缺的一部分,它在图像处理
、自然语言处理、生物信息学、推荐系统
等多个领域都有广泛的应用。
PCA方法例子
PCA计算步骤与公式
1. 数据中心化
假设我们有 (n) 个样本,每个样本有 (p) 个特征,记为
X
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
T
\mathbf{X} = [\mathbf{x_1}, \mathbf{x_2}, ..., \mathbf{x_n}]^T
X=[x1,x2,...,xn]T
其中
x
i
是第
i
个样本的特征向量。
其中\mathbf{x_i} 是第 i 个样本的特征向量。
其中xi是第i个样本的特征向量。
数据中心化
是减去样本均值:
X
~
=
X
−
x
ˉ
1
T
\mathbf{\tilde{X}} = \mathbf{X} - \mathbf{\bar{x}}\mathbf{1}^T
X~=X−xˉ1T
其中,
x
ˉ
是所有样本特征的平均值向量,
1
是一个全
1
向量。
其中,\mathbf{\bar{x}} 是所有样本特征的平均值向量,\mathbf{1} 是一个全1向量。
其中,xˉ是所有样本特征的平均值向量,1是一个全1向量。
2. 计算协方差矩阵
协方差矩阵 C 描述了特征间的相关性:
C
=
1
n
−
1
X
~
T
X
~
\mathbf{C} = \frac{1}{n-1}\mathbf{\tilde{X}}^T\mathbf{\tilde{X}}
C=n−11X~TX~
3. 计算特征值和特征向量
解方程 C v = λ v ,得到特征值 λ i 和对应的特征向量 v i 。特征值按降序排列,特征向量单位化。 解方程 \mathbf{Cv} = \lambda\mathbf{v},得到特征值 \lambda_i 和对应的特征向量 \mathbf{v}_i。特征值按降序排列,特征向量单位化。 解方程Cv=λv,得到特征值λi和对应的特征向量vi。特征值按降序排列,特征向量单位化。
4. 选择主成分
选择前 (k) 个最大的特征值对应的特征向量 v 1 , v 2 , . . . , v k 构成矩阵 V k \mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_k构成矩阵 \mathbf{V}_k v1,v2,...,vk构成矩阵Vk
5. 数据转换
将原始数据转换到低维空间:
Z
=
X
~
V
k
\mathbf{Z} = \mathbf{\tilde{X}}\mathbf{V}_k
Z=X~Vk
其中,Z 是转换后的低维数据。
Python代码示例
下面是一个使用Python和NumPy手动实现PCA的简单示例,不使用任何外部库进行特征值分解和数据转换。
import numpy as np
# 假设数据X (n_samples, n_features)
X = np.random.rand(100, 10000) # 示例数据,100个样本,每个样本10000维
# 步骤1: 数据中心化
mean = np.mean(X, axis=0)
X_centered = X - mean
# 步骤2: 计算协方差矩阵
covariance_matrix = np.dot(X_centered.T, X_centered) / (X.shape[0] - 1)
# 步骤3: 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
# 按特征值降序排序
idx = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
# 选择前k个主成分,这里假设k=100
k = 100
V_k = eigenvectors[:, :k]
# 步骤5: 数据转换
Z = np.dot(X_centered, V_k)
print("转换后的低维数据Z的形状:", Z.shape)
这段代码展示了如何手动执行PCA的计算过程,包括数据预处理、计算协方差矩阵、特征值分解以及数据转换。实际应用中,使用专业的库如scikit-learn
的PCA类会更加便捷且高效,因为这些库内部已经优化了计算过程,并提供了更多高级功能。
多视图学习方法例子
多视图学习旨在结合来自不同来源或表示形式
的数据(称为“视图”),以提高模型的性能
和鲁棒性
。以下是一个使用多视图学习方法的示例,特别是结合PCA(主成分分析)和LDA(线性判别分析)来处理人脸图像识别任务
。我们将使用两个视图:灰度图像和边缘图像。
问题设定
假设我们有一个带标签的人脸图像数据集,每张图片有两个版本:原始灰度图像和边缘提取后的图像。我们的目标是构建一个多视图模型
,以提高人脸识别的准确率。
方法步骤
1. 数据预处理
- 对于每个视图(灰度和边缘),进行独立的数据预处理,包括
规范化和中心化。
2. 特征提取 - 视图独立的PCA
- 对每个视图独立应用PCA:
- 计算每个视图的协方差矩阵。
- 分解协方差矩阵以获取特征值和特征向量。
- 选取前(k)个特征向量,形成该视图的降维矩阵 V k g r a y 和 V k e d g e V^{gray}_k和V^{edge}_k Vkgray和Vkedge
3. 子空间融合
- 将每个样本在两个子空间上的投影结果合并,可以是简单的拼接
(
Z
=
[
Z
g
r
a
y
;
Z
e
d
g
e
]
)
(Z = [Z^{gray}; Z^{edge}])
(Z=[Zgray;Zedge])或者采用更复杂的融合策略,如
加权融合或
基于学习`的融合。
4. LDA进行分类
- 在融合后的低维特征上应用LDA,进一步减少维度的同时增强类间可分性。LDA
基于类别的标签
来寻找最优的方向,使得类间距离最大化,类内距离最小化。
5. 模型评估
- 使用
交叉验证
或留出法
等策略评估模型性能,比如计算识别准确率。
多视图学习实例:结合PCA与LDA进行人脸识别
问题背景
假设有一个人脸识别任务,我们有两个视图的数据:
灰度图像(
X
g
r
a
y
)和
H
O
G
特征图像(
X
H
O
G
)
灰度图像(X^{gray})和HOG特征图像(X^{HOG})
灰度图像(Xgray)和HOG特征图像(XHOG)
目标是利用多视图学习方法提高识别精度。
方法概述
我们将使用主成分分析(PCA)分别在两个视图上进行降维
,然后通过简单拼接
的方式融合这两个视图的特征,最后使用线性判别分析(LDA)进行分类
。
公式与计算步骤
1. 数据预处理
- 对每个视图 X v i e w 进行标准化处理,使其均值为 0 ,方差为 1 。 对每个视图 X^{view}进行标准化处理,使其均值为0,方差为1。 对每个视图Xview进行标准化处理,使其均值为0,方差为1。
2. PCA降维
对于每个视图 i ( i ∈ { g r a y , H O G } ),执行以下步骤: 对于每个视图 i(i \in \{gray, HOG\}),执行以下步骤: 对于每个视图i(i∈{gray,HOG}),执行以下步骤:
- 计算协方差矩阵 C i = 1 n − 1 ( X i − X ˉ i ) ( X i − X ˉ i ) T ,其中 X ˉ i 是视图 i 的样本均值向量。 计算协方差矩阵 C^{i} = \frac{1}{n-1}(X^{i} - \bar{X}^{i})(X^{i} - \bar{X}^{i})^T,其中 \bar{X}^{i} 是视图 i 的样本均值向量。 计算协方差矩阵Ci=n−11(Xi−Xˉi)(Xi−Xˉi)T,其中Xˉi是视图i的样本均值向量。
- 解特征值问题 C i v j i = λ j i v j i 得到特征值 λ j i 和对应的特征向量 v j i 。 解特征值问题 C^{i}v^{i}_j = \lambda^{i}_j v^{i}_j 得到特征值 \lambda^{i}_j和对应的特征向量 v^{i}_j。 解特征值问题Civji=λjivji得到特征值λji和对应的特征向量vji。
- 选取前 k 个最大的特征值对应的特征向量,构成降维矩阵 P k i = [ v 1 i , v 2 i , . . . , v k i ] 。 选取前 k个最大的特征值对应的特征向量,构成降维矩阵 P^{i}_k = [v^{i}_1, v^{i}_2, ..., v^{i}_k]。 选取前k个最大的特征值对应的特征向量,构成降维矩阵Pki=[v1i,v2i,...,vki]。
- 通过 Z i = X i P k i 将原始数据转换到低维空间。 通过 Z^{i} = X^{i}P^{i}_k将原始数据转换到低维空间。 通过Zi=XiPki将原始数据转换到低维空间。
3. 特征融合
- 将两个视图的降维特征简单拼接: Z c o m b i n e d = [ Z g r a y , Z H O G ] Z_{combined} = [Z^{gray}, Z^{HOG}] Zcombined=[Zgray,ZHOG]
4. LDA分类
- 使用LDA对融合后的特征进行分类,LDA的目标是找到一个投影矩阵 (W),最大化类间散度同时最小化类内散度。
- 类间散度矩阵 S B = ∑ c = 1 C ( μ c − μ ) ( μ c − μ ) T ,其中 μ c 是类别 c 的均值向量, μ 是所有样本的总体均值。 类间散度矩阵 S_B = \sum_{c=1}^C (\mu_c - \mu)(\mu_c - \mu)^T,其中 \mu_c 是类别 c 的均值向量,\mu 是所有样本的总体均值。 类间散度矩阵SB=c=1∑C(μc−μ)(μc−μ)T,其中μc是类别c的均值向量,μ是所有样本的总体均值。
- 类内散度矩阵 S W = ∑ c = 1 C ∑ x ∈ c ( x − μ c ) ( x − μ c ) T 。 类内散度矩阵 S_W = \sum_{c=1}^C \sum_{x \in c} (x - \mu_c)(x - \mu_c)^T。 类内散度矩阵SW=c=1∑Cx∈c∑(x−μc)(x−μc)T。
- 寻找 W 使得 ∣ W T S B W ∣ ∣ W T S W W ∣ 最大,通常通过求解广义特征值问题实现。 寻找 W 使得 \frac{|W^TS_BW|}{|W^TS_WW|} 最大,通常通过求解广义特征值问题实现。 寻找W使得∣WTSWW∣∣WTSBW∣最大,通常通过求解广义特征值问题实现。
Python代码示例
import numpy as np
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 生成模拟数据集
np.random.seed(42) # 确保结果可复现
num_samples = 1000
num_features = 10 # 每个视图的特征数
num_classes = 6 # 假设类别数为6
# 生成随机的灰度图像特征和HOG特征数据
X_gray = np.random.rand(num_samples, num_features)
X_hog = np.random.rand(num_samples, num_features)
# 添加一些类别的区分度(简化处理,实际中不会如此简单)
for i in range(num_samples):
if i % num_classes < 2:
X_gray[i] += 1
elif i % num_classes < 4:
X_gray[i] -= 1
if (i // num_classes) % 2 == 0:
X_hog[i] += 1
else:
X_hog[i] -= 1
# 合并特征,并添加标签
X = np.hstack((X_gray, X_hog))
y = np.repeat(np.arange(num_classes), num_samples // num_classes)
# 确保X和y的长度一致,这里是个临时解决办法,实际应用中应确保数据处理逻辑正确
min_length = min(X.shape[0], len(y))
X = X[:min_length]
y = y[:min_length]
# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 再次检查长度一致性,现在应该匹配了
assert X_scaled.shape[0] == len(y), "The number of samples in X_scaled and y still do not match."
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.25, random_state=42, stratify=y)
# 对训练数据进行PCA降维
pca_gray = PCA(n_components=2)
pca_hog = PCA(n_components=2)
Z_gray_train = pca_gray.fit_transform(X_train[:, :num_features])
Z_hog_train = pca_hog.fit_transform(X_train[:, num_features:])
# 特征融合(注意这里仅在训练数据上进行)
Z_combined_train = np.hstack((Z_gray_train, Z_hog_train))
# LDA分类(仅在训练数据上fit)
lda = LinearDiscriminantAnalysis()
lda.fit(Z_combined_train, y_train)
# 对测试数据进行相同的PCA变换
Z_test_gray = pca_gray.transform(X_test[:, :num_features])
Z_test_hog = pca_hog.transform(X_test[:, num_features:])
Z_test_combined = np.hstack((Z_test_gray, Z_test_hog))
# 预测并评估
y_pred = lda.predict(Z_test_combined)
print("Accuracy:", accuracy_score(y_test, y_pred))