zoukankan      html  css  js  c++  java
  • PCA降维算法

    PCA主成分分析算法,是一种线性降维,将高维坐标系映射到低维坐标系中。

    如何选择低维坐标系呢?

    通过协方差矩阵的特征值和特征向量,特征向量代表坐标系,特征值代表映射到新坐标的长度。

    算法步骤:

    输入:样本集D={x1,x2,...,xm};

       低维空间维数k

    第一步:将样本集中心化。每一列的特征值减去当前列的均值

    第二步:求协方差矩阵的特征值特征向量

        协方差矩阵:矩阵×矩阵的转置;

          方法:np.dot(x, np.transpot(x))

        特征值和特征向量:协方差矩阵特征分解。

          方法一:np.linalg.eig()返回:特征值,一维数组,没有排序;特征向量,二维数组,列表示特征向量

          方法二:np.linalg.svd(),返回:酉矩阵;奇异值,从大到小排序;酉矩阵

    第三步:选取前k个特征值,对应的特征向量

        新样本集:对应的特征向量×中心化数据

    输出:降维后样本集。

    k选择问题:

      方差贡献率:特征值与所有特征值总和的比值

      累计贡献率:前k个特征值和与所有特征值总和的比值

      一般根据累计贡献率选取k值。

    代码如下:

     1 import numpy as np
     2 
     3 
     4 def feature_Normalize(x):
     5     """
     6     归一化数据
     7     (每个数据-当前列的均值)/当前列的标准差
     8     :param x: 样本集
     9     :return: 归一化后样本集,均值,标准差
    10     """
    11     m, n = x.shape
    12     mean = np.zeros((1, n))
    13     std = np.zeros((1, n))
    14     # 计算各列均值
    15     mean = np.mean(x, axis=0)
    16     # 计算各列标准差
    17     std = np.std(x, axis=0)
    18     # 对每个特征值归一化
    19     for i in range(n):
    20             x[:, i] = (x[:, i] - mean[i]) / std[i]
    21     return x, mean, std
    22 
    23 
    24 def cal_eigenvalue(nor_x):
    25     """
    26     求样本协方差矩阵的特征值和特征向量
    27     :param nor_x: 归一化后的样本集
    28     :return: 特征值,特征向量,排序索引号
    29     """
    30     m, n = nor_x.shape
    31     # 协方差矩阵
    32     sigma = np.dot(np.transpose(nor_x), nor_x)/(m - 1)
    33     # 求协方差矩阵的特征值和特征向量,eig_vec[:,i]是对应于eig_val[i]的特征向量
    34     eig_val, eig_vec = np.linalg.eig(sigma)
    35     index = eig_val.argsort()
    36     return eig_val, eig_vec, index
    37 
    38 
    39 def pca(x, k):
    40     """
    41     提取前k个主成分
    42     :param x: 样本集
    43     :param k: 前k个特征值
    44     :return: 返回降维后样本,累计贡献度,主成分索引
    45     """
    46     # 归一化
    47     nor_x, mean, std = feature_Normalize(x)
    48     # 求特征值和特征向量
    49     eig_val, eig_vec, index = cal_eigenvalue(nor_x)
    50     eig_index = index[:-(k+1):-1]
    51     # 累计贡献度
    52     sum_con = sum(eig_val[eig_index])/sum(eig_val)
    53     # 前k个特征值对应的特征向量
    54     k_eig_vec = eig_vec[:, eig_index]
    55     lowDData = np.dot(nor_x, k_eig_vec)
    56     return lowDData, sum_con, eig_index
  • 相关阅读:
    Java Image Processing
    贝塞尔曲线开发的艺术
    Ubuntu中Hadoop环境搭建
    FIRST集合、FOLLOW集合、SELECT集合以及预测分析表地构造
    Linux环境下使用VSCode编译makefile文件的注意事项
    神经记忆模型
    深度学习推荐阅读的论文
    博客园无法发布文章解决办法
    计算机各个方向名校公开课
    软件过程基础
  • 原文地址:https://www.cnblogs.com/reaptomorrow-flydream/p/9687805.html
Copyright © 2011-2022 走看看