感谢:
1. 主成分分析 python, sklearn
2. Python主成分分析-经典案例分析
1. 概念
利用正交变换把由线性相关变量表示的观测数据转换为少数几个由线性无关变量表示的数据,线性无关的变量称为主成分。
2. 基本思想/分析步骤
Step1. 对给定数据进行规范化:使得数据每一变量的平均值为0,方差为1;
Step2. 对数据进行正交变换:原来由线性相关变量表示的数据,通过正交变换变成由若干个 线性无关的新变量表示的数据。新变量是可能的正交变换中变量的方差和(信息保存)最大的,方差表示在新变量上信息的大小。将新变量依次称为第一主成分、第二主成分等。
3. 功用
(1)可以利用主成分近似地表示原始数据,可理解为发现数据的“基本结构”;
(2)可以把数据由少数主成分表示,这可理解为对数据降维。
4. 应用场景
数据降维,常用的无监督学习方法。
5. 案例代码
案例简介:
分析的样本为鸢尾花,已知鸢尾花数据是4维的,共三类样本,使用PCA实现对鸢尾花数据进行降维,实现在二维平面上的可视化。
代码:
# sklearn 计算主成分时使用的是协方差矩阵,而不是相关系数矩阵。
import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_iris
from sklearn.preprocessing import scale
# step1.加载数据
x, y = load_iris(return_X_y=True) # x表示数据集中的属性数据,y表示数据标签
# print(x.shape) # (150,4)
# print(y.shape) # (150,)
# step2. 数据处理
# x = scale(x) # 不需单独标准化处理,已包含在后面的pca.fit_transform(x)中
pca = dp.PCA(n_components=2) # 加载pca算法,设置降维后主成分数目为2
reduced_x = pca.fit_transform(x) # 对原始数据进行降维,保存在reduced_x中(已包含标准化处理)
# print("reduced_x.shape ---", reduced_x.shape) # (150, 2)
# step3. 绘图显示
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
for i in range(len(reduced_x)): # 按鸢尾花的类别将降维后的数据点保存在不同的表表中
if y[i] == 0:
red_x.append(reduced_x[i][0])
red_y.append(reduced_x[i][1])
elif y[i] == 1:
blue_x.append(reduced_x[i][0])
blue_y.append(reduced_x[i][1])
else:
green_x.append(reduced_x[i][0])
green_y.append(reduced_x[i][1])
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.savefig("./pca_img.png")
plt.show()
6. 涉及的数学知识点
6.1 正交变换
感谢这篇文章:一文让你通俗易懂的理解正交变换和正交矩阵
一些重要点的整理:
- 能使变换后的向量长度,向量之间的内积、距离、夹角等很多性质都不变,这种变换,我们称为正交变换,用于实施这种变换的矩阵,我们称为正交矩阵,这种变换的特性,我们称为正交变换的不变性。
- 如果矩阵 A A A满足: A AT = AT A = E ,则A为正交矩阵。