合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
随着数据集的规模和复杂性的增长,特征或维度的数量往往变得难以处理,导致计算需求增加,潜在的过拟合和模型可解释性降低。降维技术提供了一种补救方法,它捕获数据中的基本信息,同时丢弃冗余或信息较少的特征。这个过程不仅简化了计算任务,还有助于可视化数据趋势,减轻维度诅咒的风险,并提高机器学习模型的泛化性能。降维在各个领域都有应用,从图像和语音处理到金融和生物信息学,在这些领域,从大量数据集中提取有意义的模式对于做出明智的决策和建立有效的预测模型至关重要。
本文将深入研究三种强大的降维技术——主成分分析(PCA)、线性判别分析(LDA)和奇异值分解(SVD)。我们不仅介绍这些方法的基本算法,而且提供各自的优点和缺点。
主成分分析(PCA)是一种广泛应用于数据分析和机器学习的降维技术。它的主要目标是将高维数据转换为低维表示,捕获最重要的信息。
我们的目标是识别数据集中的模式,所以希望数据分布在每个维度上,并且在这些维度之间是有独立性的。方差作为可变性的度量标准,本质上量化了数据集分散的程度。用数学术语来说,它表示与平均的平均平方偏差。计算方差的公式用var(x)表示如下:
协方差量化了两组有序数据中对应元素相似的程度。用cov(x, y)表示变量x和y之间的协方差。xi表示第i维中x的值,而x柱和y柱表示它们各自的平均值。如果我们有一个维数为m*n的矩阵X,其中包含n个数据点,每个数据点有m维,那么协方差矩阵可以计算如下:
协方差矩阵包括
我们的目标是确保数据广泛分散,表明其维度之间的高方差,另外一个目标是消除相关维度,这意味着维度之间的协方差应为零(表明它们的线性无关)。所以对数据进行变换的目的是使其协方差矩阵具有以下特征:
所以必须对原始数据点进行变换获得类似于对角矩阵的协方差矩阵。将矩阵转换成对角矩阵的过程称为对角化,它构成了主成分分析(PCA)背后的主要动机。
1、标准化
当特征以不同的单位度量时,对数据进行标准化。这需要减去平均值,然后除以每个特征的标准差。对具有不同尺度特征的数据进行标准化的失败可能导致误导性的成分。
2、计算协方差矩阵
如前面讨论的那样计算协方差矩阵
3、计算特征向量和特征值
确定协方差矩阵的特征向量和特征值。
特征向量表示方向(主成分),特征值表示这些方向上的方差大小。
4、特征值排序
对特征值按降序排序。与最高特征值相对应的特征向量是捕获数据中最大方差的主成分。
5、选择主成分
根据需要解释的方差选择前k个特征向量(主成分)。一般情况下会设定阈值,保留总方差的很大一部分,例如85%。
6、转换数据
我们可以用特征向量变换原始数据:
如果我们有m维的n个数据点X: m*n
P: k*m
Y = PX: (k*m)(m*n) = (k*n)
新变换矩阵有n个数据点,有k维。
降维:PCA有效地减少了特征的数量,这对遭受维数诅咒的模型是有益的。
特征独立性:主成分是正交的(不相关的),这意味着它们捕获独立的信息,简化了对约简特征的解释。
降噪:PCA可以通过专注于解释数据中最显著方差的成分来帮助减少噪声。
可视化:降维数据可以可视化,有助于理解底层结构和模式。
原始特征的可解释性可能在变换后的空间中丢失,因为主成分是原始特征的线性组合。
PCA假设变量之间的关系是线性的,但并非在所有情况下都是如此。
PCA对特征的尺度比较敏感,因此常常需要标准化。
异常值可以显著影响PCA的结果,因为它侧重于捕获最大方差,这可能受到极值的影响。
高维数据:PCA在处理具有大量特征的数据集以减轻维度诅咒时特别有用。
共线的特点:当特征高度相关时,PCA可以有效地捕获共享信息并用更少的组件表示它。
可视化:它将数据投射到一个较低维度的空间,可以很容易地可视化。
线性关系:当变量之间的关系大多是线性的,主成分分析是一个合适的技术。
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# Load iris dataset as an example
iris = load_iris()
X = iris.data
y = iris.target
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Standardize the data (important for PCA)
scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)
X_test_std = scaler.transform(X_test)
# Apply PCA
pca = PCA()
X_train_pca = pca.fit_transform(X_train_std)
# Calculate the cumulative explained variance
cumulative_variance_ratio = np.cumsum(pca.explained_variance_ratio_)
# Determine the number of components to keep for 85% variance explained
n_components = np.argmax(cumulative_variance_ratio >= 0.85) + 1
# Apply PCA with the selected number of components
pca = PCA(n_compnotallow=n_components)
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)
# Display the results
print("Original Training Data Shape:", X_train.shape)
print("Reduced Training Data Shape (PCA):", X_train_pca.shape)
print("Number of Components Selected:", n_components)
TOP