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

降维意味着我们在不丢失太多信息的情况下减少数据集中的特征数量,降维算法属于无监督学习的范畴,用未标记的数据训练算法。

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

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

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

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

1、核PCA

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

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

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

 import matplotlib.pyplot as pltplt.figure(figsize=[7, 5])from sklearn.datasets import make_moonsX, 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 npfrom sklearn.decomposition import PCApca = 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 npfrom sklearn.decomposition import KernelPCAkpca = 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 MDSmds = 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 npfrom sklearn.manifold import MDSmds = MDS(n_components=1, metric=True) # Metric MDSX_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 npfrom sklearn.manifold import MDSmds = MDS(n_components=1, metric=False) # Non-metric MDSX_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 pltplt.figure(figsize=[7, 5])from sklearn.datasets import make_moonsX, y = make_moons(n_samples=100, noise=None, random_state=0)import numpy as npfrom sklearn.manifold import Isomapisomap = 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 LocallyLinearEmbeddinglle = 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 SpectralEmbeddingsp_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 TSNEtsne = 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 DictionaryLearningdict_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 FastICAica = 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机设计大赛 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习YOLO抽烟行为检测 该项目较为新颖,适合作为竞赛课…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念,它指的是在多线程环境中,通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题,如死锁、竞态条件、资源争用等,确保数据的一致性和完…

【复现】某公司指挥调度管理平台 RCE漏洞_51

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

视频生成模型作为世界模拟器

我们探索了在视频数据上大规模训练生成模型。具体来说,我们联合训练文本条件扩散模型,处理不同持续时间、分辨率和宽高比的视频和图像。我们利用一种在时空补丁上操作视频和图像潜码的transformer架构。我们最大的模型,Sora,能够生…

树状菜单(利用映射-bootstrap+jQuery实现折叠功能)

效果&#xff08;默认全部展开&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%;

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%; 关键是background-size:100% 100%; background-size:100% 100%; background-size:100% 100%; background-size:contain; 保持纵横比, 容器部分可能空白background-size:cover; 保…

解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

解释器模式 1.简介 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义语言的文法&#xff0c;并且解释语言中的表达式。在Java中&#xff0c;解释器模式可以用于构建解释器以解析特定的语言或表达式&#xff0c;如数学表达式、…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

【lesson57】信号量和生产者消费者模型(环形队列版)

文章目录 信号量概念信号量接口初始化销毁等待发布 基于环形队列的生产者消费者模型编码Common.hLockGuard.hppTask.hppsem.hppRingQueue.hppConProd.cc 信号量概念 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的…

【测试】JUnit

目 录 一.注解二.断言三.用例的执行顺序四.参数化五.测试套件 自动化就是 selenium 脚本来实现的 junit 是 java 的单亓测试工具&#xff0c;只不过我们在实现自动化的时候需要借用一下下 junit 库里面提供的一些方法 引入依赖 Junit 5 <!-- https://mvnrepository.com/a…

自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

编程语言处理的核心是计算机如何理解和执行预定义的人工语言&#xff08;编程语言&#xff09;&#xff0c;而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代&#xff0c;其编程语言处理能力相较于前代模型有了显…

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…

django报错:Cannot use ImageField because Pillow is not installed

1、问题概述 ERRORS: accounts.User.avatar: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow". System check identified 1 …

JDK1.8安装教程

目录 下载安装环境配置打开系统高级设置环境配置 验证安装是否成功 下载 https://www.oracle.com/java/technologies/downloads/#java8-windows 安装 打开安装包&#xff0c;点击下一步。 选择好自己熟悉的目的安装目录&#xff0c;点击下一步。 等待安装 选择好jre的安装目…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

java中的枚举

枚举 枚举类型的概述 关键字&#xff1a;enum 你可以把枚举类型理解成是一个自定义的常量的序列 枚举的语法结构 定义的枚举类型文件 package com.it.xiaosi.demo01;/*** Classname : direction* Description : TODO 枚举* Author : lin_refuelqq.com*/ public enum direct…

springboot第56集:微服务框架,物联网IOT,SQL数据库MySQL底层,AOP收集业务操作日志架构周刊...

单点登录 1.配置代理信息 /*请求登陆的方法*/ "/modelLogin": {//本地服务接口地址&#xff0c;这是测试环境&#xff0c;正式环境需要更改下地址target: "http://127.0.0.1:6776/xxx-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": …

在ubuntu中制作ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

MySQL数据库⑪_C/C++连接MySQL_发送请求

目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL&#xff0c;需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库&#xff0c;然后点击下载就行…