子空间学习


子空间学习(Subspace Learning)是机器学习和数据挖掘领域中的一种重要方法,主要用于处理 高维数据的降维特征提取数据表示分类等问题。这一概念源自线性代数,并在统计学、模式识别、计算机 视觉等多个学科中得到广泛应用。以下是子空间学习的基本概念和几个关键方面的介绍:

基本概念

在数学中,尤其是在线性代数框架下,子空间指的是一个向量空间 (V) 内的非空集合,这个集合本身也是一个向量空间,满足加法封闭、标量乘法封闭以及包含零向量的性质。在机器学习的上下文中,子空间学习通常涉及寻找一个低维线性子空间该子空间能够有效捕获或近似高维数据的主要特征。

目的与应用

  1. 降维:高维数据往往伴随着维度灾难,即随着特征维度的增加,所需的样本数量呈指数级增长才能准确估计模型参数。子空间学习通过将数据投影到低维空间来缓解这个问题,降低计算复杂度并减少过拟合风险。

  2. 特征提取:在许多情况下,原始数据的特征可能是冗余或无关的。通过子空间学习,可以提取出一组更具代表性的特征,这些特征能够更好地反映数据的本质结构。

  3. 数据可视化:将高维数据映射到二维或三维空间,以便人类直观理解和分析。

  4. 分类与聚类:在低维子空间中,数据的类别边界可能更加清晰,从而有利于分类和聚类算法的表现。

主要方法

  • 主成分分析(PCA):是最经典的线性降维技术之一,它寻找数据方差最大的方向,作为新的坐标轴。

  • 线性判别分析(LDA):在考虑类别标签的情况下,寻找最大化类别间距离同时最小化类别内距离的子空间。

  • 独立成分分析(ICA):假设数据是由一些统计独立的源信号混合而成,目的是恢复这些源信号,常用于盲源分离问题。

  • 非负矩阵分解(NMF):限制因子分解中的系数为非负,适合于图像和文本数据的表示,因为它可以产生更具有解释性的表示。

  • 字典学习:通过学习一个原子集(字典)来表示数据,每个数据点可以用字典中的少数几个原子的线性组合来近似。

  • 多视图学习当数据有多种表示(即多个视图)时,子空间学习旨在融合这些视图的信息,以增强模型的鲁棒性和泛化能力。

实现步骤

  1. 数据预处理:包括标准化去噪等操作,确保数据质量。
  2. 选择或设计子空间模型:根据问题需求选择合适的子空间学习算法。
  3. 参数调优:对于许多子空间学习算法,存在超参数需要通过交叉验证等方式进行优化。
  4. 模型训练:利用选定的算法和数据进行模型训练,找到最佳的子空间。
  5. 降维与分析:将原始数据投影到学习到的子空间上,进行进一步的分析或应用。

子空间学习是现代数据分析和机器学习领域不可或缺的一部分,它在图像处理、自然语言处理、生物信息学、推荐系统等多个领域都有广泛的应用。

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~=Xxˉ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=n11X~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 VkgrayVkedge
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\}),执行以下步骤: 对于每个视图ii{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=n11(XiXˉi)(XiXˉ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=1C(μ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=1Cxc(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使得WTSWWWTSBW最大,通常通过求解广义特征值问题实现。

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))
  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不易撞的网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值