当前位置: 首页 > news >正文

Sklearn 与 TensorFlow 机器学习实用指南-第八章 降维-笔记

补充:

本文是关于《Sklearn 与 TensorFlow 机器学习实用指南》的学习笔记,基于八、降维 - 【布客】Sklearn 与 TensorFlow 机器学习实用指南 第二版,感谢译者

本文和原文的区别:

本文会更精简、系统地表述书中概念,会对书中未介绍的陌生概念加以解释,每行我都会添加注释,介绍具体做了什么。

后续会持续更新所有章节

正文开始 ~
————————————————

当数据集的维度过高时,模型训练难度增大、过拟合风险上升且计算资源消耗剧增。这种现象通常被称为维数灾难(curse of dimentionality)。

应对策略:
降维:降低特征维度,减少特征数量,简化问题。

选择重要的维度,丢弃不太重要的:

例如,对于 MNIST 图片集,由于图片四周边缘部分的像素几乎总是白的,完全可以将这些像素从你的训练集中扔掉而不会丢失太多信息。

利用相邻像素的高度相关性,整合不同的维度:由于相邻像素的高度相关性,整合维度可以在不丢失太多信息的情况下有效地降低数据维度。

例如:
1. 空间金字塔
概念:将图像划分为不同尺度的子区域(如不同大小的块),并为每个子区域提取特征。
特点:
利用相邻像素的空间相关性,从多个尺度上捕捉图像信息。
减少维度的同时保留多尺度特征。

2. 局部特征提取
概念:通过滑动窗口或其他方法在图像中提取局部特征(如SIFT、HOG)。
特点:
捕捉相邻像素的局部信息,同时减少全局维度。
可以通过降维技术(如PCA)进一步压缩特征向量。
 

3. 亚像素卷积
概念:将多个低分辨率图像的特征组合起来,恢复高分辨率的输出。
特点:
利用相邻像素的信息来提高分辨率,同时减少计算复杂度。
常用于超分辨率重建等任务。

4. 特征金字塔网络(FPN)
概念:通过不同层次的卷积操作提取多尺度特征图。
特点:
利用低层特征图中的细节信息和高层特征图中的语义信息,构建多层次的特征表示。
有效降低维度的同时保留丰富的图像内容。

5.平均池化(Average Pooling)
概念:将相邻像素进行平均或求和操作,得到低分辨率的特征图。
特点:
简单有效地降维,同时保留局部信息。
常用于减少计算量和参数数量。

6. 图像压缩与量化
概念:将相邻像素合并或进行某种形式的量化编码。
特点:
减少存储空间和传输带宽的需求。
可应用于实时视频处理和流媒体等场景。

降维的特点:
1. 在降维过程中可能会丢失某些信息,应该先尝试使用原始的数据来训练,如果训练速度太慢的话再考虑使用降维
2. 通过降维去除噪声或冗余特征(这种情况通常不会发生,它只会加快你训练的速度)
3. 降维将高维数据映射到二维或三维空间,便于直观展示和理解,便于可视化(Visualization)


在这一章里,会介绍:
两种主要的降维方法:投影(projection)和流形学习(Manifold Learning),
三种流行的降维技术:主成分分析(PCA),核主成分分析(Kernel PCA)和局部线性嵌入(LLE)。

1. 维度灾难

