乐趣区

关于人工智能:机器学习中的10种非线性降维技术对比总结

降维意味着咱们在不失落太多信息的状况下缩小数据集中的特色数量,降维算法属于无监督学习的领域,用未标记的数据训练算法。

只管降维办法品种繁多,但它们都能够归为两大类: 线性和非线性。

线性办法将数据从高维空间线性投影到低维空间(因而称为线性投影)。例子包含 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

退出移动版