1 简介

PCA(Principal Component Analysis)即主成分分析是最常见的降维方法, 它是一种统计方法。用于高维数据集的探索与可视化,还可用于数据的压缩和预处理。可通过正交变换把具有相关性的高维变量转换为线性无关的低维变量,这组低维变量称为主成分,它能保留原始数据的信息。

2 PCA算法过程

1)输入:样本集D={x1,x2,…,xn};低维空间数d’
2)过程:
①对所有样本进行中心化;
②计算样本的协方差矩阵XX^(T);
③对协方差矩阵XX^(T)作特征值分解;
④取最大的d’个特征值所对应的特征向量w1,w2,…,w(d’)
3)输出:
投影矩阵W=(w1,w2,…,w(d’))

PCA应用:
主成分分析作为基础的数学分析方法,其实际应用十分广泛,比如人口统计学、数量地理学、分子动力学模拟、数学建模、数理分析等学科中均有应用,是一种常用的多变量分析方法。 [1]

3 sklearn实现主成分分析

1)完整代码如下(代码可复现):

"""
PCA实现高维数据可视化  03.28
目标:已知鸢尾花数据是4维,共3类样本,使用PCA实现降维,
并在二维平面上可视化
"""
# 1 建立工程,导入sklearn 相关工具包
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
# 2 加载数据并进行降维
data = load_iris()
y = data.target
x = data.data
pca = PCA(n_components = 2)
reduced_x = pca.fit_transform(x)
# 3 按类别对降维后的数据进行保存
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])
# 4 降维后数据可视化
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.show()

(2)部分代码解析:
1)加载数据集并进行降维操作
其中y为数据集中的标签,x为属性数据
指定主成分个数n_components 为2
对原始数据降维后保存于reduced_x中

data = load_iris()
y = data.target
x = data.data
pca = PCA(n_components = 2)
reduced_x = pca.fit_transform(x)

2)按类别对降维后数据保存
先用红蓝绿三种颜色分别表示数据;
用for in 循环按标签y分明类别0,1或其他,
将不同数据保存在不同列表中

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])

3)将降维后的数据可视化,用plt.scatter(数据,标签,颜色,标记类型)
处理分类图,plt.show()绘出图形

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.show()
  1. 由此代码绘出的图形如下:

    5)对代码存在的疑问:
    sklearn中的iris数据集如何下载到本地?
    若要读取本地数据进行上述操作该怎样做?

参考文献
[1]林海明,杜子芳. 主成分分析综合评价应该注意的问题[J]. 统计研究,2013,30(08):25-31