在低维空间中,大量数据点可能会集中在某些区域(如中心区域),在高维空间中,数据更倾向于分布在边界处(一个简单的理解思路参考https://www.kpfans.com/article/LmWKKJXWB3.html),且随机选取的点之间距离变得更大,主要是维度增加导致的数据稀疏性和欧氏距离的平方和累积效应(在高维空间中,即使每个坐标轴上的变化相对较小,由于平方和的积累效应,最终导致欧几里得距离显著增大)共同作用的结果。

维度过高的影响:
1. 距离度量失真:高维空间中点之间的相对距离变得不明显,难以区分。
2. 过拟合问题加剧:高维空间下,新增的新实例可能远离任何训练实例,这使得预测的可靠性远低于较低维度数据,模型可能过度适应训练数据,导致泛化能力下降,增加过拟合风险。

3. 计算复杂度上升:处理大量特征会显著增加计算时间和资源消耗。

补充:
理论上来说,维数爆炸的一个解决方案是增加训练集的大小从而达到拥有足够密度的训练集。不幸的是,在实践中,达到给定密度所需的训练实例的数量随着维度的数量呈指数增长。如果只有 100 个特征并且假设它们均匀分布在所有维度上,那么如果想要各个临近的训练实例之间的距离在 0.1 以内,需要比宇宙中的原子还要多的训练实例。

2. 降维的主要方法:投影与流形学习

这两种主要方法适用的情况:训练实例并不是在所有维度上均匀分布的。许多特征几乎是常数,而其他特征则高度相关。结果,所有训练实例实际上位于(或接近)高维空间的低维子空间内。

例如:左图,所有训练实例的分布都贴近一个平面:这是高维(3D)空间的较低维(2D)子空间。将每个训练实例垂直投影到这个子空间上,就可以得到的新 2D 数据集。如右图

 

上述方法就是投影,但投影并不总是降维的最佳方法。在很多情况下,子空间可能会扭曲和转动,例如瑞士滚动玩具数据集


简单地将数据集投射到一个平面上(例如,直接丢弃x3方向)会将瑞士卷的不同层叠在一起,如左图 。但是,真正想要的类似右图的 2D 数据集。

2.1 投影(Projection)

定义:通过线性变换,将高维数据映射到低维空间的降维方法
常见的投影方法包括主成分分析(PCA)、线性判别分析(LDA)等。

2.2 流形学习(Manifold Learning)

定义:流形学习是一种非线性的降维技术,旨在捕捉数据在高维空间中的内在流形结构。
常见的流形学习方法包括局部线性嵌入(LLE)、等距映射(Isomap)、拉普拉斯特征映射(Laplacian Eigenmap)等。

补充:


流形:是一个拓扑空间,它在每一点周围都有一个邻域,这个邻域与欧几里得空间(如平面或三维空间)在拓扑结构上相同。这种局部性质使得流形可以被“展开”或“映射”到欧几里得空间中进行分析。
例如:二维流形:最简单的例子是球面,它是一个二维流形,因为在每个点周围都可以找到一个与平面相同的邻域。


流形结构:流形结构指的是附加在流形上的额外数学属性或组织方式。这些结构可以赋予流形特定的行为或性质,使其适用于不同的应用场景。
例如:微分结构(Differentiable Structure):允许在流形上定义导数和积分等微积分运算,使得流形成为微分 manifold。


流形空间:指由一个或多个流形及其结构所构成的整体空间。它可以是一个单一的流形,也可以是多个流形通过某种方式组合而成的空间。


流形猜想(Manifold Hypothesis):机器学习中的一个重要假设,认为高维数据往往分布在某个低维的流形上。


以瑞士卷为例
例如,在第一行中,瑞士卷在三维空间中(图左上),分类边界会相当复杂,但在二维展开的流形空间中(图右上),分类边界是一条简单的直线,被分为两类。

但是,这个假设并不总是成立。例如,在图最下面一行,决策边界位于x1 = 5(图左下)。这个决策边界在原始三维空间(一个垂直平面)看起来非常简单,但在展开的流形中却变得更复杂了(四个独立线段的集合)(图右下)。

总结:
降维→训练速度会加快
降维≠更好的训练效果,效果取决于数据集

投影和流形学习的区别:
线性 vs 非线性:投影通常是线性的,而流形学习是非线性的。
全局 vs 局部特性:投影方法通常关注数据的整体结构(全局特性),而流形学习则关注数据的局部几何结构。

3. 主成分分析

定义:找到接近数据集分布的超平面,然后将所有的数据都投影到这个超平面上。


3.1 保留最大的方差

例如:图左侧是二维数据集,以及三个不同的轴。图右边是将数据集投影到每个轴上的结果。


原理:

对轴来说,由于高方差表示该方向上的数据变化较大,包含了更多关于数据分布的信息,因此通过优先选择高方差的方向进行投影,可以最大程度地保留原始数据中的信息,减少降维带来的信息损失。
上图中的轴的方差:实线轴的方差>虚线轴的方差>点线轴的方差

另一个角度来看,选择使得将原始数据集投影到该轴上的均方距离最小的轴。
均方距离(Mean Squared Distance, MSD):数据点在投影后与原始位置之间的平均平方距离。均方距离最小,意味着原始位置和投影后的位置差距越小,就更多的保留了原始数据中的信息

 

3.2 主成分(Principle Componets)

PCA选择的主成分轴的原则:第一个主成分具有最大的方差,后续的主成分与之前的主成分正交,并且在剩余空间中方差最大,依次类推。


定义:第i个轴的单位向量被称为第i个主成分(PC)

例如:在上面的图中,第一个 PC 是实线轴的单位向量c1,第二个 PC 是点线轴的单位向量c2。

主成分的方向不稳定:如果打乱训练集并再次运行 PCA,则某些新 PC 可能会指向与原始 PC 方向相反。但是,它们通常仍位于同一轴线上。在某些情况下,一对 PC 甚至可能会旋转或交换,但它们定义的平面通常保持不变。

如何找到训练集的主成分?
奇异值分解(SVD)的标准矩阵分解技术,可以将训练集矩阵X分解为三个矩阵U·Σ·V^T的点积,其中V^T包含我们想要的所有主成分

import numpy as np
X_centered = X - X.mean(axis=0)  # 中心化处理
U, s, V= np.linalg.svd(X_centered)  # 奇异值分解
c1 = V.T[:, 0]  # 第一个主成分
c2 = V.T[:, 1]  # 第二个

3.3 投影到d维空间

定义:确定了所有的主成分,就可以通过将数据集投影到由前d个主成分构成的超平面上,从而将数据集的维数降至d维。
如何投影:计算训练集矩阵X和Wd的点积

W2 = V.T[:, :2]  # Wd,V^T的前d列组成的矩阵,此时d=2,代表前两个主成分矩阵
X2D = X_centered.dot(W2)  # 将训练集投影到由前两个主成分定义的超平面上

3.4 使用 Scikit-Learn

from sklearn.decomposition import PCApca = PCA(n_components=2)  # n_components:将数据集的维度降至两维
X2D = pca.fit_transform(X)  # 降维数据,pca会自动处理数据的中心化
pca.components_.T[:, 0]  # 获得第一个主成分

3.5 方差解释率(Explained Variance Ratio)

定义:方差解释率表示位于每个主成分轴上的数据集方差的比例,反映了模型预测值与实际值之间的拟合程度。高值意味着模型对数据变化的解释能力较强。


值范围:在0到1之间。
1:模型完美解释数据变化
0:模型无法解释数据变化

print(pca.explained_variance_ratio_)
# [0.84248607  0.14631839]  84.2% 的数据集方差位于第一轴,14.6% 的方差位于第二轴

3.6 选择正确的维度

通常我们倾向于选择加起来到方差解释率能够达到足够占比(例如 95%)的维度的数量,而不是任意选择要降低到的维度数量。

pca = PCA()  # 不指定维度
pac.fit(X)  # 在不降维的情况下进行 PCA
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95)+1  # 计算出保留训练集方差 95% 所需的最小维数# 还有一种方法
pca = PCA(n_components=0.95)  # n_components设置为 0.0 到 1.0 之间的浮点数,表明希望保留的方差解释率
X_reduced = pca.fit_transform(X)

