机器学习之主成分分析(PCA)
创作时间:
作者:
@小白创作中心
机器学习之主成分分析(PCA)
引用
CSDN
1.
https://blog.csdn.net/MakotoXavier/article/details/139726490
目录
一、PCA的介绍
PCA的主要特点:
二、PCA的优缺点
优点:
PCA的缺点:
三、PCA的步骤
- 数据预处理
- 计算协方差矩阵
- 计算协方差矩阵的特征值和特征向量
- 选择主成分
- 数据转换(投影)
四、PCA实例
五、总结
一、PCA的介绍
PCA(Principal Component Analysis,主成分分析) 是一种常用的数据分析方法,主要用于数据的降维和特征提取。它通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
PCA的主要特点:
- 降维:PCA通过减少数据的维度,可以在保留数据主要特征的同时,减少计算量和存储需求。
- 特征提取:PCA可以提取数据中的主要特征,使得数据在更少的维度上依然能够保持其主要的结构和变化。
- 去相关性:PCA转换后的主成分之间是不相关的,这有助于减少数据中的冗余信息。
二、PCA的优缺点
PCA作为一种常用的数据降维和特征提取方法,具有其独特的优点和缺点。
优点:
- 简化数据结构:PCA能够将高维数据降低到低维空间,同时保留数据中的主要特征信息,使得数据结构更加简单,易于理解和分析。
- 去除相关性:PCA通过正交变换消除原始数据中的相关性,减少数据中的冗余信息,降低数据的复杂性。
- 减少计算成本:降维后的数据具有更少的特征,因此在进行机器学习模型训练时,可以减少计算量和存储需求,加速训练过程。
- 可视化:对于二维或三维的数据,PCA能够直接进行可视化,帮助人们直观地理解数据的分布和特性。
- 无监督学习:PCA是一种无监督学习方法,不需要数据的标签信息,因此可以广泛应用于各种数据集。
PCA的缺点:
- 信息损失:PCA在降维过程中会丢失一部分信息,尤其是那些与所选择的主成分不相关的特征信息。因此,在降维时需要根据实际需求和数据特性选择合适的维度。
- 对异常值和噪声敏感:PCA对数据的分布假设较强,如果数据中存在异常值或噪声,可能会对主成分的计算产生较大影响,导致降维效果不佳。
- 非线性数据处理能力有限:PCA是一种基于线性变换的方法,对于非线性数据的处理能力有限。如果数据中存在非线性关系,可能需要使用其他方法(如核PCA、流形学习等)进行降维。
- 解释性较差:PCA降维后的特征通常是原始特征的线性组合,这些组合特征可能难以解释其实际意义。因此,在需要解释性的应用场景中,PCA可能不是最佳选择。
- 对参数选择敏感:PCA中需要选择降维后的维度数(即主成分的数量),这个参数的选择对降维效果有重要影响。如果选择的维度数过少,可能会导致信息损失过多;如果选择的维度数过多,则可能无法达到预期的降维效果。因此,在实际应用中需要根据经验和数据特性进行参数选择。
三、PCA的步骤
1. 数据预处理
- 标准化:首先,对原始数据进行标准化处理,使得每个特征(或称为变量)具有零均值和单位方差。这是因为PCA对数据的尺度敏感,标准化可以消除量纲和数量级的影响。
2. 计算协方差矩阵
- 计算标准化后数据的协方差矩阵。协方差矩阵表示了数据各维度之间的相关性。对于n个样本,p个特征的数据集,协方差矩阵是一个p×p的矩阵,其中每个元素C_{ij}表示第i个特征和第j个特征之间的协方差。
3. 计算协方差矩阵的特征值和特征向量
- 对协方差矩阵进行特征分解,得到特征值和对应的特征向量。特征值表示了对应的主成分的重要性(或方差),而特征向量则代表了主成分的方向。
4. 选择主成分
- 按照特征值的大小,对特征向量进行排序,并选择前k个最大的特征值对应的特征向量。这k个特征向量将构成一个新的k维空间,即主成分空间。
- 选择k的值是一个权衡信息保留和降维程度的过程。通常,可以根据特征值的累积贡献率(即前k个特征值之和占总特征值之和的比例)来确定k的值。
5. 数据转换(投影)
- 将原始数据投影到新的k维空间中,得到降维后的数据。这可以通过将原始数据乘以选定的k个特征向量构成的矩阵来实现。
- 具体来说,假设原始数据矩阵为X(n×p),选定的k个特征向量构成的矩阵为P(p×k),则降维后的数据矩阵Y(n×k)可以通过Y = XP计算得到。
四、PCA实例
1.假设一个二维数据集
# 假设有一个二维数据集X
X = np.array([[1, 2], [1, 4], [1, 0], [1, 1],[4, 2], [4, 4], [4, 0],[4, 1],[4, 3]])
2.数据预处理
# 计算均值和标准差
mean_vec = np.mean(X, axis=0)
std_dev = np.std(X, axis=0, ddof=1)
# 标准化数据
X_std = (X - mean_vec) / std_dev
3.计算协方差矩阵
#计算协方差矩阵
cov_mat = np.cov(X_std, rowvar=False)
4.计算协方差矩阵的特征值和特征向量
#计算协方差矩阵的特征值和特征向量
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
5.选择主成分
# 选择主成分
# 排序特征值和对应的特征向量
idx = eigen_vals.argsort()[::-1]
eigen_vals_sorted = eigen_vals[idx]
eigen_vecs_sorted = eigen_vecs[:,idx]
# 选择主成分数量,例如选择前1个主成分
k = 1
eigen_vecs_k = eigen_vecs_sorted[:,:k]
6.投影数据
#投影数据到新的主成分空间
X_pca = X_std.dot(eigen_vecs_k)
7.绘制并打印降维结果
#绘制原始数据和降维后的数据
plt.figure(figsize=(8, 6))
#绘制原始数据
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='blue', label='Original Data')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Original Data')
#绘制降维后的数据
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], np.zeros_like(X_pca[:, 0]), c='red', label='PCA transformed Data')
plt.xlabel('Principal Component 1')
plt.ylabel(' ') # 因为只有一个主成分,所以y轴没有标签
plt.title('PCA transformed Data')
# 添加图例
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
# 打印结果
print("选择的特征向量:\n", eigen_vecs_k)
print("投影后的数据X_pca:\n", X_pca)
8.结果
选择的特征向量:
[[0.70710678]
[0.70710678]]
投影后的数据X_pca:
[[-0.69422499]
[ 0.22613299]
[-1.61458298]
[-1.15440399]
[ 0.64741579]
[ 1.56777378]
[-0.27294219]
[ 0.1872368 ]
[ 1.10759479]]
9.完整代码
import numpy as np
import matplotlib.pyplot as plt
# 假设有一个二维数据集X
X = np.array([[1, 2], [1, 4], [1, 0], [1, 1],[4, 2], [4, 4], [4, 0],[4, 1],[4, 3]])
#数据预处理(标准化)
mean_vec = np.mean(X, axis=0)
std_dev = np.std(X, axis=0, ddof=1)
X_std = (X - mean_vec) / std_dev
#计算协方差矩阵
cov_mat = np.cov(X_std, rowvar=False)
#计算协方差矩阵的特征值和特征向量
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
#选择主成分
# 排序特征值和对应的特征向量
idx = eigen_vals.argsort()[::-1]
eigen_vals_sorted = eigen_vals[idx]
eigen_vecs_sorted = eigen_vecs[:,idx]
# 选择主成分数量,例如选择前1个主成分
k = 1
eigen_vecs_k = eigen_vecs_sorted[:,:k]
#投影数据到新的主成分空间
X_pca = X_std.dot(eigen_vecs_k)
#绘制原始数据和降维后的数据
plt.figure(figsize=(8, 6))
#绘制原始数据
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='blue', label='Original Data')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Original Data')
#绘制降维后的数据
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], np.zeros_like(X_pca[:, 0]), c='red', label='PCA transformed Data')
plt.xlabel('Principal Component 1')
plt.ylabel(' ') # 因为只有一个主成分,所以y轴没有标签
plt.title('PCA transformed Data')
# 添加图例
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
# 打印结果
print("选择的特征向量:\n", eigen_vecs_k)
print("投影后的数据X_pca:\n", X_pca)
五、总结
PCA是一种无监督学习方法,即在进行降维时不需要使用数据的标签信息。此外,PCA对数据的分布假设较强,如果数据中存在异常值或噪声,可能会对主成分的计算产生较大影响,导致降维效果不佳。因此,在实际应用中需要根据数据特性和需求选择合适的降维方法。由于降维后的数据保留了原始数据的主要特征信息,因此可以用于后续的机器学习模型训练、数据可视化等任务。
热门推荐
场外个股期权:定义、交易规则与核心要点详解
如何有效利用听头条功能,提升信息获取效率
构建“科幻+”新型文化业态
子女能否依照父母的离婚协议,要求另一方继续支付子女成年后的抚养费?
从地方到军营:军地协作助力定向培养军士成长蜕变
如何正确补充维生素E,以增强备孕期间的生育力?
总投资711亿元 古雷炼化一体化工程二期项目开工
研究生能拿多少奖学金?各类资助政策详解
电动汽车电池:生命周期评估揭示了什么?
遭遇网约车随意加价如何维权
各口岸显“神通”,保障跨境学童通关顺畅
「國際洗標」對照表!哪些衣服不可機洗要手洗?乾洗、漂白、熨燙標誌懶人包
猫砂盆的深度探索与推荐
平面设计中民族风格元素的特点与应用
这六个婚姻误区,看你有没有犯错
雷军堪比马化腾
如何优化房产的展示效果?怎样吸引更多潜在买家?
有驾驶证但未实际驾驶是否算作驾龄?这种驾龄的计算标准是什么?
2024年中国房地产十大预测:大开发时代落幕,新模式正在形成
规范监控就是制衡权力
通窍活血降血压,清代医方(王清任《医林改错》)
至强Xeon与酷睿Core处理器的详细对比分析
丧葬补助费规定是什么?
利用ProtoBuf进行高效大文件数据传输
膝关节积液能抽吗
2024中关村论坛年会|构建科幻全产业链生态圈 “科幻之城”加速崛起
这9类人群小心甲状腺疾病,出现这些症状,及时去医院,做检查!
Excel表格中SUMIFS函数的单元格锁定技巧详解
莫迪的眼中钉,印度黑道首脑,逍遥法外的大毒枭达乌德
验孕棒的过期使用有何影响,可能会使测试结果不准确