热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习(七):主成分分析PCA降维_Python

六、PCA主成分分析(降维)github地址:https:github.comlawlite19MachineLearning_Python全部代码1、用处数据压缩(Data

六、PCA主成分分析(降维)

  • github地址:https://github.com/lawlite19/MachineLearning_Python
  • 全部代码

1、用处

  • 数据压缩(Data Compression),使程序运行更快
  • 可视化数据,例如3D-->2D
  • ……

2、2D–>1D,nD–>kD

  • 如下图所示,所有数据点可以投影到一条直线,是投影距离的平方和(投影误差)最小
    这里写图片描述
  • 注意数据需要归一化处理
  • 思路是找1向量u,所有数据投影到上面使投影距离最小
  • 那么nD-->kD就是找k个向量$${u^{(1)}},{u^{(2)}} \ldots {u^{(k)}}$$,所有数据投影到上面使投影误差最小
    • eg:3D–>2D,2个向量$${u^{(1)}},{u^{(2)}}$$就代表一个平面了,所有点投影到这个平面的投影误差最小即可

3、主成分分析PCA与线性回归的区别

  • 线性回归是找xy的关系,然后用于预测y
  • PCA是找一个投影面,最小化data到这个投影面的投影误差

4、PCA降维过程

  • 数据预处理(均值归一化)

    • 公式:$${\rm{x}}_j^{(i)} = {{{\rm{x}}_j^{(i)} - {u_j}} \over {{s_j}}}$$
    • 就是减去对应feature的均值,然后除以对应特征的标准差(也可以是最大值-最小值)
    • 实现代码:
       # 归一化数据
      def featureNormalize(X):
      '''(每一个数据-当前列的均值)/当前列的标准差'''
      n = X.shape[1]
      mu = np.zeros((1,n));
      sigma = np.zeros((1,n))

      mu = np.mean(X,axis=0)
      sigma = np.std(X,axis=0)
      for i in range(n):
      X[:,i] = (X[:,i]-mu[i])/sigma[i]
      return X,mu,sigma
  • 计算协方差矩阵Σ(Covariance Matrix):$$\Sigma  = {1 \over m}\sum\limits_{i = 1}^n {{x^{(i)}}{{({x^{(i)}})}^T}} $$
    • 注意这里的Σ和求和符号不同
    • 协方差矩阵对称正定(不理解正定的看看线代)
    • 大小为nxn,nfeature的维度
    • 实现代码:

      Sigma = np.dot(np.transpose(X_norm),X_norm)/m # 求Sigma
  • 计算Σ的特征值和特征向量
    • 可以是用svd奇异值分解函数:U,S,V = svd(Σ)
    • 返回的是与Σ同样大小的对角阵S(由Σ的特征值组成)[注意matlab中函数返回的是对角阵,在python中返回的是一个向量,节省空间]
    • 还有两个**酉矩阵**U和V,且$$\Sigma  = US{V^T}$$
    • 这里写图片描述
    • 注意svd函数求出的S是按特征值降序排列的,若不是使用svd,需要按特征值大小重新排列U
  • 降维

    • 选取U中的前K列(假设要降为K维)
    • 这里写图片描述
    • Z就是对应降维之后的数据
    • 实现代码:
       # 映射数据
      def projectData(X_norm,U,K):
      Z = np.zeros((X_norm.shape[0],K))

      U_reduce = U[:,0:K] # 取前K个
      Z = np.dot(X_norm,U_reduce)
      return Z
  • 过程总结:
    • Sigma = X'*X/m
    • U,S,V = svd(Sigma)
    • Ureduce = U[:,0:k]
    • Z = Ureduce'*x

5、数据恢复

  • 因为:$${Z^{(i)}} = U_{reduce}^T*{X^{(i)}}$$
  • 所以:$${X_{approx}} = {(U_{reduce}^T)^{ - 1}}Z$$ (注意这里是X的近似值)
  • 又因为Ureduce为正定矩阵,【正定矩阵满足:$$A{A^T} = {A^T}A = E$$,所以:$${A^{ - 1}} = {A^T}$$】,所以这里:
  • $${X_{approx}} = {(U_{reduce}^{ - 1})^{ - 1}}Z = {U_{reduce}}Z$$
  • 实现代码:
    # 恢复数据 
def recoverData(Z,U,K):
X_rec = np.zeros((Z.shape[0],U.shape[0]))
U_recude = U[:,0:K]
X_rec = np.dot(Z,np.transpose(U_recude)) # 还原数据(近似)
return X_rec

6、主成分个数的选择(即要降的维度)

  • 如何选择
    • 投影误差(project error):$${1 \over m}\sum\limits_{i = 1}^m {||{x^{(i)}} - x_{approx}^{(i)}|{|^2}} $$
    • 总变差(total variation):$${1 \over m}\sum\limits_{i = 1}^m {||{x^{(i)}}|{|^2}} $$
    • 误差率(error ratio):$${{{1 \over m}\sum\limits_{i = 1}^m {||{x^{(i)}} - x_{approx}^{(i)}|{|^2}} } \over {{1 \over m}\sum\limits_{i = 1}^m {||{x^{(i)}}|{|^2}} }} \le 0.01$$,则称99%保留差异性
    • 误差率一般取1%,5%,10%
  • 如何实现
    • 若是一个个试的话代价太大
    • 之前U,S,V = svd(Sigma),我们得到了S,这里误差率error ratio:
      $$error{\kern 1pt} \;ratio = 1 - {{\sum\limits_{i = 1}^k {{S_{ii}}} } \over {\sum\limits_{i = 1}^n {{S_{ii}}} }} \le threshold$$
    • 可以一点点增加K尝试。

7、使用建议

  • 不要使用PCA去解决过拟合问题Overfitting,还是使用正则化的方法(如果保留了很高的差异性还是可以的)
  • 只有在原数据上有好的结果,但是运行很慢,才考虑使用PCA

8、运行结果

  • 2维数据降为1维
    • 要投影的方向
      这里写图片描述
    • 2D降为1D及对应关系
      这里写图片描述
  • 人脸数据降维
    • 原始数据
      这里写图片描述
    • 可视化部分U矩阵信息
      这里写图片描述
    • 恢复数据
      这里写图片描述

9、使用scikit-learn库中的PCA实现降维

  • 导入需要的包:
#-*- coding: utf-8 -*-
# Author:bob
# Date:2016.12.22
import numpy as np
from matplotlib import pyplot as plt
from scipy import io as spio
from sklearn.decomposition import pca
from sklearn.preprocessing import StandardScaler
  • 归一化数据
    '''归一化数据并作图'''
scaler = StandardScaler()
scaler.fit(X)
x_train = scaler.transform(X)
  • 使用PCA模型拟合数据,并降维
    • n_components对应要将的维度
    '''拟合数据'''
K=1 # 要降的维度
model = pca.PCA(n_compOnents=K).fit(x_train) # 拟合数据,n_components定义要降的维度
Z = model.transform(x_train) # transform就会执行降维操作
  • 数据恢复
    • model.components_会得到降维使用的U矩阵
    '''数据恢复并作图'''
Ureduce = model.components_ # 得到降维用的Ureduce
x_rec = np.dot(Z,Ureduce) # 数据恢复

推荐阅读
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 本文介绍了如何利用TensorFlow框架构建一个简单的非线性回归模型。通过生成200个随机数据点进行训练,模型能够学习并预测这些数据点的非线性关系。 ... [详细]
  • 循环遍历簇并绘制scatter而不指定任何颜色时,将使用活动属性循环器(颜色循环)的默认颜色。活动属性循环器在rcParams定义。它是通过使用的风格设置的;在你的情 ... [详细]
author-avatar
zwjy2018
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有