画出方差解释率关于维数的函数


参见图,曲线中通常会有一个肘部,方差解释率停止快速增长。可以将其视为数据集的真正的维度

3.7 PCA 压缩

通过应用 PCA 投影的逆变换,可以降维后的数据集解压缩回原维度,这并不会还原成最原始的数据,因为投影丢失了一些信息(在 5% 的方差内),但它可能非常接近原始数据
重构误差(reconstruction error):原始数据和重构数据之间的均方距离(压缩然后解压缩)

pca = PCA(n_components=154)  # n_components:将数据集的维度降至 154 维
X_mnist_reduced = pca.fit_transform(X_mnist)  # 将MNIST 数据压缩到154维
X_mnist_recovered = pca.inverse_transform(X_mnist_reduced)  # 解压缩回 784 维

前后图像的对比

逆变换的公式

3.8 增量 PCA(Incremental PCA)

先前 PCA 需要在内存中处理整个训练集,以便奇异值分解算法的运行

增量 PCA(IPCA)算法:将训练集分批,并一次只对一个批量使用 IPCA 算法
增量式PCA的优势:
适合大数据集:不需要一次性加载所有数据到内存
可以在线处理:逐批读取和更新模型参数
节省内存:特别适用于内存有限的环境
通过多次迭代更新主成分估计器,最终得到训练好的PCA模型

