机器学习中的10种非线性降维技术对比总结

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 降维意味着我们在不丢失太多信息的情况下减少数据集中的特征数量,降维算法属于无监督学习的范畴,用未标记的数据训练算法。

尽管降维方法种类繁多,但它们都可以归为两大类:线性和非线性。

线性方法将数据从高维空间线性投影到低维空间(因此称为线性投影)。例子包括PCA和LDA。

非线性方法提供了一种执行非线性降维(NLDR)的方法。我们经常使用NLDR来发现原始数据的非线性结构。当原始数据不可线性分离时,NLDR很有用。在某些情况下,非线性降维也被称为流形学习。

本文整理了10个常用的非线性降维技术,可以帮助你在日常工作中进行选择

1、核PCA

你们可能熟悉正常的PCA,这是一种线性降维技术。核PCA可以看作是正态主成分分析的非线性版本。

常规主成分分析和核主成分分析都可以进行降维。但是核PCA能很好地处理线性不可分割的数据。因此,核PCA算法的主要用途是使线性不可分的数据线性可分,同时降低数据的维数!

我们先创建一个非常经典的数据:

 import matplotlib.pyplot as plt
 plt.figure(figsize=[7, 5])

 from sklearn.datasets import make_moons
 X, y = make_moons(n_samples=100, noise=None, 
                   random_state=0)

 plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='plasma')
 plt.title('Linearly inseparable data')

这两种颜色代表线性上不可分割的两类。我们不可能在这里画一条直线把这两类分开。

