【数据挖掘】PCA/LDA/ICA:A成分分析算法比较

一、说明

        在深入研究和比较算法之前,让我们独立回顾一下它们。请注意,本文的目的不是深入解释每种算法,而是比较它们的目标和结果。

如果您想了解更多关于PCA和ZCA之间的区别,请查看我之前基于numpy的帖子:

PCA 美白与 ZCA 美白:2D 视觉效果

白化数据的过程包括转换,使得转换后的数据具有单位矩阵作为...

towardsdatascience.com

二、各类降维模型概念

2.1 PCA : 主成分分析

  • PCA是一种无监督线性降维技术,旨在找到一组新的正交变量,以捕获数据中最重要的可变性来源。
  • 它广泛用于特征提取和数据压缩,可用于探索性数据分析或作为机器学习算法的预处理步骤。
  • 生成的分量按其解释的方差量进行排名,可用于可视化和解释数据,以及用于聚类或分类任务。

2.2 LDA : 线性判别分析

  • LDA 是一种受监督的线性降维技术,旨在找到一组新的变量,以最大化类之间的分离,同时最小化每个类内的变化。
  • 它广泛用于特征提取和分类,可用于降低数据的维数,同时保留类之间的判别信息。
  • 生成的组件按其判别能力进行排名,可用于可视化和解释数据,以及用于分类或回归任务。

2.3 ICA : 独立成分分析

  • ICA是一种无监督线性降维技术,旨在找到一组统计上独立且非高斯的新变量。
  • 它广泛用于信号处理和源分离,并可用于提取数据中无法通过其他技术访问的潜在可变性源。
  • 生成的组件按其独立性进行排名,可用于可视化和解释数据,以及用于聚类或分类任务。

三、鸢尾花数据集上的结果

        让我们使用 sklearn 比较他们在著名的鸢尾花数据集上的结果。首先,让我们在 4 个数值特征中的每一个上使用配对图绘制鸢尾花数据集,并将颜色作为分类特征:

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris# Load the iris dataset
iris = load_iris()
data = iris.data
target = iris.target
target_names = iris.target_names# Convert the iris dataset into a pandas DataFrame
iris_df = sns.load_dataset('iris')
iris_df['target'] = target# Generate the pairplot∑
sns.pairplot(data=iris_df, hue='target', palette=['navy', 'turquoise', 'darkorange'], markers=['o', 's', 'D'],plot_kws=dict(s=25, alpha=0.8, edgecolor='none'), diag_kws=dict(alpha=0.8, edgecolor='none'))# Set the title and adjust plot spacing
plt.suptitle('Iris Pairplot')
plt.subplots_adjust(top=0.92)plt.show()

图片来源:虹膜数据集对图

现在,我们可以计算每个变换并绘制结果。请注意,我们只使用 2 个组件,因为 LDA 最多需要 (N-1) 个组件,其中 N 是类别的数量(这里等于 3,因为有 3 种类型的鸢尾花)。

from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA, FastICA
import matplotlib.pyplot as plt# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names# Standardize the data
scaler = StandardScaler()
X_std = scaler.fit_transform(X)# Apply LDA with 2 components
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_std, y)# Apply PCA with 2 components
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_std)# Apply ICA with 2 components
ica = FastICA(n_components=2)
X_ica = ica.fit_transform(X_std)# Plot the results
plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1)
for target, color in zip(range(len(target_names)), ['navy', 'turquoise', 'darkorange']):plt.scatter(X_lda[y == target, 0], X_lda[y == target, 1], color=color, alpha=.8, lw=2,label=target_names[target])
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA')
plt.xlabel('LD1')
plt.ylabel('LD2')plt.subplot(1, 3, 2)
for target, color in zip(range(len(target_names)), ['navy', 'turquoise', 'darkorange']):plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, alpha=.8, lw=2,label=target_names[target])
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA')
plt.xlabel('PC1')
plt.ylabel('PC2')plt.subplot(1, 3, 3)
for target, color in zip(range(len(target_names)), ['navy', 'turquoise', 'darkorange']):plt.scatter(X_ica[y == target, 0], X_ica[y == target, 1], color=color, alpha=.8, lw=2,label=target_names[target])
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('ICA')
plt.xlabel('IC1')
plt.ylabel('IC2')plt.show()

This code loads the Iris dataset, applies LDA, PCA, and ICA with 2 components each, and then plots the results using different colors for each class.

        请注意,在应用 PCA、ICA 或 LDA 之前标准化数据通常是一种很好的做法。标准化很重要,因为这些技术对输入要素的比例很敏感。标准化数据可确保每个要素的均值为 0,标准差为 1,这会将所有要素置于同一尺度上,并避免一个要素凌驾于其他要素之上。

        由于LDA是一种监督降维技术,因此它将类标签作为输入。相比之下,PCA和ICA是无监督技术,这意味着它们只使用输入数据,而不考虑类标签。

        LDA 的结果可以解释为将数据投影到最大化类分离的空间上,而 PCA 和 ICA 的结果可以解释为将数据投影到空间上,该空间分别捕获最重要的可变性或独立性来源。

