Python机器学习之PCA降维算法详解


Posted in Python onMay 19, 2021

一、算法概述

  • 主成分分析 (Principal ComponentAnalysis,PCA)是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。
  • PCA 是最常用的一种降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的方差最大,以此使用较少的维度,同时保留较多原数据的维度。
  • PCA 算法目标是求出样本数据协方差矩阵的特征值和特征向量,而协方差矩阵的特征向量的方向就是PCA需要投影的方向。使样本数据向低维投影后,能尽可能表征原始的数据。
  • PCA 可以把具有相关性的高维变量合成为线性无关的低维变量,称为主成分。主成分能够尽可能的保留原始数据的信息。
  • PCA 通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。

二、算法步骤

Python机器学习之PCA降维算法详解

1.将原始数据按行组成m行n列的矩阵X

2.将X的每一列(代表一个属性字段)进行零均值化,即减去这一列的均值

3.求出协方差矩阵

4.求出协方差矩阵的特征值及对应的特征向量r

5.将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P

6.计算降维到k维的数据

三、相关概念

  • 方差:描述一个数据的离散程度

Python机器学习之PCA降维算法详解

  • 协方差:描述两个数据的相关性,接近1就是正相关,接近-1就是负相关,接近0就是不相关

Python机器学习之PCA降维算法详解

  • 协方差矩阵:协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差

Python机器学习之PCA降维算法详解

  • 特征值:用于选取降维的K个特征值
  • 特征向量:用于选取降维的K个特征向量

四、算法优缺点

优点

  • 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
  • 各主成分之间正交,可消除原始数据成分间的相互影响的因素。
  • 计算方法简单,主要运算是特征值分解,易于实现。

缺点

  • 主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
  • 方差小的非主成分也可能含有对样本差异的重要信息,降维丢弃的数据可能对后续数据处理有影响。

五、算法实现

自定义实现

import numpy as np


# 对初始数据进行零均值化处理
def zeroMean(dataMat):
    # 求列均值
    meanVal = np.mean(dataMat, axis=0)
    # 求列差值
    newData = dataMat - meanVal
    return newData, meanVal


# 对初始数据进行降维处理
def pca(dataMat, percent=0.19):
    newData, meanVal = zeroMean(dataMat)

    # 求协方差矩阵
    covMat = np.cov(newData, rowvar=0)

    # 求特征值和特征向量
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))

    # 抽取前n个特征向量
    n = percentage2n(eigVals, percent)
    print("数据降低到:" + str(n) + '维')

    # 将特征值按从小到大排序
    eigValIndice = np.argsort(eigVals)
    # 取最大的n个特征值的下标
    n_eigValIndice = eigValIndice[-1:-(n + 1):-1]
    # 取最大的n个特征值的特征向量
    n_eigVect = eigVects[:, n_eigValIndice]

    # 取得降低到n维的数据
    lowDataMat = newData * n_eigVect
    reconMat = (lowDataMat * n_eigVect.T) + meanVal

    return reconMat, lowDataMat, n


# 通过方差百分比确定抽取的特征向量的个数
def percentage2n(eigVals, percentage):
    # 按降序排序
    sortArray = np.sort(eigVals)[-1::-1]
    # 求和
    arraySum = sum(sortArray)

    tempSum = 0
    num = 0
    for i in sortArray:
        tempSum += i
        num += 1
        if tempSum >= arraySum * percentage:
            return num


if __name__ == '__main__':
    # 初始化原始数据(行代表样本,列代表维度)
    data = np.random.randint(1, 20, size=(6, 8))
    print(data)

    # 对数据降维处理
    fin = pca(data, 0.9)
    mat = fin[1]
    print(mat)

利用Sklearn库实现

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# 加载数据
data = load_iris()
x = data.data
y = data.target

# 设置数据集要降低的维度
pca = PCA(n_components=2)
# 进行数据降维
reduced_x = pca.fit_transform(x)

red_x, red_y = [], []
green_x, green_y = [], []
blue_x, blue_y = [], []

# 对数据集进行分类
for i in range(len(reduced_x)):
    if y[i] == 0:
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
    elif y[i] == 1:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
    else:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])

plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(green_x, green_y, c='g', marker='D')
plt.scatter(blue_x, blue_y, c='b', marker='.')
plt.show()

六、算法优化

PCA是一种线性特征提取算法,通过计算将一组特征按重要性从小到大重新排列得到一组互不相关的新特征,但该算法在构造子集的过程中采用等权重的方式,忽略了不同属性对分类的贡献是不同的。

  • KPCA算法

KPCA是一种改进的PCA非线性降维算法,它利用核函数的思想,把样本数据进行非线性变换,然后在变换空间进行PCA,这样就实现了非线性PCA。

  • 局部PCA算法

局部PCA是一种改进的PCA局部降维算法,它在寻找主成分时加入一项具有局部光滑性的正则项,从而使主成分保留更多的局部性信息。

到此这篇关于Python机器学习之PCA降维算法详解的文章就介绍到这了,更多相关Python PCA降维算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用python实现面向对像的ASP程序实例
Nov 10 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Python 移动光标位置的方法
Jan 20 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
python3中的eval和exec的区别与联系
Oct 10 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
Python 批量下载阴阳师网站壁纸
May 19 #Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 #Python
python使用pywinauto驱动微信客户端实现公众号爬虫
python基于tkinter实现gif录屏功能
Python 读写 Matlab Mat 格式数据的操作
May 19 #Python
python3 hdf5文件 遍历代码
May 19 #Python
Python基础之元组与文件知识总结
You might like
php学习之数据类型之间的转换代码
2011/05/29 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
[原创]图片分页查看
2006/08/28 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
python里将list中元素依次向前移动一位
2014/09/12 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
Python import用法以及与from...import的区别
2015/05/28 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
python交易记录整合交易类详解
2019/07/03 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
学习十八届三中全会精神实施方案
2014/02/17 职场文书
售后服务承诺书模板
2014/05/21 职场文书
学雷锋活动简报
2015/07/20 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android