차원성 감소란 데이터 세트의 특징 수를 줄이면서 데이터의 주요 정보를 최대한 유지하는 것을 말합니다. 차원 축소 알고리즘은 비지도 학습이며, 알고리즘은 레이블이 지정되지 않은 데이터를 통해 학습됩니다.
다양한 유형의 차원 축소 방법이 있지만 모두 선형과 비선형이라는 두 가지 주요 범주로 분류할 수 있습니다.
선형 방법은 고차원 공간의 데이터를 저차원 공간에 선형적으로 투영합니다(따라서 선형 투영이라는 이름이 붙음). 예로는 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')
이 두 색상은 선형적으로 분리할 수 없는 두 가지 범주를 나타냅니다. 이 두 범주를 구분하기 위해 여기서 직선을 그리는 것은 불가능합니다.
일반 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는 2단계 프로세스입니다. 첫째, 커널 함수는 원본 데이터를 클래스가 선형으로 분리 가능한 고차원 공간에 일시적으로 투영합니다. 그런 다음 알고리즘은 이 데이터를 n_comComponents 하이퍼파라미터(보존하려는 차원 수)에 지정된 하위 차원으로 다시 투영합니다.
sklearn에는 선형', '폴리', 'rbf' 및 '시그모이드'의 네 가지 커널 옵션이 있습니다. 커널을 "선형"으로 지정하면 일반 PCA가 수행됩니다. 다른 커널은 비선형 PCA를 수행합니다. rbf(방사형 기초 함수) 커널이 가장 일반적으로 사용됩니다.
다차원 스케일링은 고차원 데이터 포인트와 저차원 데이터 포인트 사이의 거리를 유지하여 차원 축소를 수행하는 또 다른 비선형 차원 축소 기술입니다. 예를 들어 원래 차원에서 더 가까운 점은 낮은 차원에서도 더 가깝게 나타납니다.
Scikit-learn에서 이를 수행하려면 MDS() 클래스를 사용할 수 있습니다.
from sklearn.manifold import MDS mds = MDS(n_components, metric) mds_transformed = mds.fit_transform(X)
메트릭 하이퍼파라미터는 두 가지 유형의 MDS 알고리즘, 즉 메트릭과 비메트릭을 구별합니다. metric=True인 경우 메트릭 MDS를 실행합니다. 그렇지 않으면 비메트릭 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不适合我们这个经典的数据集。
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!