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

2023-11-04

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

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)       # 数据恢复
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习(七):主成分分析PCA降维_Python 的相关文章

  • 检测到通过 ChromeDriver 启动的 Chrome 浏览器

    我正在尝试在 python 中使用 selenium chromedriver 来访问 www mouser co uk 网站 然而 从第一次拍摄开始 它就被检测为机器人 有人对此有解释吗 此后我使用的代码 options Options
  • 致命:.git/info/refs 无效:这是一个 git 存储库吗?

    我有一个托管在 Assembla 上的 Git 存储库 我正在尝试执行以下操作 git push u origin master 我一遍又一遍地收到以下错误 fatal https url repo name git info refs n
  • 使用 Python 创建 MIDI

    本质上 我正在尝试从头开始创建 MIDI 并将它们放到网上 我对不同的语言持开放态度 但更喜欢使用Python 两种语言之一 如果这有什么区别的话 并且想知道我应该使用哪个库 提前致谢 看起来这就是您正在寻找的 适用于 Python 的简单
  • TensorFlow:带有轴选项的 bincount

    在 TensorFlow 中 我可以使用 tf bincount 获取数组中每个元素的计数 x tf placeholder tf int32 None freq tf bincount x tf Session run freq feed
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • Python问题:打开和关闭文件返回语法错误

    大家好 我发现了这个有用的 python 脚本 它允许我从网站获取一些天气数据 我将创建一个文件和其中的数据集 有些东西不起作用 它返回此错误 File
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • 如何使用Python保存“完整的网页”而不仅仅是基本的html

    我正在使用以下代码来使用 Python 保存网页 import urllib import sys from bs4 import BeautifulSoup url http www vodafone de privat tarife r

