一、PCA
1.PCA概念
PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,主要用于数据的降维,通过降维可以发现更便于人理解的特征,此外还可以应用于可视化和去噪。
例如对于有2个特征的样本,现在对样本进行降维处理。首先考虑选择特征1或者特征2,经过降维后的样本如图所示。
这个时候可以发现相对于选择特征2,选择特征1进行映射后,样本的可区分度更高。除了向某个特征做映射,还可以选择某个轴进行映射,例如下图所示的轴,样本经过映射后,可以有更大的间距。所以现在的问题就是如何找一个轴,使样本的有最大的间距。
2.求解思路
事实上,可以使用方差来定义样本之间的间距。方差越大表示样本分布越稀疏,方差越小表示样本分布越密集。
在求解方差前,可以先对样本减去每个特征的均值,这种处理方式不会改变样本的相对分布,并且求方差的公式可以转换成图示的公式。在这里,xi代表已经经过映射后的样本,此时xi每个维度上的均值都是0。
现在求一个轴的方向w=(w1,w2),使得映射到w之后方差最大。
因此求解的公式可以转换成如下形式。
因此求解的目标转换成。这就转换成了求目标函数的最优化问题,可以通过梯度上升法进行求解。
二、梯度上升法求解
1.公式求解
最终公式可以化简为如下形式。
2.代码实现
import numpy as np import matplotlib.pyplot as plt x = np.empty((100,2)) x[:,0]= np.random.uniform(0.,100.,size = 100) x[:,1]= 0.75*x[:,0]+3.+np.random.normal(0,10.,size=100) #之所以让2个特征有一定的线性关系是为了使降维更明显 plt.scatter(x[:,0],x[:,1]) plt.show()
def demean(x): return x-np.mean(x,axis=0)#对每个特征值进行求均值 def f (w,x): return np.sum((x.dot(w)**2))/len(x) def df_math(w,x): return x.T.dot(x.dot(w))*2./len(x) def direstion(w): return w /np.linalg.norm(w) #将w进行归一化,因为w仅代表方向 def gradietn_ascent(df,x,initial_w,eta,n_iters = 1e4,epsilon=1e-8): w = direstion(initial_w) cur_iter =0 while cur_iter <n_iters: gradient = df(w,x) last_w = w w = w+eta*gradient w = direstion(w) if(abs(f(w,x)-f(last_w,x))<epsilon): break return w
x_mean = demean(x) initial_w = np.random.random(x.shape[1])#初始化不能为0向量 eta = 0.01 w=gradietn_ascent(df_math,x_mean,initial_w,eta) plt.scatter(x_mean[:,0],x_mean[:,1]) plt.plot([0,w[0]*30],[0,w[1]*30],color = 'r') plt.show()
这里求得的仅仅是1个主成分,在更高维度的空间,可能还需要继续求出其他的主成分。
文章来源: 机器学习基础-5.PCA和梯度上升