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 相关文章推荐
python执行get提交的方法
Apr 29 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
python设定并获取socket超时时间的方法
Jan 12 Python
python3.7 的新特性详解
Jul 25 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
keras 多任务多loss实例
Jun 22 Python
Pycharm调试程序技巧小结
Aug 08 Python
Python 如何安装Selenium
May 06 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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
博士208HAF收音机实习报告
2021/03/02 无线电
php 文章采集正则代码
2009/12/28 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
分享15个最受欢迎的Python开源框架
2014/07/13 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Python基于template实现字符串替换
2020/11/27 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
人事专员岗位职责范本
2014/03/04 职场文书
摄影展策划方案
2014/06/02 职场文书
教师三严三实心得体会
2014/10/11 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2015公司年度工作总结
2015/05/14 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书