PCA(Principal Components Analysis)
基础理解以及公式推导
我们在机器学习的过程中需要实现数据的优化处理,降维处理是实现数据优化的手段,主成分分析则是实现数据降维的主要手段。主成分分析便是在我们所有的数据特征中选出主要影响我们最终预测结果的一些特征,但是值得注意的是,PCA不是进行特征选择的过程,而是将高维空间的数据映射到低维空间,低维空间的每个维度,是原始的高维空间的一些线性组合,这便使得PCA以后低维空间,每一个维度都失去了原来的意义。但是如果对于你的项目而言保持语意十分重要,那就不推荐PCA降维算法。
降维的思路:
①优化数据集,进行数据降维。
②目标便是使得降维后数据分布的方差最大,用到的方法便是梯度上升法。
③PCA是一种非监督学习的方法,主要用于数据的降维降噪处理。
分析图片
公式推广:
主要使用的方法就是梯度上升法。
使用梯度上升法的梯度推导过程:
PCA降维的基本原理:
寻找另外一个坐标系,用这个坐标系来表示原来坐标中的数据,寻找前K个主要的做标准,也就是主成分,将数据樱映射到这k个轴上,便实现了数据的降维处理。
实现代码的封装:
import numpy as np
class PCA:
def __init__(self,n_components):
'''check'''
assert n_components >= 1,\
"the value must be >=1"
self.n_components = n_components
self.components = None
def fit(self,X,eta=0.01,n_iters=1e4):
'''check'''
assert self.n_components <= X.shape[1],\
"the size must be valid"
'''No.1 demean'''
def demean(x):
return x - np.mean(X,axis = 0)
'''No.2 '''
def f(w,x):
return np.sum((X.dot(w)) **2 ) / len(x)
'''No.3 Df'''
def df(w,x):
return x.T.dot(x.dot(w)) * 2 / len(x)
'''No.4 direction'''
def direction(w):
return w / np.linalg.norm(w)
'''No.5 get first component'''
def first_component(X,initial_w,eta=0.01,n_iters = 1e4,epsilon = 1e-8):
w = initial_w
cur_iter = 0
while cur_iter < n_iters:
gradient = df(w,X)
last_w = w
w = w + eta*gradient
if(abs(f(w,X) - f(last_w,X)) < epsilon):
break
cur_iter+=1
return w
'''main step'''
X_demean = demean(X)
self.components = np.empty(shape=(self.n_components,X.shape[1]))
for i in range(self.n_components):
initial_w = np.random.random(X_demean.shape[1])
w = first_component(X,initial_w)
self.components[i,:] = w
X_demean = X_demean - X_demean.dot(w).reshape(-1,1) * w
return self
def transform(self,X):
'''check'''
assert X.shape[1] == self.components.shape[1],\
"the size must be valid"
return X.dot(self.components.T)
def inverse_transform(self, X):
'''check'''
assert X.shape[1] == self.components.shape[0], \
"the size must be valid"
return X.dot(self.components)
def __repr__(self):
'''desc'''
return "PCA(n_components=%d)" % self.n_components
另外:PCA降维在特征脸识别和降噪处理应用十分广泛。
降噪:我们将m维的数据降维到k维,然后再讲k维数据降回到m维,最后所得到便是降噪后的数据集。
如上图所示。