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使用心得之获得github代码库列表
Jun 25 Python
python根据路径导入模块的方法
Sep 30 Python
python执行外部程序的常用方法小结
Mar 21 Python
python数组过滤实现方法
Jul 27 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
微信小程序调用python模型
Apr 21 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
基于pear auth实现登录验证
2010/02/26 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
jquery UI 1.72 之datepicker
2009/12/29 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Python 移动光标位置的方法
2019/01/20 Python
python os模块简单应用示例
2019/05/23 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
python tkinter实现连连看游戏
2020/11/16 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
物流仓储实习自我鉴定
2013/09/25 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
电大本科自我鉴定
2014/02/05 职场文书
满月酒主持词
2014/03/27 职场文书
力克胡哲观后感
2015/06/10 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js