主成分分析(PCA)
维数灾难:
在机器学习领域中,一些关于向量的计算,随着样本维数的增加,计算量会呈指数倍增长,使得我们的计算量会变得很大,这种现象被称为维数灾难。
降维:
降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。(参见西瓜书)
降维具有如下一些优点:
• 1) 使得数据集更易使用。
• 2) 降低算法的计算开销。
• 3) 去除噪声。
• 4) 使得结果容易理解。
PCA原理:
主成分分析(PCA)是最常用的一种降维方法,PCA的主要思想是将d维特征映射到d’维上,这d’维是全新的正交特征也被称为主成分,是在原有d维特征的基础上重新构造出来的d’维特征。
假定样本进行了中心化,即∑▒x_i =0;再假定投影变换后得到的新坐标系为{w_1,w_2,…,w_d},其中w_i我标准正交基向量,||w_i||2=1,w_i^T w_j=0(i≠j),若丢弃新坐标系中的部分坐标,即将维度降低到d’(d’<d),则样本点x_i在低维坐标系中的投影是z_i=(z_i1;z_i2;…;z_id’),其中z_ij=w_j^T w_x在x_i在低维坐标系下第j维的坐标,若基于z_i来重构x_i,则会得到x_i=∑_(j=1)^d’▒〖z_ij w_j 〗。
考虑整个训练集,原样本点x_i与基于投影重构的样本点x_i之间的距离为:
∑_(i=1)m▒〖||∑_(j=1)(d^’)▒〖z_ij w_j 〗-x_i ||〗_2^2
其中W=(w_1,w_2,…,w_d),我们应该求上式的最小值,考虑到∑▒〖x_i x_i^T 〗是协方差矩阵,有:
min -tr(W^T XX^T W)
s.t. W^T W=I
所以,只需要对协方差矩阵XXT进行特征值分解,将求得的特征值从大到小排序,然后取前d’个特征值所对应的特征向量构成W=(w_1,w_2,…,w_d’),这就是主成分分析的解。
PCA算法的描述如下:
输入:样本集D={x_1,x_2,…,x_m}
低维空间维数为d’。
过程:
1:对样本进行中心化;
2:计算样本的协方差矩阵XX^T;
3:对协方差矩阵XX^T做特征值分解;
4:取最大的d’个特征值所对应的特征向量w_1,w_2,…,w_d’。
输出:投影矩阵W^=(w_1,w_2,…,w_d’)。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
def data_initialize():
data = datasets.load_iris()
x = data.data
y = data.target
return x, y # x:(150,4), y:(150,)
def PCA_train(x, d1):
X = (x.T).dot(x)
λ, w = np.linalg.eig(X) # λ为特征值, w为特征向量
W = w[0: d1, :] # 取前d1个特征向量
X1 = W.dot(x.T)
X1 = X1.T
return X1
def print_view(x, y):
x_red, y_red = [], []
x_blue, y_blue = [], []
x_green, y_green = [], []
for i in range(len(y)):
if y[i] == 0:
x_red.append(x[i][0])
y_red.append(x[i][1])
elif y[i] == 1:
x_blue.append(x[i][0])
y_blue.append(x[i][1])
else:
x_green.append(x[i][0])
y_green.append(x[i][1])
plt.scatter(x_red, y_red, c='r', marker='o')
plt.scatter(x_blue, y_blue, c='b', marker='D')
plt.scatter(x_green, y_green, c='g', marker='^')
plt.show()
if __name__ == '__main__':
x, y = data_initialize()
X = PCA_train(x, 2) # X是PCA分析后的矩阵
print_view(X, y)