图片来源:虹膜数据集上LDA,PCA和ICA的比较

        请注意,ICA仍然显示类别之间的分离,尽管不是其目的:这是因为类别已经在输入数据集中进行了相当排序。

        让我们把LDA放在一边,专注于PCA和ICA之间的差异 - 因为LDA是一种监督技术,专注于分离类别并强制实施最大的组件,而PCA和ICA专注于创建一个与输入矩阵形状相同的新矩阵。

        让我们看看 PCA 和 ICA 的 4 个组件的输出:

左:PCA的对图/右:ICA的对图(图片由作者提供)

        让我们也比较每个转换数据的相关矩阵:请注意,这两种方法都会导致不相关的向量(换句话说,转换后的数据特征是正交的)。这是因为它是PCA算法中的一个约束 - 每个新向量必须与以前的向量正交 - 并且是ICA算法的结果 - 这意味着原始数据集是已经混合在一起的独立信号,必须重建。

左:ICA的相关热图/右:PCA的相关热图(图片由作者提供)

        所以PCA和ICA似乎给出了具有相似性质的结果:这是因为以下2个原因:

  • 独立性在两种算法中都“编码”
  • 鸢尾花数据集表现出分离良好的类

这就是为什么我们需要另一个更适合ICA的例子。

四、另一个例子:

        让我们看另一个例子:我们首先生成一个合成数据集,其中包含两个独立的源,一个正弦波和一个方波,它们作为线性组合混合在一起以创建混合信号。

        实际的、真实的、独立的信号如下:

        它们混合在一起,作为 2 个线性组合:

        让我们看看PCA和ICA在这个新数据集上的表现:

        注意PCA如何创建一个新组件,该组件表现出很大的方差,作为输入的线性组合,但这绝对与原始数据不匹配:这确实不是PCA的目的。

        相反,ICA在恢复原始数据集方面表现非常好,与方差组成无关。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FastICA# Generate a synthetic dataset with two independent sources
np.random.seed(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)s1 = np.sin(2 * time) # Source 1: sine wave
s2 = np.sign(np.sin(3 * time)) # Source 2: square waveS = np.c_[s1, s2]
S += 0.2 * np.random.normal(size=S.shape) # Add noise to the sources
S /= S.std(axis=0) # Standardize the sources# Mix the sources together to create a mixed signal
A = np.array([[0.5, 0.5], [0.2, 0.8]]) # Mixing matrix
X = np.dot(S, A.T) # Mixed signal# Standardize the data
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)# Use PCA to reduce the dimensionality of the data
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# Use ICA to separate the sources from the mixed signal
ica = FastICA(n_components=2)
X_ica = ica.fit_transform(X) # Estimated sources# Plot the results
plt.figure()models = [X, S, X_pca, X_ica]
names = ['Observations (mixed signal)','True Sources','PCA features', 'ICA estimated sources']
colors = ['red', 'steelblue']for ii, (model, name) in enumerate(zip(models, names), 1):plt.subplot(4, 1, ii)plt.title(name)for sig, color in zip(model.T, colors):plt.plot(sig, color=color)plt.tight_layout()
plt.show()

五、结论

        PCA、LDA 和 ICA 算法可能看起来像是彼此的自定义版本,但它们实际上没有相同的目的。总结一下:

  • PCA旨在创建保持输入最大方差的新组件
  • LDA 旨在创建基于分类特征分隔集群的新组件
  • ICA 旨在检索在输入数据集中以线性组合混合在一起的原始要素

        希望您更好地了解这些算法之间的差异,并能够在将来快速识别您需要的算法。

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

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

相关文章

Leetcode-每日一题【114.二叉树展开为链表】

题目 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 (1)、类注解 【1】、Controller(控制器存储) 【2】、Service(服务存储) 【3】、Repository(仓库存储) 【4】、Component&#xf…

9个可用于图片转文本的最佳免费 OCR 软件

光学字符识别 (OCR) 软件可帮助将不可编辑的文档格式(例如 PDF、图像或纸质文档)转换为可编辑和可搜索的机器可读格式。 OCR 应用程序通常用于从 PDF 和图像中捕获文本,并将文本转换为可编辑格式,例如 Word、Excel 或纯文本文件。…

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

C++OpenCV(6):图像阈值操作

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 文章目录 图像阈值化 图像阈值化 阈值又叫临界值,是指一个效应能够产生的最低值或最高值。 例如我们选择的阈值为125,则…

智能网关实现混凝土搅拌机无人自动化

