机器学习基础-5.PCA和梯度上升

匿名 (未验证) 提交于 2019-12-03 00:22:01

一、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个主成分,在更高维度的空间,可能还需要继续求出其他的主成分。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!