我们先使用常规PCA。

 import numpy as np
 from sklearn.decomposition import PCA

 pca = PCA(n_components=1)
 X_pca = pca.fit_transform(X)

 plt.figure(figsize=[7, 5])
 plt.scatter(X_pca[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after linear PCA')
 plt.xlabel('PC1')

可以看到,这两个类仍然是线性不可分割的,现在我们试试核PCA。

 import numpy as np
 from sklearn.decomposition import KernelPCA

 kpca = KernelPCA(n_components=1, kernel='rbf', gamma=15)
 X_kpca = kpca.fit_transform(X)

 plt.figure(figsize=[7, 5])
 plt.scatter(X_kpca[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.axvline(x=0.0, linestyle='dashed', color='black', linewidth=1.2)
 plt.title('First component after kernel PCA')
 plt.xlabel('PC1')

这两个类变成了线性可分的,核PCA算法使用不同的核将数据从一种形式转换为另一种形式。核PCA是一个两步的过程。首先核函数暂时将原始数据投影到高维空间中,在高维空间中,类是线性可分的。然后算法将该数据投影回n_components超参数(我们想要保留的维数)中指定的较低维度。

sklearn中有四个核选项:linear’, ‘poly’, ‘rbf’ and ‘sigmoid’。如果我们将核指定为“线性”,则将执行正常的PCA。任何其他核将执行非线性PCA。rbf(径向基函数)核是最常用的。

2、多维尺度变换(multidimensional scaling, MDS)

多维尺度变换是另一种非线性降维技术,它通过保持高维和低维数据点之间的距离来执行降维。例如,原始维度中距离较近的点在低维形式中也显得更近。

要在Scikit-learn我们可以使用MDS()类。

 from sklearn.manifold import MDS

 mds = MDS(n_components, metric)
 mds_transformed = mds.fit_transform(X)

metric 超参数区分了两种类型的MDS算法:metric和non-metric。如果metric=True,则执行metric MDS。否则,执行non-metric MDS。

我们将两种类型的MDS算法应用于以下非线性数据。

 import numpy as np
 from sklearn.manifold import MDS

 mds = MDS(n_components=1, metric=True) # Metric MDS
 X_mds = mds.fit_transform(X)

 plt.figure(figsize=[7, 5])
 plt.scatter(X_mds[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('Metric MDS')
 plt.xlabel('Component 1')

 import numpy as np
 from sklearn.manifold import MDS

 mds = MDS(n_components=1, metric=False) # Non-metric MDS
 X_mds = mds.fit_transform(X)

 plt.figure(figsize=[7, 5])
 plt.scatter(X_mds[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('Non-metric MDS')
 plt.xlabel('Component 1')

可以看到MDS后都不能使数据线性可分,所以可以说MDS不适合我们这个经典的数据集。

3、Isomap

Isomap(Isometric Mapping)在保持数据点之间的地理距离,即在原始高维空间中的测地线距离或者近似的测地线距离,在低维空间中也被保持。Isomap的基本思想是通过在高维空间中计算数据点之间的测地线距离(通过最短路径算法,比如Dijkstra算法),然后在低维空间中保持这些距离来进行降维。在这个过程中,Isomap利用了流形假设,即假设高维数据分布在一个低维流形上。因此,Isomap通常在处理非线性数据集时表现良好,尤其是当数据集包含曲线和流形结构时。

 import matplotlib.pyplot as plt
 plt.figure(figsize=[7, 5])

 from sklearn.datasets import make_moons
 X, y = make_moons(n_samples=100, noise=None, 
                   random_state=0)

 import numpy as np
 from sklearn.manifold import Isomap

 isomap = Isomap(n_neighbors=5, n_components=1)
 X_isomap = isomap.fit_transform(X)

 plt.figure(figsize=[7, 5])
 plt.scatter(X_isomap[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying Isomap')
 plt.xlabel('Component 1')

就像核PCA一样,这两个类在应用Isomap后是线性可分的!

4、Locally Linear Embedding(LLE)

与Isomap类似,LLE也是基于流形假设,即假设高维数据分布在一个低维流形上。LLE的主要思想是在局部邻域内保持数据点之间的线性关系,并在低维空间中重构这些关系。

 from sklearn.manifold import LocallyLinearEmbedding
 lle = LocallyLinearEmbedding(n_neighbors=5,n_components=1)
 lle_transformed = lle.fit_transform(X)
 plt.figure(figsize=[7, 5])
 plt.scatter(lle_transformed[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying LocallyLinearEmbedding')
 plt.xlabel('Component 1')

只有2个点,其实并不是这样,我们打印下这个数据

可以看到数据通过降维变成了同一个数字,所以LLE降维后是线性可分的,但是却丢失了数据的信息。

5、Spectral Embedding

Spectral Embedding是一种基于图论和谱理论的降维技术,通常用于将高维数据映射到低维空间。它的核心思想是利用数据的相似性结构,将数据点表示为图的节点,并通过图的谱分解来获取低维表示。

 from sklearn.manifold import SpectralEmbedding
 sp_emb = SpectralEmbedding(n_components=1, affinity='nearest_neighbors')
 sp_emb_transformed = sp_emb.fit_transform(X)
 plt.figure(figsize=[7, 5])
 plt.scatter(sp_emb_transformed[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying SpectralEmbedding')
 plt.xlabel('Component 1')

6、t-Distributed Stochastic Neighbor Embedding (t-SNE)

t-SNE的主要目标是保持数据点之间的局部相似性关系,并在低维空间中保持这些关系,同时试图保持全局结构。

 from sklearn.manifold import TSNE
 tsne = TSNE(1, learning_rate='auto', init='pca')
 tsne_transformed = tsne.fit_transform(X)
 plt.figure(figsize=[7, 5])
 plt.scatter(tsne_transformed[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying TSNE')
 plt.xlabel('Component 1')

t-SNE好像也不太适合我们的数据。

7、Random Trees Embedding

Random Trees Embedding是一种基于树的降维技术,常用于将高维数据映射到低维空间。它利用了随机森林(Random Forest)的思想,通过构建多棵随机决策树来实现降维。

Random Trees Embedding的基本工作流程:

  1. 构建随机决策树集合:首先,构建多棵随机决策树。每棵树都是通过从原始数据中随机选择子集进行训练的,这样可以减少过拟合,提高泛化能力。
  2. 提取特征表示:对于每个数据点,通过将其在每棵树上的叶子节点的索引作为特征,构建一个特征向量。每个叶子节点都代表了数据点在树的某个分支上的位置。
  3. 降维:通过随机森林中所有树生成的特征向量,将数据点映射到低维空间中。通常使用降维技术,如主成分分析(PCA)或t-SNE等,来实现最终的降维过程。

Random Trees Embedding的优势在于它的计算效率高,特别是对于大规模数据集。由于使用了随机森林的思想,它能够很好地处理高维数据,并且不需要太多的调参过程。

RandomTreesEmbedding使用高维稀疏进行无监督转换,也就是说,我们最终得到的数据并不是一个连续的数值,而是稀疏的表示。所以这里就不进行代码展示了,有兴趣的看看sklearn的sklearn.ensemble.RandomTreesEmbedding

8、Dictionary Learning

Dictionary Learning是一种用于降维和特征提取的技术,它主要用于处理高维数据。它的目标是学习一个字典,该字典由一组原子(或基向量)组成,这些原子是数据的线性组合。通过学习这样的字典,可以将高维数据表示为一个更紧凑的低维空间中的稀疏线性组合。

Dictionary Learning的优点之一是它能够学习出具有可解释性的原子,这些原子可以提供关于数据结构和特征的重要见解。此外,Dictionary Learning还可以产生稀疏表示,从而提供更紧凑的数据表示,有助于降低存储成本和计算复杂度。

 from sklearn.decomposition import DictionaryLearning

 dict_lr = DictionaryLearning(n_components=1)
 dict_lr_transformed = dict_lr.fit_transform(X)
 plt.figure(figsize=[7, 5])
 plt.scatter(dict_lr_transformed[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying DictionaryLearning')
 plt.xlabel('Component 1')

9、Independent Component Analysis (ICA)

Independent Component Analysis (ICA) 是一种用于盲源分离的统计方法,通常用于从混合信号中估计原始信号。在机器学习和信号处理领域,ICA经常用于解决以下问题:

  1. 盲源分离:给定一组混合信号,其中每个信号是一组原始信号的线性组合,ICA的目标是从混合信号中分离出原始信号,而不需要事先知道混合过程的具体细节。
  2. 特征提取:ICA可以被用来发现数据中的独立成分,提取数据的潜在结构和特征,通常在降维或预处理过程中使用。

ICA的基本假设是,混合信号中的各个成分是相互独立的,即它们的统计特性是独立的。这与主成分分析(PCA)不同,PCA假设成分之间是正交的,而不是独立的。因此ICA通常比PCA更适用于发现非高斯分布的独立成分。

 from sklearn.decomposition import FastICA

 ica = FastICA(n_components=1, whiten='unit-variance')
 ica_transformed = dict_lr.fit_transform(X)
 plt.figure(figsize=[7, 5])
 plt.scatter(ica_transformed[:, 0], np.zeros((100,1)), c=y, s=50, cmap='plasma')
 plt.title('First component after applying FastICA')
 plt.xlabel('Component 1')

10、Autoencoders (AEs)

到目前为止,我们讨论的NLDR技术属于通用机器学习算法的范畴。而自编码器是一种基于神经网络的NLDR技术,可以很好地处理大型非线性数据。当数据集较小时,自动编码器的效果可能不是很好。

自编码器我们已经介绍过很多次了,所以这里就不详细说明了。

总结

非线性降维技术是一类用于将高维数据映射到低维空间的方法,它们通常适用于数据具有非线性结构的情况。

大多数NLDR方法基于最近邻方法,该方法要求数据中所有特征的尺度相同,所以如果特征的尺度不同,还需要进行缩放。

另外这些非线性降维技术在不同的数据集和任务中可能表现出不同的性能,因此在选择合适的方法时需要考虑数据的特征、降维的目标以及计算资源等因素。

https://avoid.overfit.cn/post/0d7e9cf08e72486faf46fe341e96e468

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与机器学习:探索未来的技术边界
【10月更文挑战第18天】 在这篇文章中,我们将深入探讨人工智能(AI)和机器学习(ML)的基础知识、应用领域以及未来趋势。通过对比分析,我们将揭示这些技术如何改变我们的生活和工作方式,并预测它们在未来可能带来的影响。文章旨在为读者提供一个全面而深入的理解,帮助他们更好地把握这一领域的发展趋势。
|
12天前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
42 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
14天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
29天前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
51 6
|
1月前
|
机器学习/深度学习 搜索推荐 算法
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验。本文探讨了推荐系统的基本原理、常用算法、实现步骤及Python应用,介绍了如何克服数据稀疏性、冷启动等问题,强调了合理选择算法和持续优化的重要性。
69 4
|
1月前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的自然语言处理技术
【10月更文挑战第38天】在本文中,我们将深入探讨自然语言处理(NLP)技术及其在机器学习领域的应用。通过浅显易懂的语言和生动的比喻,我们将揭示NLP技术的奥秘,包括其工作原理、主要任务以及面临的挑战。此外,我们还将分享一些实用的代码示例,帮助您更好地理解和掌握这一技术。无论您是初学者还是有经验的开发者,相信您都能从本文中获得宝贵的知识和启示。
39 3
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
116 11
|
1月前
|
机器学习/深度学习 数据可视化 算法
机器学习中的特征选择与降维技术
机器学习中的特征选择与降维技术
71 0
|
3月前
|
机器学习/深度学习 数据可视化 JavaScript
探索机器学习模型的可视化技术
【9月更文挑战第23天】在数据科学中,理解和解释机器学习模型的决策过程是至关重要的。本文将介绍几种流行的可视化工具和库,如TensorBoard、D3.js等,帮助读者更好地理解模型内部工作原理及其预测结果。通过实例演示如何使用这些工具进行模型可视化,增强模型的可解释性。
|
4月前
|
人工智能 Anolis
展示全栈式AI平台,探讨软硬件技术!英特尔分论坛议程来啦 | 2024 龙蜥大会
英特尔分论坛将依托英特尔云到端的全面产品组合,围绕至强可扩展处理器、AI 加速器、以及 oneAPI、OpenVINO 等软硬件技术展开探讨。
展示全栈式AI平台,探讨软硬件技术!英特尔分论坛议程来啦 | 2024 龙蜥大会