“以前的搅拌站生产时,是需要人工巡检的,运送物料和搅拌时产生的大量粉尘污染和噪音,让工人苦不堪言。但是如果有了物联网搅拌站监测系统智慧园区项目落地后,工人也不用去现场忍受噪音和粉尘了。” 行业痛点 传统模式下的混泥土…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好,我是微学AI,今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务,通过将相似的文本样本分组,可以帮助我们发现隐藏在文本数据中的模式和结…

力扣题库刷题笔记73--矩阵置零

1、题目如下: 2、个人Python代码实现 3、个人Python代码思路 a、声明2个空数组p、q,用于存放值为0的元素matrix[i][j]的下标 b、首先遍历二维数组matrix,找到值为0的元素matrix[i][j],将下标i加入数组p,将下标j加入数…

高通WLAN框架学习(37)-- TDLS(Tunneled Direct Link Setup)通道直接链路建立

一 TDLS概述 隧道直连设置(TDLS)基于IEEE 802.11z-2010IEEE标准802.11z标准(无线局域网介质访问控制(MAC)和物理层(PHY)规范。 TDLS允许与同一AP关联的设备之间建立直接链路。Wi-Fi Direct允许设备之间直接连接,而不需要AP。Wi-Fi联盟认证可用于IEEE 802.11a和802.11g设备的T…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI: npm install -g vue/cli 如何创建一个vue2项目 (1) 使用cmd终端直接创建 进入到vue项目所创建的目录里(我是直接创建在桌面上) 选择vue2 …

入局元宇宙,所谓的无限可能到底在哪里?

最近的热点新闻表明,人们似乎认为元宇宙已经走向“死亡”。但实际上,市场应该重新定义对元宇宙的看法,以及正视它最大的机会所在——游戏领域。 1937年5月6日,一架名为兴登堡号的巨大氢能齐柏林飞艇飞临新泽西州曼彻斯特镇上空&a…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习:怎么用JMeter操作MySQL数据库?看完秒懂!_jmeter mysql_程序员馨馨的博客-CSDN博客 注:里面所有没打码的都是假数据,麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值,作为…

Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)(A-G)

Contest Duration: 2023-07-22(Sat) 20:00 - 2023-07-22(Sat) 21:40 (local time) (100 minutes) 头文件和宏 #include<iostream> #include<string> #include<vector> using namespace std; #define int long long #define fer(i,a,b) for(int ia;i<b;i…

【运维】DevOps全流程笔记(未完成)

运维笔记 DevOps基本流程Code阶段工具&#xff08;gitlab安装&#xff09;Build阶段工具&#xff08;Maven安装&#xff09;Integrate阶段工具JenkinsJenkins介绍Jenkins安装Jenkins入门配置 CI/CD操作集成Sonar Qube集成HarborJenkins流水线Kubernetes编排工具 DevOps全流程笔…

怎么把PDF转为word?1分钟解决难题

PDF文件在我们的电脑上应用非常广泛&#xff0c;由于其较高的安全性和兼容性&#xff0c;得到了广泛的认可。然而&#xff0c;对于一些人来说&#xff0c;PDF文件不能直接进行编辑和修改可能是一个问题。因此&#xff0c;通常我们需要将其转换为Word格式&#xff0c;以便在Word…

[php-cos]ThinkPHP项目集成腾讯云储存对象COS

Cos技术文档 1、安装phpSdk 通过composer的方式安装。 1.1 在composer.json中添加 qcloud/cos-sdk-v5: >2.0 "require": {"php": ">7.2.5","topthink/framework": "^6.1.0","topthink/think-orm": "…

数据库监控工具-PIGOSS BSM

PIGOSS BSM 运维监控系统的重要功能之一是数据库监控&#xff0c;它能够帮助数据库管理员(DBA)和系统管理员监控包含Oracle、SQL Server、MySQL、DB2、PostgreSql、MongoDB、达梦、南大通用、人大金仓、神州通用等多种类异构型的数据库环境。PIGOSS BSM通过执行数据库查询来采集…

DSSAT模型教程

详情点击链接&#xff1a;R语言与作物模型&#xff08;DSSAT模型&#xff09;教程 前言 随着基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;的发展&#xff0c;R语言在作物生长模型和数据分析、挖掘和可视化中发挥着越来越重要的…

详细解析python视频选择--【思维导图知识范围】

C ,JAVA JAVAWEB ,微信小程序等 都有视频选择的分析。 语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringB…

Cesium:加载geojson面贴地和显示边界问题

1.背景 cesium加载geojson面数据后&#xff0c;有部分数据在地形下面显示不全&#xff0c; 加了clampToGround: true&#xff0c;设置贴地后&#xff0c;边界又不见了 this.viewer.dataSources.add(GeoJsonDataSource.load(http://xx/xzbj.geojson, {stroke: Color.BLACK.with…