背景
降维是一种减少数据特征数量的技术,旨在降低计算复杂度、减小过拟合风险、提高模型性能,并使高维数据更易于可视化和理解,常见的降维方法主要分为两大类: 线性降维方法 和非线性降维方法,以下是一些主要的降维方法:
主成分分析 (PCA)
- PCA 是一种经典的线性降维方法,它通过寻找数据集中的主要成分(方差最大化的方向),将数据投影到这些主要成分上,从而实现降维,PCA的基本思想是找到一个新的坐标系,使得在这个新坐标系下,数据的方差尽可能大
线性判别分析 (LDA)
- LDA 也是一种线性降维方法,但与PCA不同,它不仅考虑数据的方差,还考虑类别标签,LDA试图找到能够最大化类间方差和最小化类内方差的投影方向,从而实现降维
因子分析 (FA)
- 因子分析是一种统计方法,用于描述观测变量之间的相关关系,并试图通过较少的潜在变量(因子)来解释这些关系,FA和PCA类似,但FA更注重解释观测变量的共性结构
奇异值分解 (SVD)
- SVD 是一种矩阵分解方法,可以用于降维,它将一个矩阵分解为三个矩阵的乘积,并且通过截断奇异值来减少数据的维度,SVD在处理稀疏矩阵时尤其有效
核主成分分析 (Kernel PCA)
- Kernel PCA 是PCA的一种扩展,它使用核技巧(kernel trick)将数据映射到一个高维空间,然后在这个高维空间中执行PCA,这样可以处理非线性可分的数据
多维尺度分析 (MDS)
- MDS 是一种非线性降维方法,它通过保留数据点之间的距离关系,将高维数据映射到低维空间,MDS可以帮助可视化高维数据,尤其适用于心理学和社会学中的数据分析
局部线性嵌入 (LLE)
- LLE 是一种流行的非线性降维方法,它假设每个数据点的邻域在低维空间中可以通过线性组合表示,LLE通过保持这种局部结构将数据映射到低维空间
t-分布随机邻域嵌入 (t-SNE)
- t-SNE 是一种非常有效的非线性降维方法,特别适用于数据可视化,它通过将高维空间中的相似点尽可能地映射到低维空间中的相邻位置,同时让不相似的点保持距离
自编码器 (Autoencoder)
- 自编码器是一种基于神经网络的非线性降维方法。它通过训练一个瓶颈层(维度较低的隐藏层)来压缩输入数据,然后尝试从这个压缩表示中重建原始数据,从而实现降维
独立成分分析 (ICA)
- ICA 是一种线性降维方法,旨在将观测数据分解为相互独立的成分,与PCA关注方差最大化不同,ICA关注信号的独立性,常用于信号处理和脑电图(EEG)数据分析
这些方法各有优劣,适用于不同类型的数据和任务,在实际应用中,通常需要结合数据的具体特征和任务要求,选择合适的降维方法
代码实现
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets
from sklearn.decomposition import PCA, KernelPCA, FastICA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.manifold import TSNE, MDS, Isomap, LocallyLinearEmbedding
from sklearn.random_projection import GaussianRandomProjection
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import numpy as np
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data # 特征矩阵
y = iris.target # 标签
target_names = iris.target_names
# 标准化数据(均值为0,方差为1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 定义降维方法
methods = {
'PCA': PCA(n_components=2), # 主成分分析
'Kernel PCA': KernelPCA(n_components=2, kernel='rbf'), # 核主成分分析
'LDA': LDA(n_components=2), # 线性判别分析
'FastICA': FastICA(n_components=2), # 独立成分分析
'MDS': MDS(n_components=2), # 多维尺度分析
't-SNE': TSNE(n_components=2, random_state=42), # t-SNE
'Isomap': Isomap(n_components=2), # Isomap
'LLE': LocallyLinearEmbedding(n_components=2), # 局部线性嵌入
'Random Projection': GaussianRandomProjection(n_components=2), # 随机投影
'SVD': make_pipeline(StandardScaler(), PCA(n_components=2)) # 奇异值分解
}
# 创建子图,5行2列
fig, axes = plt.subplots(5, 2, figsize=(15, 25), dpi=300)
axes = axes.flatten() # 将子图阵列平铺成一维数组,方便迭代
# 定义颜色映射
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
# 生成各个降维方法的二维散点图
for i, (name, method) in enumerate(methods.items()):
# 对于LDA,需要提供标签信息;其他方法只需特征矩阵
if name == 'LDA':
X_2d = method.fit_transform(X_scaled, y)
else:
X_2d = method.fit_transform(X_scaled)
ax = axes[i] # 当前子图
for color, label, target_name in zip(colors, [0, 1, 2], target_names):
ax.scatter(X_2d[y == label, 0], X_2d[y == label, 1], label=target_name, c=color, edgecolor='k', s=50)
# 设置标题、标签和刻度样式
ax.set_title(f'{name}', fontsize=14)
ax.set_xlabel('Component 1', fontsize=12)
ax.set_ylabel('Component 2', fontsize=12)
ax.tick_params(axis='both', which='major', labelsize=10)
# 添加图例
ax.legend(title="Classes", loc="best", fontsize=10, title_fontsize='12')
# 美化子图布局,避免重叠
plt.tight_layout()
# 全局设置
plt.suptitle('Dimensionality Reduction Techniques on Iris Dataset', fontsize=20, y=1.02)
plt.subplots_adjust(top=0.95) # 调整顶部以容纳全局标题
sns.set(style="whitegrid") # 使用Seaborn白色网格风格
# 保存为PDF文件
fig.savefig("Dimensionality_Reduction_Techniques_on_Iris_Dataset.pdf", format='pdf', bbox_inches='tight')
# 显示图形
plt.show()
生成了一个 5x2 的子图网格,每个子图展示了不同降维方法在鸢尾花数据集上的二维散点图,结果表明应根据数据的具体特性选择合适的降维方法,而非盲目选择
往期推荐
利用XGBoost模型进行多分类任务下的SHAP解释附代码讲解及GUI展示
理解 SHAP 值:如何根据模型性质正确解释 XGBoost 与随机森林的结果
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考