次元削減とは、データ セット内の特徴の数を減らしながら、データの主要な情報を可能な限り保持することを指します。次元削減アルゴリズムは教師なし学習であり、アルゴリズムはラベルなしのデータを通じてトレーニングされます。
次元削減方法には多くの種類がありますが、それらはすべて線形と非線形という 2 つの主要なカテゴリに分類できます。
線形メソッドは、高次元空間から低次元空間にデータを線形に投影します (そのため、線形投影という名前が付けられています)。例には、PCA や LDA が含まれます。
非線形手法は、非線形次元削減を実行する方法であり、元のデータの非線形構造を発見するためによく使用されます。非線形次元削減手法は、元のデータが線形に分離するのが難しい場合に特に重要です。場合によっては、非線形次元削減は多様体学習としても知られており、この方法は高次元データをより効率的に処理でき、データの基礎となる構造を明らかにするのに役立ちます。非線形次元削減を通じて、データ間の関係をより深く理解し、データ内の隠れたパターンやルールを発見し、さらなるデータ分析と応用のための強力なサポートを提供できます。
この記事では、日常業務での選択に役立つ、一般的に使用される 10 の非線形次元削減手法をまとめました。
線形次元削減手法である通常の PCA についてはよくご存じかもしれません。カーネル 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')
これら 2 つの色は、線形的に分離できない 2 つのカテゴリを表します。ここで直線を引いてこれら 2 つのカテゴリーを分けることは不可能です。
通常の 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')
ご覧のとおり、2 つのクラスは依然として線形的に分離できません。次に、カーネル 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')
2 つのクラスは線形分離可能になり、カーネル PCA アルゴリズムは異なるカーネルを使用してデータを一方の形式からもう一方の形式に変換します。カーネル PCA は 2 段階のプロセスです。まず、カーネル関数は元のデータを、クラスが線形分離可能な高次元空間に一時的に投影します。次にアルゴリズムは、このデータを n_components ハイパーパラメータで指定されたより低い次元 (保持したい次元の数) に投影し直します。
sklearn には、linear、poly、rbf、sigmoid の 4 つのカーネル オプションがあります。カーネルを「リニア」として指定すると、通常の PCA が実行されます。他のカーネルは非線形 PCA を実行します。 rbf (放射基底関数) カーネルが最も一般的に使用されます。
多次元スケーリングは、高次元データ ポイントと低次元データ ポイント間の距離を維持する別の非線形次元削減手法です。たとえば、元の次元でより近い点は、より低い次元のフォームでもより近くに表示されます。
Scikit-learn を使用するには、MDS() クラスを使用できます。
from sklearn.manifold import MDS mds = MDS(n_components, metric) mds_transformed = mds.fit_transform(X)
メトリック ハイパーパラメータは、メトリックと非メトリックという 2 種類の MDS アルゴリズムを区別します。 metric=Trueの場合、メトリックMDSを実行します。それ以外の場合は、非メトリック MDS を実行します。
次の非線形データに 2 種類の 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不适合我们这个经典的数据集。
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后是线性可分的!
与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降维后是线性可分的,但是却丢失了数据的信息。
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')
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好像也不太适合我们的数据。
Random Trees Embedding是一种基于树的降维技术,常用于将高维数据映射到低维空间。它利用了随机森林(Random Forest)的思想,通过构建多棵随机决策树来实现降维。
Random Trees Embedding的基本工作流程:
Random Trees Embedding的优势在于它的计算效率高,特别是对于大规模数据集。由于使用了随机森林的思想,它能够很好地处理高维数据,并且不需要太多的调参过程。
RandomTreesEmbedding使用高维稀疏进行无监督转换,也就是说,我们最终得到的数据并不是一个连续的数值,而是稀疏的表示。所以这里就不进行代码展示了,有兴趣的看看sklearn的sklearn.ensemble.RandomTreesEmbedding
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')
Independent Component Analysis (ICA) 是一种用于盲源分离的统计方法,通常用于从混合信号中估计原始信号。在机器学习和信号处理领域,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')
到目前为止,我们讨论的NLDR技术属于通用机器学习算法的范畴。而自编码器是一种基于神经网络的NLDR技术,可以很好地处理大型非线性数据。当数据集较小时,自动编码器的效果可能不是很好。
自编码器我们已经介绍过很多次了,所以这里就不详细说明了。
非线性降维技术是一类用于将高维数据映射到低维空间的方法,它们通常适用于数据具有非线性结构的情况。
大多数NLDR方法基于最近邻方法,该方法要求数据中所有特征的尺度相同,所以如果特征的尺度不同,还需要进行缩放。
另外这些非线性降维技术在不同的数据集和任务中可能表现出不同的性能,因此在选择合适的方法时需要考虑数据的特征、降维的目标以及计算资源等因素。
以上が機械学習における 10 の非線形次元削減手法の比較概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。