机器学习“傻瓜式”理解(8)PCA(基础理解+梯度上升)

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维,最后所得到便是降噪后的数据集。

在这里插入图片描述
在这里插入图片描述
如上图所示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章