6.PCA
6.1什么是PCA
6.1.1 PCA的实现思想
主成分分析法(Principal Componentm Analysis)是一个非监督的机器学习算法,主要用于数据降维、去噪声等,简称PCA。
问题1:对于一个二维的特征空间,如何将其降维到一维的特征空间?
解决1:在二维特征空间中找到一条直线,将特征空间中所有的样本点映射到这条直线上。
问题2:降维过程中,数据会发生丢失,如何保持数据的完整性?即如何找到这条直线能最大程度的保证数据的丢失率最低?
解决2:对于二维特征空间,样本可以映射到任意一条直线;在映射直线上,样本间的间距最大时,表示数据保存最完整;这条映射直线称为最佳映射直线。在数据统计中,使用方差来表示数据的离散程度,因此在映射直线上,其样本特征的方差越大,表示样本越离散,说明数据越完整。方差:
问题3:如何找到这条映射直线,使样本特征的方差达到最大值?
解决3:(1)对所有样本特征的均值归零,即demean,特征空间的样本分布如下所示:
(2)求映射直线的方向w=(w1,w2),使样本映射到w后,样本的方差达到最大值,即:
由于对所有样本进行demean处理,因此样本的均值为0;Xproject是一个向量,因此其距离需要求向量的模;Xproject是在映射直线上的向量,而不是在二维特征空间上的向量,如下所示。
(3)Xproject=(Xpro1,Xpro2),X=(X1,X2),w=(w1,w2)并且w是单位向量,推导如下:
即求取w,使有最大值。
问题4:在n维特征空间,该如何进行降维?
解决4:将问题3中的公式推导到n维,如下所示:
求取上式中,w为何值时,有最大值,可以使用梯度上升法来解决。
问题5:如何使用梯度上升法?
解决5:使用迭代公式,其中参数都和梯度下降法一致。
问题6:如何使用梯度上升法来求取
的最大值?
解决6:推导公式如下
其中,
6.1.2自己实现PCA算法
#程序6-1
import numpy as np
import matplotlib.pyplot as plt
X = np.empty(shape=(200,2))
X[:,0] = np.random.randint(0,1000,size=200)
X[:,1] = X[:,0]*0.5 + 600 + np.random.normal(6,30,size=200)
#demean
def demean(X):
return X - np.mean(X,axis=0)
X_demean = demean(X)
#梯度上升法
def f_x(X,w):
return sum(X.dot(w)**2)/len(X)
def df_x(X,w):
return 2.*(X.T.dot(X.dot(w))) / len(X)
#向量单位化
def unit_vector(w):
return w/np.linalg.norm(w)
#求第一主成分:梯度上升法
def first_component(X,init_w,eta,max_iters=1e4):
#w是单位向量
w = unit_vector(init_w)
cur_iters = 0
while cur_iters < max_iters:
grad = df_x(X,w)
last_w = w
w = w + eta*grad
w = unit_vector(w)
if(abs(f_x(X,w)-f_x(X,last_w)) < 1e-8):
break
cur_iters += 1
return w
#不需要进行数据归一化
eta = 0.01
#w不能是0向量
init_w = np.random.random(size=X_demean.shape[1])
w = first_component(X_demean,init_w,eta)
print(w)
#画图
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([-w[0]*550, w[0]*550], [-w[1]*550, w[1]*550], color='r')
plt.show()
运行结果:
[0.89588346 0.44428912]