随机推荐

  • 为什么我选择了springcloud而不是dubbo?

    写好的代码越来越满足不了需求 因为需求总是在不断的变化 在技术选型时 实在是心有余而力不足 思来想去 就考虑了使用微服务架构来实现 功能模块化 今天主要讲讲为什么需要微服务架构 还是以故事的形式呈现 一 认识微服务 阶段一 单体服务 话说小
  • 重新理解百度智能云:写在大模型开放后的24小时

    在这些回答背后共同折射出的一个现实是 大模型不再是一个单选题 而更是一个综合题 在这个新的时代帆船上 产品 服务 安全 开放等全部都需要成为必需品 甚至是从企业的落地层面来看 这些更是刚需品 作者 皮爷 出品 产业家 过去的5个月 李亮很忙
  • 哇,ElasticSearch多字段权重排序居然可以这么玩

    背景 读者提问 ES 的权重排序有没有示列 参考参考 刚好之前也稍微接触过 于是写了这篇文章 可以简单参考下 在很多复杂的业务场景下 排序的规则会比较复杂 单一的降序 升序无法满足日常需求 不过 ES 中提供了给文档加权重的方式来排序 还是
  • python中的tkinter包的使用-Label & Button

    首先我们先建一个简单的窗口 代码 import tkinter as tk window tk Tk window title my window window geometry 200x100 窗口尺寸 l tk Label window
  • 算法—打印回形数

    题目 题目描述 回形数是一个矩阵输出 从矩阵的左上角往右开始打印数字0 遇到矩阵边界时 顺时针90方向继续打印 并数字增长1 如此类推直到把矩阵填满 输入一个整形宽和高单位 每输出一个数字 占用1单位宽高空间 根据入参打印出对应的回形数 输
  • 【Linux】root和子用户都能执行的命令,sudo无法执行(已解决)

    全流程帖子 https ask oceanbase com t topic 35604437 7 1 问题 如题 在编译miniob的时候遇到如下错误 mu vm cnt8 code miniob sudo bash build sh in
  • 华为OD机试 - 座位调整(Python)

    题目描述 疫情期间课堂的座位进行了特殊的调整 不能出现两个同学紧挨着 必须隔至少一个空位 给你一个整数数组 desk 表示当前座位的占座情况 由若干 0 和 1 组成 其中 0 表示没有占位 1 表示占位 在不改变原有座位秩序情况下 还能安
  • 如何申请@MSN.Com后缀的邮箱?

    最近辞职在家无事 想申请个 MSN Com后缀的信箱 在网上搜索了一下 原来只要从下面的地址进入注册即可 注册抵制 https accountservices passport net reg srf ns msn com sl 1 lc
  • Pytorch深度学习(六):Softmax函数实现多分类

    Pytorch深度学习 六 Softmax函数实现多分类 参考B站课程 PyTorch深度学习实践 完结合集 传送门 PyTorch深度学习实践 完结合集 一 预备知识 多分类 与之前的二分类不同 这个例子要识别手写数字的多分类 需要求出各
  • surface go 快乐装Ubuntu

    咳咳 首先我只是想体验一下 surface go 装Ubuntu 滑稽 每次开机看到田字格 然后显示出Ubuntu 有一种莫名的喜感 安装前准备 一个u盘 至少能装下你的映像文件 一台笔记本 拿来看博客 百度 你的surface go 我拿
  • (2)Mysql的安装及配置

    一 下载mysql 安装mysql有两种方式 一种是下载安装包安装 另一种是下载压缩包解压配置 这里使用安装包方式 进去后点击下面的Download 点击No thinks进入下载 二 安装mysql 双击下载好的安装包 选择Server
  • IntelliJ IDEA+SpringBoot+Tomcat部署404问题

    因为并行开发 后端一直拿不出接口 我不得不自己做Mock 为了完成网络请求逻辑 我使用Idea做模拟接口 后来发现 使用Idea创建的SpringBoot项目在软件内部的虚拟Tomcat上面可以正常运行 但是因为要做一些WebSocket和
  • 苹果笔记本计算机管理员删除,如何删除一个管理员?

    注销要删除的管理员帐户 再以管理员帐户登入 然后跟下面方法 如果您是管理员 则可以删除您不再想让其可访问电脑的用户 删除用户时 您可以存储该用户的个人文件夹 包含用户的文件和设置 或删除该个人文件夹 选取苹果菜单 gt 系统偏好设置 然后点
  • Python反反爬之JS混淆---动态Cookie(持续更新详细教程)

    写在前面 第一题JS混淆 源码乱码 经过上一题的练习JS混淆 源码乱码 我们已经对JS混淆有了大致的了解 这次我们再来练习一道同类型的题目 只不过这次是动态Cookie 首先 让我们了解一下什么是Cookie Cookie 并不是它的原意
  • lua中的常用字符串处理方法

    对lua中string类库中常用方法总结一二 1 数字和字符串相加减lua自动转换 2 得到字符串的长度 3 string byte 返回字符的内部数字编码 ASCII码 4 string char 返回和参数数量相同长度的字符串 其中每个
  • LeetCode202.快乐数(Python)

    题目 解题思路 运用哈希表 将各个位数进行平方 将得到的数进行判断 如果为1输出True 如果不为1 判断是否重复了 如果重复输出False 如果没有重复 进行各个位数平方 反复以上操作 class Solution def isHappy
  • [转]Smartgit :Remove Discard Delete

    Smartgit Remove Discard Delete https blog csdn net u010272085 article details 85039801 Remove 从仓库中移除选中的文件或目录 可通过Discard还
  • C# this.Invoke()的作用与用法、不阻塞UI界面线程的延时函数

    一 this Invoke 的作用与用法 不阻塞UI界面线程的延时函数 Invoke 的作用是 在应用程序的主线程上执行指定的委托 一般应用 在辅助线程中修改UI线程 主线程 中对象的属性时 调用this Invoke 在多线程编程中 我们
  • CH9-网络编程

    目标 了解HTTP协议通信简介 能够说出什么是HTTP协议 掌握HttpURLConnection的使用方法 能够使用HttpURLConnection访问网络 掌握WebView控件的使用方式 能够使用WebView控件加载不同的网页 掌
  • 机器学习(七):主成分分析PCA降维_Python

    六 PCA主成分分析 降维 github地址 https github com lawlite19 MachineLearning Python 全部代码 1 用处 数据压缩 Data Compression 使程序运行更快 可视化数据 例