欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习之PCA

程序员文章站 2022-07-13 08:51:35
...

    在机器学习中,数据预处理极为重要,好的数据预处理往往比模型更为关键,数据预处理中降维是相当重要的一个环节。常见的降维方法有很多种,如:SVD奇异值分解法,PCA主成分分析法等,这里主要针对PCA谈谈自己的看法。

PCA概念

    PCA的思想是将数据从原来的坐标系转换到新的坐标系中,新的坐标系的选择与数据本身相关。第一个新的坐标轴是原始数据中方差最大的方向,第二个新的坐标轴是与第一个坐标轴正交且具有最大方差的方向,一只重复该过程,直到轴数达到原数据的特征数。方差越大信息量就越大,大部分的方差都包含的最前面的几个新坐标轴中,可以保留这些前边的轴,忽略后边的轴,这就是降维处理。

PCA原理

    PCA算法流程如下:

  1. 中心化,每一个特征都减去各自的平均值(主要是方便计算);
  2. 计算协方差矩阵(二维的是计算方差,多维的计算协方差);
  3. 计算协方差矩阵的特征值和特征向量;
  4. 将特征值从大到小排序;
  5. 保留最大的k个特征向量;
  6. 将数据转换到k个特征向量构成的新坐标系中。
PCA计算步骤

    假设x=(x1,x2,...,xn)Tx=(x_1, x_2, ..., x_n)^Tnn维的随机矢量,我们想要降维指k维(0<k<n)0<k<n)则PCA具体计算步骤如下:

  1. 对每个样本进行中心化处理,xi=xi1ni=1nxix_i = x_i - \frac{1}{n} \sum_{i=1}^n x_i
  2. 计算协方差矩阵
    cov(xi,xj)=E[(xiE(xi))(xjE(xj))]=1n1(xix)(xjx)T \begin{aligned} cov(x_i, x_j) &= E[(x_i - E(x_i))(x_j - E(x_j))] \\ &=\frac{1}{n-1}(x_i - \overline x)(x_j - \overline x)^T \end{aligned}
  3. 计算特征值和特征向量

    这里首先说明一下特征值与特征向量的概念:假设AAnn阶方阵,如果存在一个数λ\lambda和非零nn维向量,使得 Ax=λxAx = \lambda x成立,则称 mm为矩阵AA的一个特征值,xx则称为AA的对应于特征值λ\lambda的特征向量。
    利用 Ax=λxAx = \lambda x变换为: AλEx=0|A - \lambda E| x = 0EEnn维的单位向量,解出该方程就可以得到特征值 λ\lambda,将λ\lambda带入,则可求出对应的特征向量。

  1. 将特征值进行排序,选出前k个对应的特征向量,即为我们需要的数据。
PCA代码实现
import numpy as np

def func_pca(input, k):
    """
    这里的input默认都是预处理过的,都是数值类型,维度为 m * n
    """
    m, n = input.shape
    if k > n:
        assert "k 必须小于特征维度!“
    # 中心化
    average = np.mean(input, 0)
    input_average = input - average
    # 计算协方差矩阵
    cov_vec = np.conv(input_average.T)
    # 计算协方差也可以按照公式计算
    # cov_vec = 1/(m-1+1e-6) * np.dot(input_average.T, input_average)
    # 求解特征值和特征向量
    feature_val, feature_vec = np.linalg.eig(cov_vec)
    # 获取前 k 个特征向量
    index_val = np.argsort(-feature_val)
    selected_vec = feature_vec[:, :k]
    # 获取data
    data = np.dot(input_average, selected_vec)
    return data
    

    这里顺便说一下协方差的意义:

  1. cov(X, Y) > 0时,表示 X 与 Y正相关;
  2. cov(X, Y) < 0时,表示 X 与 Y负相关;
  3. cov(X, Y) = 0时,表示 X 与 Y不相关;

    这里的相关指的是线性相关,并不能得到他们之间的非线性关系。

相关标签: PCA PCA降维