from sklearn.decomposition import IncrementalPCA  # 增量 PCAn_batches = 100
inc_pca = IncrementalPCA(n_components=154)
for X_batch in np.array_split(X_mnist, n_batches):  # 分成 100 个小批量inc_pca.partial_fit(X_batch)   # 对每一个最小批量使用 IPCA 算法
X_mnist_reduced = inc_pca.transform(X_mnist)  # 降维数据# 加载大文件数据时,可以用 np.memmap 将磁盘上的文件映射到内存,形成一个可以像数组一样访问的对象
X_mm = np.memmap(filename,  dtype='float32',  # filename:要打开的文件名mode='readonly',  # mode=readonly:以只读模式打开文件shape=(m, n))  # shape=(m, n):指定数组的形状,即有m行n列的数据
batch_size = m//n_batches
inc_pca = IncrementalPCA(n_components=154,   # n_components=154:指定要保留的主成分数量,即降维后的维度数batch_size=batch_size)  # batch_size=batch_size:每一批处理的数据量
inc_pca.fit(X_mm)  # 用于训练模型,接受数据输入,并计算主成分

3.9 随机 PCA(Randomized PCA)

定义:利用随机投影的思想,生成随机矩阵并与原始数据相乘,将高维数据映射到低维空间,基于随机矩阵理论,确保即使在降低维度后,主要的数据特征仍得以保留


优点:

引入随机性以减少计算复杂度,并能保持数据重要特征,特别适用于处理大数据集。计算复杂度是O(m × d^2) + O(d^3),而不是O(m × n^2) + O(n^3)
缺点:

由于使用了随机投影,结果可能会有一定的随机性,建议多次运行并取平均值以提高稳定性。需要确保数据在预处理阶段具有良好的分布特性,才能更好地捕捉主要特征

rnd_pca = PCA(n_components=154, svd_solver='randomized')  # 随机 PCA
X_reduced = rnd_pca.fit_transform(X_mnist)  # 降维数据

4.核 PCA(Kernel PCA)

在第5章中,我们讨论了核技巧,一种将实例隐式映射到非常高维空间(称为特征空间)的数学技术,让支持向量机可以应用于非线性分类和回归


核 PCA(kPCA):执行复杂的非线性投影来降低维度
优点:通常能够很好地保留投影后的簇,有时甚至可以展开分布近似于扭曲流形的数据集

具体步骤:
1. 数据预处理
标准化或归一化:确保各个特征具有相似的尺度,避免数值较大的特征主导分析
2. 核函数的选择
根据数据特性选择合适的核函数,常见的核函数包括:线性核、多项式核、径向基函数(RBF)核、sigmoid核,通过它将原始的低维数据点映射到一个高维甚至无穷维的空间中
(这个过程是隐式的,也就是说,我们不需要显式地计算出每个数据点在高维空间中的坐标,而是通过核矩阵来间接地表示这些信息)
3. 构建核矩阵
计算每个样本对之间的核函数值,形成一个n×n的核矩阵H。其中,H_ij = K(x_i, x_j)。这个矩阵包含了所有样本对之间的相似性度量
4. 在高维空间中进行PCA,中心化核矩阵
具体来说,我们需要计算高维空间中的协方差矩阵,并找到其中最大的特征值和对应的特征向量(主成分)。这些主成分对应的就是在原始输入空间中最能解释数据变化的方向
然而,直接计算高维空间的协方差矩阵是不现实的,因为维度可能非常高甚至无穷大,幸运的是,我们可以通过核矩阵H来间接地完成这个过程,我们可以利用核矩阵的迹和特征值分解来进行PCA分析
对核矩阵进行中心化处理,减去均值向量,得到中心化的核矩阵:H_centered = H - (1/n) * trace(H) * eye(n)
5. 特征值分解
# 对中心化的核矩阵进行特征值分解,计算其特征值和特征向量。特征值表示数据在对应方向上的方差,特征向量则是主成分的方向

 6. 选择主成分
根据特征值的大小顺序,保留前k个特征向量作为主要的主成分,忽略其余较小的特征值
7. 将主成分映射回原始空间
利用核矩阵和所选的主成分,用这些特征向量对原始数据进行线性组合,从而得到在输入空间中的低维表示
8. 应用与分析

 进行后续的数据分析、降维或可视化

from sklearn.decomposition import KernelPCArbf_pca = KernelPCA(n_components=2,  # 降维后的维度kernel='rbf',   # rbf核gamma=0.04  # rbf核函数中的参数)
X_reduced = rbf_pca.fit_transform(X)  # 降维数据

4.1 选择一种核并调整超参数

由于 kPCA 是无监督学习算法,因此没有明显的性能指标来确定最佳的核方法和超参数值。但是,降维通常是监督学习任务(例如分类)的准备步骤,因此可以使用网格搜索来选择让任务达到最佳表现的核方法和超参数

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipelineclf = Pipeline([("kpca", KernelPCA(n_components=2)),  # 执行核pca,将维度降至两维("log_reg", LogisticRegression())  # Logistic 回归分类
])
param_grid = [{"kpca__gamma": np.linspace(0.03, 0.05, 10),"kpca__kernel": ["rbf", "sigmoid"]}]
grid_search = GridSearchCV(clf, param_grid, cv=3)  # Grid SearchCV为 kPCA 找到最佳的核和gamma值
grid_search.fit(X, y)  # 拟合数据

另一种完全为非监督的方法,是选择产生最低重建误差的核和超参数,但是,由于核技巧,重建并不像线性 PCA 那样容易。
下图显示了原始瑞士卷3D数据集(左上角),并且使用RBF核应用kPCA后生成的二维数据集(右上角)。
由于核技巧,这在数学上等同于使用特征映射φ将训练集映射到无限维特征空间(右下),然后使用线性PCA将变换的训练集投影到 2D。


如果我们可以在缩减空间中对给定实例实现反向线性PCA步骤,则重构点将位于特征空间中,而不是位于原始空间中。但由于特征空间是无限维的,我们不能找出重建点,因此我们无法计算真实的重建误差。
幸运的是,可以在原始空间中找到一个贴近重建点的点。这被称为重建前图像(reconstruction pre-image),然后就可以测量其与原始实例的平方距离。然后,选择最小化重建前图像错误的核和超参数。

# 解决方案一:
# 训练一个监督回归模型
rbf_pca = KernelPCA(n_components=2,kernel="rbf",gamma=0.0433,fit_inverse_transform=True  # 将预计实例作为训练集,并将原始实例作为训练目标。KernelPCA仅仅当 fit_inverse_transform = True 的情况下才会创建inverse_tranfrom()方法)
X_reduced = rbf_pca.fit_transform(X)  # 降维数据
X_preimage = rbf_pca.inverse_transform(X_reduced)  # 重建数据# 计算误差
from sklearn.metrics import mean_squared_error
mean_squared_error(X, X_preimage)   # mse误差:32.786308795766132
# 然后使用交叉验证的方格搜索来寻找最小化重建前图像误差的核方法和超参数。

4.2 LLE(LocallyLinearEmbedding)

定义:非线性降维(NLDR)方法,而且是一种流形学习技术。LLE 首先测量每个训练实例与其最近邻(c.n.)之间的线性关系,然后寻找能最好地保留这些局部关系的训练集的低维表示(稍后会详细介绍) 
优点:特别擅长展开扭曲的流形,尤其是在没有太多噪音的情况下

from sklearn.manifold import LocallyLinearEmbeddinglle = LocallyLinearEmbedding(n_components=2,  # 降维后的维度n_neighbors=10  # 最近邻个数)
X_reduced = lle.fit_transform(X)  # 降维数据

如图,瑞士卷被完全展开,实例之间的距离保存得很好。但是,距离不能在较大范围内保留的很好:展开的瑞士卷的左侧被挤压,而右侧的部分被拉长。尽管如此,LLE 在对流形建模方面做得非常好。

工作原理:
1. 寻找最近邻: 对于每个数据点 x_i,找到其在高维空间中的 k 个最近邻居。这通常使用k近邻算法实现。
2. 计算局部重建权重:找到权重w[i, j]从而使x_i和Σ w[i, j] x_j, j = 1 -> m之间的平方距离尽可能的小
3. 构建权重矩阵:将所有点的权重组合成一个权重矩阵 W,其中非邻居对应的权重为零。
4. 降维过程:将高维数据 X 映射到低维空间,得到新的表示Z,使得每个z_i 满足类似的线性关系。z_i和Σ w_hat[i, j] z_j, j = 1 -> m之间的平方距离尽可能的小,注意,此时是保持权重不变,并在低维空间中找到实例图像的最佳位置
5. 求解低维映射:通过最小化上述误差函数,找到最优的低维表示Z,这通常涉及到矩阵分解或优化算法,如拉格朗日乘数法。
6. 结果输出:将高维数据点X映射到低维空间后的坐标矩阵Z,即为降维后的表示。

时间复杂度:查找k个最近邻为O(m log(m) n log(k)),优化权重为O(m n k^3),建立低维表示为O(d m^2)。不幸的是,最后一项m^2使得这个算法在处理大数据集的时候表现较差。

5. 其他降维方法

还有很多其他的降维方法,Scikit-Learn 支持其中的好几种。这里是其中最流行的:


5.1多维缩放(Multi-Dimensional Scaling, MDS)

定义:其核心思想是通过优化过程找到一个低维表示,使得样本之间的距离在低维和高维空间中尽可能相似。
基本步骤:
1. 计算距离矩阵:首先,在高维空间中计算所有样本对之间的距离,形成一个距离矩阵。
2. 求解低维配置:通过优化算法(如经典度量 MDS 使用加权最小二乘法),找到一组低维点,使得这些点之间的距离尽可能接近原始的高维距离矩阵。
3. 调整和改进:根据需要对结果进行调整,例如使用非线性方法或结合其他约束条件以提高表示的质量。
优点:
- 能够有效保持数据的整体结构和全局关系。
- 易于解释和可视化。
缺点:
- 在处理高维数据时可能计算复杂度较高。
- 对噪声数据较为敏感,可能导致降维后的结果不准确。


5.2 Isomap

定义:流形学习思想的降维技术,它通过构建最近邻图来捕捉数据的局部几何结构,并利用这些信息进行全局降维。特别适合处理具有非线性分布的数据集。

基本步骤:
1. 构建最近邻图:为每个样本找到其预定义数量的最近邻居,并建立一个邻接图。
2. 计算最短路*:通过广度优先搜索(BFS)或其他方法,计算图中每对节点之间的最短路径,形成一个相似性矩阵。
3. 应用主成分分析(PCA):对相似性矩阵进行 PCA 分析,得到低维表示。
优点:
能够有效地处理非线性数据分布。
具有良好的流形学习能力,能够捕捉到数据的潜在结构。
缺点:
计算复杂度较高,尤其是在处理大数据时。
对参数的选择(如最近邻居的数量)敏感,可能影响结果的质量。


5.3 t-分布随机邻域嵌入(t-SNE)

定义:一种基于概率的降维技术,主要用于高维数据的可视化。它结合了随机近邻和 t-分布的思想,能够在低维空间中保持数据的局部结构。
基本步骤:
1. 计算条件概率:在高维空间中,为每个点计算其与所有其他点之间的条件概率分布(条件概率是指在给定某个条件下,另一个事件发生的概率。)。
2. 定义t-分布:在低维空间中,使用 t-分布模拟这些条件概率。
3. 优化低维表示:通过梯度下降等优化算法,最小化两个分布之间的KL散度,得到最终的低维映射。
优点:
能够有效地保留数据的局部结构和簇的特性。
特别适合用于高维数据的二维或三维投影和可视化。
缺点:
对初始参数的选择较为敏感,可能导致收敛到局部最优解。
在处理大规模数据时计算效率较低。


5.4 LDA(线性判别分析)

定义:是一种监督降维技术,旨在最大化类内一致性的同时最小化不同类别之间的距离。它通过寻找最优的投影方向,将高维数据映射到低维空间中,使得不同类别在该空间中的可分性达到最佳。

基本步骤:
1. 计算散度矩阵:包括类内散度矩阵(Sw)和类间散度矩阵(Sb)。
2. 求解广义特征值问题:找到能够最大化类别分离的投影方向,通常通过求解广义特征值问题来实现。
3. 数据投影:将高维数据投影到由这些最优投影方向张成的空间中,得到低维表示。
优点:
- 能够有效地利用类别信息进行降维。
- 适用于分类任务中的特征提取和数据预处理。
缺点:
- 受限于类别数和特征数量的关系,当类别数较多时可能会遇到维度灾难问题。
- 对小样本数据或噪声数据较为敏感。

如图,使用不同的技术将瑞士卷降维至 2D

相关文章:

Sklearn 与 TensorFlow 机器学习实用指南-第八章 降维-笔记

补充: 本文是关于《Sklearn 与 TensorFlow 机器学习实用指南》的学习笔记,基于八、降维 - 【布客】Sklearn 与 TensorFlow 机器学习实用指南 第二版,感谢译者 本文和原文的区别: 本文会更精简、系统地表述书中概念,…...

动态贴纸+美颜SDK的融合实现:底层架构与性能优化技术全解析

如今,美颜动态贴纸功能已经成为提升用户粘性与平台竞争力的“标配”。但从技术实现角度看,如何高效融合动态贴纸与美颜SDK,并在保证画质与流畅度的前提下实现稳定输出,仍然是一项复杂且极具挑战的工程。 本文将深入解析“动态贴纸…...

Git简介与入门

Git的发明 Git由著名的Linux创始人linus于2005年发明(所以git的界面、使用方式与Linux挺像的,即命令行方式) 经过发展,现在广泛应用于代码管理与团队协作。 Git特性 Git是分布式版本控制系统 分布式 每个开发者拥有完整仓库&…...

车载信息安全架构 --- 汽车网络安全

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

Elasticsearch 堆内存使用情况和 JVM 垃圾回收

作者:来自 Elastic Kofi Bartlett 探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收,包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。 堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。 从 7.11 版本开始&#xff…...

基于UDP协议的群聊服务器开发(C/C++)

目录 服务器 一、通信 打开网络文件 绑定IP地址与端口号 接收信息 二、数据处理 客户端 三、端口绑定 四、收发信息 五、源码 服务器 在服务器架构设计中,模块解耦是保障系统可维护性的核心准则。本方案采用分层架构将核心功能拆解为通信层与业务处理层两…...

通过自定义序列化来格式化BigDecimal带千分符的字符串

首先&#xff0c;你需要创建一个自定义的 JsonSerializer 来格式化 BigDecimal 为带千分符的字符串。 public class BigDecimalWithCommaSerializer extends JsonSerializer<BigDecimal> {Overridepublic void serialize(BigDecimal value, JsonGenerator gen, Serialize…...

VulnHub-DarkHole_2靶机渗透教程

1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/darkhole/darkhole_2.zip 直接使用VMware导入打开就行 注意&#xff1a;靶机的网络连接模式必须和kali一样&#xff0c;让靶机跟kali处于同一网段&#xff0c;这样kali才能扫出靶机…...

cf | Common Multiple

题目&#xff1a; 代码&#xff1a; 无注释版&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long signed main(){int t;cin>>t;while(t--){int n;cin>>n;map<int,int> mp;mp.clear();for(int i1;i<n;i){int x;cin…...

leetcode hot100尝试1

目录 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 c m…...

大模型Agent

一 大模型Agent是什么 &#xff08;一&#xff09;大模型Agent是指基于大语言模型的&#xff0c;能使用工具与外部世界进行交互的计算机程序 感知&#xff08;Perception&#xff09;&#xff1a; ● 家庭助理通过摄像头、麦克风、传感器等设备获取家庭成员的活动信息和环境状…...

阻塞队列的介绍和简单实现——多线程编程简单案例[多线程编程篇(4)]

目录 前言 阻塞队列 阻塞队列相比普通队列的优势 1.天然线程安全 2.实现生产者-消费者模型更加简单 3.自动等待与唤醒 生产者-消费者模型 JAVA标准库中的阻塞队列 阻塞队列的简单实现 前言 在现代软件开发中&#xff0c;多线程编程能力已经成为程序员必须掌握的一项核心…...

服务器配置环境-condapytorch_20250422

文章目录 前言一、conda环境1.1 创建固定python版本的conda环境1.2 激活 Conda 环境1.3 关闭 Conda 环境 二、版本查看CUDA版本当电脑里有多个CUDN时 对照表下载 资源 前言 一、conda环境 1.1 创建固定python版本的conda环境 conda create --name tang_py_3.12 python3.12.41…...

Android Gradle Plugin (AGP) 和 Gradle 的關係

Android Gradle Plugin (AGP) 与 Gradle 的核心关系解析 一、功能定位 Gradle 的通用性‌ Gradle 是跨平台构建工具&#xff0c;支持 Java、Kotlin、C 等多种语言&#xff0c;提供任务自动化、依赖管理等功能。 通过 build.gradle 文件定义构建脚本&#xff0c;管理编译、测试…...

字典树(前缀树)的实现(5)0423

字典树又称前缀树或Trie树&#xff0c;是处理字符串中常见的数据结构。假设组成所有单词的字符仅是"a"~"z"&#xff0c;请实现字典树结构&#xff0c;并包含以下四个功能。 void insert(String word) :添加word&#xff0c;可重复添加。 void delete(Str…...

PHP 反序列化原生类 TIPS字符串逃逸CVE 绕过漏洞属性类型特征

#PHP- 属性类型 - 共有 & 私有 & 保护 1 、对象变量属性&#xff1a; public( 公共的 ): 在本类内部、外部类、子类都可以访问 protect( 受保护的 ): 只有本类或子类或父类中可以访问 private( 私人的 ): 只有本类内部可以使用 2 、序列化数据显示&#xff1a; p…...

专题二十:路由策略与策略路由

一、路由策略 1.1 路由策略的概念 路由策略是通过修改路由表的路由条目来控制数据流量的可达性。即对接受和发布的路由进过滤。这种方式称为路由策略 路由策略功能相关作用控制路由的发布可通过路由策略对所要发布的路由信息进行过滤&#xff0c;只允许发布满足条件的路由信…...

Git 远程操作全攻略:从基础到实战

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Git 企业级应用 目录 一&#xff1a;&#x1f525; 理解分布式版本控制系统 二&#xff1a;&#x1f525; 远程仓库 &#x1f98b; 新建远程仓库&#x1f98b; 克隆远程仓库&#x1f98b; 向远程仓…...

VUE自动定义控件SwitchButton

<switch-button style"margin-left: 20rpx;" :buttons["一键打分", "快捷打分"] select"快捷打分" ButtonClick"SwitchButnClick"></switch-button> SwitchButton.vue <template><view class"Di…...

【数据可视化-24】巧克力销售数据的多维度可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

STM32---串口通信USART

目录 一、串口通信协议 二、USART模块介绍 &#xff08;1&#xff09;移位寄存器 &#xff08;2&#xff09;控制电路 &#xff08;3&#xff09;波特率 &#xff08;4&#xff09;C语言接口 三、串口的引脚初始化 &#xff08;1&#xff09;引脚分布表 &…...

YOLO11改进-Backbone-引入TransXNet替换YOLO backbone 学习全局和局部动态信息,提高检测精度

Vision Transformer 的缺陷&#xff1a;Vision Transformer&#xff08;ViT&#xff09;运用多头自注意力机制在计算机视觉领域取得进展&#xff0c;但它缺乏卷积神经网络&#xff08;CNNs&#xff09;所具有的归纳偏差&#xff0c;导致泛化能力相对较弱。像 Swin Transformer …...

SQL 多表查询:数据整合与分析的强大工具

SQL 多表查询&#xff1a;数据整合与分析的强大工具 在关系型数据库中&#xff0c;数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而&#xff0c;在实际应用中&#xff0c;往往需要对多个表中的数据进行整合查询&#xff0c;来获得更完整的信…...

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践&#xff1a;单通道采集芯片内部温度传感器&#xff08;ADC1_ch16&#xff09;&a…...

MacOS中安装Python(homebrew,pyenv)

前言 由于MacOS中自带Python&#xff0c;而自带的Python关联到许多系统组件&#xff0c;不推荐 禁止使用自带Python 安装homebrew包管理器 homebrew官网 打开终端&#xff08;terminal&#xff09;输入以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercon…...

从物理到预测:数据驱动的深度学习的结构化探索及AI推理

在当今科学探索的时代&#xff0c;理解的前沿不再仅仅存在于我们书写的方程式中&#xff0c;也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处&#xff0c;一个快速发展的领域正在兴起&#xff0c;它不仅观察宇宙&#xff0c;更是在学习宇宙。 AI推理 我们…...

新书速览|Hadoop与Spark大数据全景解析(视频教学版)

《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验&#xff0c;采用“理论实战”的形式&#xff0c;以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…...

Linux:42线程控制lesson30

代码1&#xff1a;验证join可以去的线程执行完后的退出码/返回值 #include<iostream> #include<unistd.h> #include<pthread.h> #include<string> using namespace std;void* routine(void* arg){string name static_cast<const char*>(arg);i…...

配置 Apache 的 HTTPS

证书文件 文件名 作用 来源 example.com.key 服务器的私钥&#xff0c;用于加密和解密数据。 本地生成 -----BEGIN PRIVATE KEY----- MIIEowIBAAKCAQEAqp5c... -----END PRIVATE KEY----- example.com.csr Certificate Signing Request 证书签名请求文件&#xff0c;包…...

【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入

GetX是Flutter生态中最受欢迎的轻量级全能框架&#xff0c;以其简洁的API设计和卓越的性能著称。本文将带你全面掌握GetX的核心功能和使用技巧&#xff0c;提升你的Flutter开发效率。 一、GetX框架核心优势 1. 三位一体架构设计 模块功能传统方案对比状态管理响应式状态控制…...

第四节:核心概念高频题-Vue生命周期钩子变化

重命名&#xff1a;beforeDestroy→beforeUnmount&#xff0c;destroyed→unmounted 新增&#xff1a;onServerPrefetch&#xff08;SSR场景&#xff09; Vue 生命周期钩子变化详解&#xff08;Vue2 → Vue3&#xff09; 一、核心钩子重命名与语义优化 销毁阶段语义化升级 • …...

安全邮件系统的Maple实现详解

代码改进版&#xff1a; # # 安全邮件系统实现 - 结合DES和RSA加密 # 功能&#xff1a;实现安全的消息加密、签名和传输 # # -------------------------- # 第一部分&#xff1a;消息准备和加密 # --------------------------# 原始消息内容 message : "This is an atte…...

VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)

参考&#xff1a; 安装VTK 详细图文讲解CMake编译VTK&#xff0c;包含详细的编译环境版本 Visual Studio 2022 配置VTK9.3.0 VTK-8.2.0源码编译和初步使用(CmakeVS2015Qt5.14.2) 文章目录 下载编译编译环境介绍配置CMake信息BUILD_SHARED_LIBS控制生成的库是动态链接库&#xf…...

【playwright】学习--持续汇总

seleniumplaywrightselenium 需要结合其他自动化框架&#xff0c;比如pytest之后才能支持web自动化测试playwright 不需要其他自动化框架selenium库》webdriver》浏览器驱动playwright库》playwright driver》浏览器驱动 目录 安装playwright通过pip安装通过VScode安装 安装pla…...

深度解析算法之模拟

39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…...

leetcode刷题日记——插入区间

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; intervals 有序&#xff0c;需要将一个新的范围插入&#xff0c;然后进行整合方法一&#xff0c;将新的范围插入原 intervals 区间&#xff0c;然后使用 56 题的合并区间函数直接解决方法二&#xff0c; 找出能够包容 newInte…...

gbase8s存储学习一 rootdbs存储结构以及寻址分析

主要层次自下而上为 最小物理存储单元page &#xff0c;多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace&#xff0c;多个dbspace 组成一个数据库实例 在数据库初始化阶段会生成一个rootdbs表空间&#xff0c;该表空…...

学习设计模式《五》——工厂方法模式

一、基础概念 工厂方法模式的本质是【延迟到子类来选择实现】&#xff1b; 工厂方法模式的定义&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类&#xff0c;FactoryMethod使一个类的实例化延迟到其子类 。 工厂方法模式的功能 序号说明0工厂方法模…...

如何将 Azure Active Directory (Azure AD) 作为 SAML IdP 对接到 Keycloak

✅ 一、在 Azure AD 创建 SAML 应用 &#x1f527; 1. 登录 Azure 门户 前往 https://portal.azure.com&#xff0c;使用管理员账号登录。 &#x1f4cc; 2. 创建企业应用&#xff08;Enterprise Application&#xff09; 左侧菜单进入 “企业应用程序”。点击 “新建应用程…...

OCR之身份证识别

前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像&#xff0c;利用图像处理、深度学习等技术&#xff0c;自动提取姓名、性别、民族、出生日期、地址、身份证号等信息&#xff0c;可大幅提升信息录入效率&#xff0c;广泛应用于政务、金…...

JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践

在现代网络应用中&#xff0c;动态网页内容的爬取一直是开发者面临的挑战之一。Puppeteer 作为一种强大的浏览器自动化工具&#xff0c;为这一问题提供了优雅的解决方案。本文将深入探讨 Puppeteer 的高级技巧&#xff0c;包括动态内容抓取、性能优化、反检测与伪装、复杂自动化…...

组织级项目管理OPM

组织级项目管理(Organizational Project Management, OPM)是一种系统化的管理方法,旨在通过整合项目组合、项目集和项目管理,确保组织的战略目标与项目执行的一致性,提升资源利用效率和项目成功率。以下是其核心内容与框架的详述: 一、组织级项目管理的定义与目标 定义 组…...

HTML与Web 性能优化:构建高速响应的现代网站

HTML 与 Web 性能优化&#xff1a;构建高速响应的现代网站 引言 随着互联网用户对网站加载速度期望的不断提高&#xff0c;前端性能优化已经成为现代 Web 开发的核心竞争力。据 Google 研究表明&#xff0c;页面加载时间每增加 1 秒&#xff0c;用户跳出率就会增加 32%。用户…...

模型 观测者效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。观察即影响&#xff0c;存在因注视而变。 1 观测者效应的应用 1.1 工业心理学—霍桑实验中的生产效率谜题 行业背景&#xff1a;20世纪20年代西方电气公司霍桑工厂&#xff0c;研究者试图通过优化照明…...

Ubuntu启动SMB(Samba)服务步骤

目录 1.基本的Samba服务器搭建流程主要分为四个步骤。 2.Samba工作流程&#xff1a; 3.解读主要配置文件smb.conf 4.开始安装Samba 5.检查Samba服务状态 6.创建Samba共享文件夹 7.配置Samba文件以及设置Samba用户密码 8.重启Samba服务器 9.关闭防火墙 10.Linux客户端…...

使用react的ant-design-pro框架写一个地图组件,可以搜索地图,可以点击地图获取点击的位置及经纬度

首先&#xff0c;先创建一个地图页面&#xff0c;用于显示地图组件&#xff0c;我是在pages文件中创建了一个mapSearch组件。 然后在routes.ts中注册页面。 {path: /mapSearch,name: mapSearch,icon: smile,component: ./mapSearch,}, 第三步就是使用高德地图来创建地图。 关键…...

【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题

文章目录 昨日内容复习已经建立了 TCP 连接&#xff0c;客户端突然出现故障怎么办&#xff1f;什么时候用长连接&#xff1f;短连接&#xff1f;TCP 的半连接队列与全连接队列&#xff1f;什么是 SYN 攻击&#xff1f;如何避免&#xff1f;TIME_WAIT 的作用&#xff1f;过多如何…...

Git远程操作与标签管理

目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…...

Element Plus消息通知体系深度解析:从基础到企业级实践

一、核心组件与技术定位 Element Plus的消息通知体系由三个核心组件构成&#xff1a;ElMessage&#xff08;全局提示&#xff09;、ElNotification&#xff08;通知弹窗&#xff09;和ElMessageBox&#xff08;交互式对话框&#xff09;。这套体系的设计目标是为开发者提供轻量…...

SpringCloud组件——Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...