主成分分析PCA(Principal Component Analysis):
PCA通过以下步骤来完成目标:
对于一维数据,可用方差来衡量数据的分布或散步情况。在多维的场景里,我们很容易将变量之间的相关性表示为矩阵,专业名词是协方差矩阵。用标准差对其数值进行归一化处理后,就得到了相关矩阵。
执行特征值分解的时候,先得获得协方差矩阵的特征向量和特征值。主特征向量,也就是具有最大的特征值的向量,指示了原始数据的最大变化方向。
一个数据集(n*m),有n个实例,m个维度,PCA将它投射成一个小得多的子空间(n*d),其中d<
我们使用iris数据集来学习如何高效使用PCA进行降维,从4维降为2维。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import scale
import scipy
import matplotlib.pyplot as plt
data = load_iris()
x = data['data']
y = data['target']
#标准化 缩放成均值为0,标准差为1
x_s = scale(x, with_mean=True, with_std=True, axis=0)#这里用到了scale函数,它可以完成中心化、缩放和标准化等功能。
#中心化:将单个值减去平均值;
#缩放:将每个值除以变量的标准差;
#标准化:先中心化,然后进行放缩。
#计算相关矩阵
x_c = np.corrcoef(x_s.T)
#从相关矩阵中,找到特征值和特征向量
eig_val, eig_vec = scipy.linalg.eig(x_c)
#选择前两个特征向量
w = eig_vec[:,0:2]
#用合适的特征向量将原来4维的数据集降为2维
x_rd = x_s.dot(w)
#画出新的2维的散点图
plt.figure(1)
plt.scatter(x_rd[:,0], x_rd[:,1], c=y)
plt.xlabel('component 1')
plt.ylabel('component 2')
if __name__ == '__main__':
plt.show()
可看到,在x周和y轴上绘制出主成分,并根据目标变量给它们区分颜色。这样成分1和成分2能够区分出鸢尾花的3个类别。这样,就用PCA有效地将维度从4降为2,并保持了区分鸢尾花不同类别实例的能力。