Python使用三种方法实现PCA算法


Posted in Python onDecember 12, 2017

主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域。它的主要作用是对高维数据进行降维。PCA把原先的n个特征用数目更少的k个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k个特征互不相关。关于PCA的更多介绍,请参考:https://en.wikipedia.org/wiki/Principal_component_analysis.

主成分分析(PCA) vs 多元判别式分析(MDA)

PCA和MDA都是线性变换的方法,二者关系密切。在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣。

一句话,通过PCA,我们将整个数据集(不带类别标签)映射到一个子空间中,在MDA中,我们致力于找到一个能够最好区分各类的最佳子集。粗略来讲,PCA是通过寻找方差最大的轴(在一类中,因为PCA把整个数据集当做一类),在MDA中,我们还需要最大化类间散布。

在通常的模式识别问题中,MDA往往在PCA后面。

PCA的主要算法如下:

  1. 组织数据形式,以便于模型使用;
  2. 计算样本每个特征的平均值;
  3. 每个样本数据减去该特征的平均值(归一化处理);
  4. 求协方差矩阵;
  5. 找到协方差矩阵的特征值和特征向量;
  6. 对特征值和特征向量重新排列(特征值从大到小排列);
  7. 对特征值求取累计贡献率;
  8. 对累计贡献率按照某个特定比例,选取特征向量集的字迹合;
  9. 对原始数据(第三步后)。

其中协方差矩阵的分解可以通过按对称矩阵的特征向量来,也可以通过分解矩阵的SVD来实现,而在Scikit-learn中,也是采用SVD来实现PCA算法的。

本文将用三种方法来实现PCA算法,一种是原始算法,即上面所描述的算法过程,具体的计算方法和过程,可以参考:A tutorial on Principal Components Analysis, Lindsay I Smith. 一种是带SVD的原始算法,在Python的Numpy模块中已经实现了SVD算法,并且将特征值从大从小排列,省去了对特征值和特征向量重新排列这一步。最后一种方法是用Python的Scikit-learn模块实现的PCA类直接进行计算,来验证前面两种方法的正确性。

用以上三种方法来实现PCA的完整的Python如下:

import numpy as np
from sklearn.decomposition import PCA
import sys
#returns choosing how many main factors
def index_lst(lst, component=0, rate=0):
  #component: numbers of main factors
  #rate: rate of sum(main factors)/sum(all factors)
  #rate range suggest: (0.8,1)
  #if you choose rate parameter, return index = 0 or less than len(lst)
  if component and rate:
    print('Component and rate must choose only one!')
    sys.exit(0)
  if not component and not rate:
    print('Invalid parameter for numbers of components!')
    sys.exit(0)
  elif component:
    print('Choosing by component, components are %s......'%component)
    return component
  else:
    print('Choosing by rate, rate is %s ......'%rate)
    for i in range(1, len(lst)):
      if sum(lst[:i])/sum(lst) >= rate:
        return i
    return 0

def main():
  # test data
  mat = [[-1,-1,0,2,1],[2,0,0,-1,-1],[2,0,1,1,0]]
  
  # simple transform of test data
  Mat = np.array(mat, dtype='float64')
  print('Before PCA transforMation, data is:\n', Mat)
  print('\nMethod 1: PCA by original algorithm:')
  p,n = np.shape(Mat) # shape of Mat 
  t = np.mean(Mat, 0) # mean of each column
  
  # substract the mean of each column
  for i in range(p):
    for j in range(n):
      Mat[i,j] = float(Mat[i,j]-t[j])
      
  # covariance Matrix
  cov_Mat = np.dot(Mat.T, Mat)/(p-1)
  
  # PCA by original algorithm
  # eigvalues and eigenvectors of covariance Matrix with eigvalues descending
  U,V = np.linalg.eigh(cov_Mat) 
  # Rearrange the eigenvectors and eigenvalues
  U = U[::-1]
  for i in range(n):
    V[i,:] = V[i,:][::-1]
  # choose eigenvalue by component or rate, not both of them euqal to 0
  Index = index_lst(U, component=2) # choose how many main factors
  if Index:
    v = V[:,:Index] # subset of Unitary matrix
  else: # improper rate choice may return Index=0
    print('Invalid rate choice.\nPlease adjust the rate.')
    print('Rate distribute follows:')
    print([sum(U[:i])/sum(U) for i in range(1, len(U)+1)])
    sys.exit(0)
  # data transformation
  T1 = np.dot(Mat, v)
  # print the transformed data
  print('We choose %d main factors.'%Index)
  print('After PCA transformation, data becomes:\n',T1)
  
  # PCA by original algorithm using SVD
  print('\nMethod 2: PCA by original algorithm using SVD:')
  # u: Unitary matrix, eigenvectors in columns 
  # d: list of the singular values, sorted in descending order
  u,d,v = np.linalg.svd(cov_Mat)
  Index = index_lst(d, rate=0.95) # choose how many main factors
  T2 = np.dot(Mat, u[:,:Index]) # transformed data
  print('We choose %d main factors.'%Index)
  print('After PCA transformation, data becomes:\n',T2)
  
  # PCA by Scikit-learn
  pca = PCA(n_components=2) # n_components can be integer or float in (0,1)
  pca.fit(mat) # fit the model
  print('\nMethod 3: PCA by Scikit-learn:')
  print('After PCA transformation, data becomes:')
  print(pca.fit_transform(mat)) # transformed data      
main()

运行以上代码,输出结果为:

Python使用三种方法实现PCA算法

这说明用以上三种方法来实现PCA都是可行的。这样我们就能理解PCA的具体实现过程啦~~有兴趣的读者可以用其它语言实现一下哈

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
创建Django项目图文实例详解
Jun 06 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
pandas 选取行和列数据的方法详解
Aug 08 Python
Python面向对象之Web静态服务器
Sep 03 Python
基于python实现学生信息管理系统
Nov 22 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
Python request post上传文件常见要点
Nov 20 Python
pycharm实现猜数游戏
Dec 07 Python
Java分治归并排序算法实例详解
Dec 12 #Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 #Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 #Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 #Python
你真的了解Python的random模块吗?
Dec 12 #Python
Python判断两个对象相等的原理
Dec 12 #Python
浅谈Django REST Framework限速
Dec 12 #Python
You might like
基于pear auth实现登录验证
2010/02/26 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python开发之for循环操作实例详解
2015/11/12 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
python解析多层json操作示例
2019/12/30 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
应届生自荐信范文
2014/02/21 职场文书
洗车工岗位职责
2014/03/15 职场文书
辩论赛主持词
2014/03/18 职场文书
说明书怎么写
2014/05/06 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书