【机器学习 - 10】:PCA和梯度上升法

news2024/11/15 18:31:26

文章目录

  • 了解PCA
  • 使用梯度上升法求解第一主成分
  • 使用梯度上升法求解第二主成分
  • 求数据前n个主成分
  • 使用sklearn中封装的PCA
    • 使用真实数据集

了解PCA

PCA的概念:主成分分析(Principal Component Analysis,PCA),是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

PCA的主要目标是将特征维度变小,同时尽量减少信息损失。就是对一个样本矩阵,一是换特征,找一组新的特征来重新表示;二是减少特征,新特征的数目要远小于原特征的数目。

通过PCA将n维原始特征映射到k维(k<n)上,称这k维特征为主成分。需要强调的是,不是简单地从n维特征中去除其余n- k维特征,而是重新构造出全新的k维正交特征,且新生成的k维数据尽可能多地包含原来n维数据的信息。例如,使用PCA将20个相关的特征转化为5个无关的新特征,并且尽可能保留原始数据集的信息。

怎么找到新的维度呢?实质是数据间的方差够大,通俗地说,就是能够使数据到了新的维度基变换下,坐标点足够分散,数据间各有区分。

在这里插入图片描述
上图所示的左图中有5个离散点,降低维度,就是需要把点映射成一条线。将其映射到右图中黑色虚线上则样本变化最大,且坐标点更分散,这条黑色虚线就是第一主成分的投影方向。

PCA是一种线性降维方法,即通过某个投影矩阵将高维空间中的原始样本点线性投影到低维空间,以达到降维的目的,线性投影就是通过矩阵变换的方式把数据映射到最合适的方向。

使用梯度上升法求解第一主成分

公式

  • 向量映射
    在这里插入图片描述
  • 求某向量在X轴上的映射(求a到b的映射)
    在这里插入图片描述
  • 主成分分析法
    在这里插入图片描述
  • 主成分分析
    在这里插入图片描述
    在这里插入图片描述

步骤

  1. 生成数据
X = np.empty(shape=(100, 2))
X[:,0] = np.random.uniform(0,100,size=100)
X[:,1] = 0.75*X[:,0] + 3 + np.random.normal(0,10,size=100)

在这里插入图片描述

  1. 先做一个demean操作,均值归零的操作,这样的好处在于可以少计算平均值
def demean(X): # 传入一个矩阵使得各个维度上的均值都为0
    return X-np.mean(X, axis=0) 
    # axis = 0 : 在横的方向上取值
  1. 求方差最大的效用函数
    在这里插入图片描述
def f(X,w): # 求方差最大的效用函数
    return np.sum(X.dot(w)**2)/len(X)
  1. 求梯度
    在这里插入图片描述
def df(X,w): # 求梯度
    return X.T.dot(X.dot(w))*2./len(X)
  1. 求单位方向。因为w的模是1,那么说明w的每个维度都非常小,因为w+步长后w的模发生改变,但是我们不希望它的模发生变化,因为w作为方向向量,我们希望它的值为一,所以每次得到w之后我们都要进行处理,使它的模为1。
def direction(w): # 每次求一个单位方向
    return w/np.linalg.norm(w)
  1. 用梯度上升法求第一主成分。w的模是1,那么说明w的每个维度都非常小,所以不能选择太大值。
def gradient_ascent(X, initial_w, eta=0.00001, n_iters=1e4, espilon=1e-8):
    w = direction(initial_w)
    i_iter = 1
    while i_iter<=n_iters:
        last_w = w
        gradient = df(X,w)
        w = w + gradient*eta
        w = direction(w)
        if abs(f(X,w)-f(X,last_w)) < espilon:
            break
        i_iter += 1
    return w

在这里插入图片描述

  1. 绘制第一主成分
    在这里插入图片描述
    因为demean操作后会得到零值坐标轴,所以红线在中间部位,将值放大,即可清楚的看到第一主成分。对于PCA问题,不能用数据标准化来处理数据,因为在数据标准化中就把方差变为0,也就不存在方差最大值了。
    在这里插入图片描述

使用梯度上升法求解第二主成分

如何寻找第二主成分?
找到第一主成分之后,每一个样本都去掉第一主成分上的分量,对于这个结果,继续去求第一主成分,得到的就是第二主成分。

举个简单的例子
如下图所示,比如求y轴为它的第一主成分,那么把y轴的分量去掉,也就是去掉各点在第一主成分上的分量,即得到第二主成分。
在这里插入图片描述
在这里插入图片描述

比如说a想去掉b上的主成分,获得在c上的主成分,
在这里插入图片描述

步骤

  1. 去掉第一主成分分量(其中的w为求第一主成分中的w)
X2 = X_demean-X_demean.dot(w).reshape(-1,1)*w # 去掉第一主成分分量以后的样本
  1. 求第二主成分(其中的initial_w为求第一主成分中的initial_w)
w2 = gradient_ascent(X2, initial_w)
  1. 将第二主成分画在图上
    在这里插入图片描述
    在这里插入图片描述

求数据前n个主成分

根据以上内容,编写相应的程序:

def first_n_components(n_conponents,X,eta=0.01):
    def demean(X): #  传入一个矩阵使得各个维度上均值都维0 
        return X-np.mean(X,axis=0)

    def f(X,w): # 求方差最大的效用函数
        return np.sum(X.dot(w)**2)/len(X)

    def df(X,w): # 求梯度
        return X.T.dot(X.dot(w)) * 2. /len(X)

    def direction(w): # 每次求一个单位方向
        return w/np.linalg.norm(w)

    def first_components(X,initial_w,eta,n_iters=1e4,epsilon=1e-8): # eta取值比较小
        w = direction(initial_w)
        i_iter = 1
        while i_iter<=n_iters:
            last_w = w
            gradient = df(X,w)
            w = w+ gradient*eta
            w = direction(w)
            if abs(f(X,w)-f(X,last_w))<epsilon:
                break
            i_iter+=1
        return w
    X_p =X.copy()
    initial_w = np.random.random(X.shape[1])   # 这里不能取0
    X_p = demean(X_p)
    res = np.empty(shape=(n_conponents,X.shape[1]))
    for i in range(n_conponents):
        res[i] = first_components(X_p,initial_w,eta)
        X_p = X_p-X_p.dot(res[i]).reshape(-1,1)*res[i] 
    return res

在这里插入图片描述

使用sklearn中封装的PCA

示例1
在这里插入图片描述
在这里插入图片描述

使用真实数据集

在这里插入图片描述
在这里插入图片描述

  • 解释方差的比例,如下图所示,这两个数据表示这两个维度占了多少的方差比重,如果把64个维度算作100%,则这两个维度占了约29%。(主成分分解是从方差最大的往方差最小的求)
    在这里插入图片描述
    在这里插入图片描述

  • 根据方差比例,求主成分
    在这里插入图片描述

  • 降维的意义:方便做数据可视化
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10分钟如何轻松掌握JMeter使用方法?

目录 引言 安装jmeter HTTP信息头管理器 JMeter断言 HTTP请求默认值来代替所有的域名与端口 JSON提取器来替换变量 结语 引言 想要了解网站或应用程序的性能极限&#xff0c;JMeter是一个不可或缺的工具。但是&#xff0c;对于初学者来说&#xff0c;该如何上手使用JMe…

【LLM】低成本部署大语言模型, 并且还能达到部署在GPU上差不多的效果

目录 前言 部署 效果 问题1&#xff1a;人类为什么需要睡觉&#xff1f; 问题2&#xff1a;世界上最高的山峰是什么&#xff1f; 前言 点进来看本文的应该都知道模型对硬件的要求很高, 那我也不废话了, 直接安排最近发现的一个开源项目, 它可以帮助我们降低部署模型的成…

按摩仪市场的AB面:暗战不止,迷雾未散

配图来自Canva可画 由于生活节奏的加快以及来自各方的压力&#xff0c;再加上熬夜、长时间低头玩手机等不良生活习惯&#xff0c;导致不少人的身体都出现了亚健康状态。不过&#xff0c;随着当下健康理念逐渐深入人心&#xff0c;人们对于健康的重视程度也持续提升。无论是刘畊…

如何挖到人生中第一个漏洞?保姆级漏洞挖掘教学

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…

Java微服务商城高并发秒杀项目--013.SentinelResource的使用

在shop-order-server模块中新建AnnoController&#xff1a; RestController Slf4j public class AnnoController {RequestMapping("/anno1")SentinelResource(value "anno1",blockHandler"anno1BlockHandler",fallback "anno1Fallback&qu…

使用Stream流写出优雅的高质量代码

前言 我们在开发中会大量的用到集合&#xff0c;少不了对集合进行一些操作&#xff0c;如何优雅的遍历集合&#xff0c;操作集合&#xff0c;不仅能体现出代码的质量&#xff0c;更能体现出程序员本身对自我的要求。 文章目录 前言一、Stream初体验二、Stream流的使用2.1 获取…

python实现人脸识别(face_recognition)

一、定义 1、介绍 本项目是世界上最强大、简洁的人脸识别库&#xff0c;你可以使用Python和命令行工具提取、识别、操作人脸。 本项目的人脸识别是基于业内领先的C开源库dlib中的深度学习模型&#xff0c;用Labeled Faces in the Wild人脸数据集进行测试&#xff0c;有高达99…

ESP32(一):Win10配置 IDF+VSCode

一、安装包下载&#xff1a; Git&#xff1a;Git for WindowsPython&#xff1a;Download Python | Python.org以Windows x86-64开头的是 64 位的 Python 安装程序&#xff1b;以Windows x86开头的是 32 位的 Python 安装程序。ESP-IDF&#xff08;选择Offline版本&#xff09…

Kettle安装与使用

一、Kettle简介 Kettle最早是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff09;工具&#xff0c;全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。它由Java开发&#xff0c;…

数据结构学习记录——堆的删除(思路图解、代码实现、逐段解析)

目录 堆的删除&#xff08;最大堆&#xff09; 思路 代码 解析 堆的删除&#xff08;最大堆&#xff09; 思路 代码 ElementType DeleteMax( MaxHeap H ) { /* 从最大堆H中取出键值为最大的元素&#xff0c;并删除一个结点 */int Parent, Child;ElementType MaxItem, X…

戴尔Alienware m18r1原厂win11中文系统 带F12 Support Assist OS Recovery恢复功能

戴尔Alienware m18r1原厂win11中文系统 带F12 Support Assist OS Recovery一键恢复功能 恢复各机型预装系统&#xff0c;带所有dell主题壁纸、dell软件驱动、带戴尔SupportAssist OS Recovery恢复功能&#xff0c;一次性恢复成新机状态&#xff0c;并且以后不用重装系统&#…

手把手教你学习IEC104协议和编程实现 十三-写定值

直接进入主题,要想写入定值,首先要确定写入的是那个定值区,毕竟按照iec104的规定,定值区有8个为0~7,那么就首先涉及到了,切换定值区的过程,执行过程如下: 切换定值区 我们看到,TI=200=0xC8h 我们先设计一个按钮,用于切换定值区。如下图: 在这个按钮的相应的消息上…

【Docker_image_source】docker设置国内镜像源

关于Docker镜像源的设置 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors.ustc.edu.cn 5.阿里云容器 生成自己的加速地址 登录&am…

升级企业数智化底座 用友iuap拉满长期主义

本文转自 深度 我们普遍认为&#xff0c;人类社会经历了工业革命、电气革命&#xff0c;现在正奔赴从信息革命到智能革命的道路上&#xff0c;这一过程迫切且不可逆。 因此&#xff0c;《“十四五”数字经济发展规划》指出&#xff0c;以数字技术与实体经济深度融合为主线&a…

JavaScript:数组---双指针法

文章目录 双指针法27.移除元素为什么返回值是整数&#xff0c;但输出的答案是数组&#xff1f;双指针法 977.有序数组的平方暴力法&#xff1a;先平方再排序双指针法 总结双指针 双指针法 27.移除元素 为什么返回值是整数&#xff0c;但输出的答案是数组&#xff1f; 双指针法…

阿里工作7年,肝到P8就剩这份学习笔记了,已助朋友拿到20个Offer

在阿里工作了7年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

3.13 结构体嵌套、大小及位域

目录 结构体嵌套结构体 结构体的大小 位域 结构体嵌套结构体 含义 结构体中的成员可以是另一个结构体 语法 struct 结构体名 { struct 结构体名 成员名&#xff1b; }; 结构体中共同的变量可以单独放出来&#xff0c;单独封装一个结构体 结构体的大小 字节对齐 含义 …

微服务篇:开始从头到尾搭建第一个微服务(小白)

微服务篇 我的一个微服务 手把手写微服务项目&#xff0c;从现在开始 文章目录 微服务篇环境搭建开发工具开发环境 一、创建项目&#xff1a;创建gitee链接1、登录 gitee 创建仓库2、 给项目起一个名字&#xff08;本地名字要跟远端一致哦&#xff09; panda3、打开IDEA创建项…

19. Unity - 2D游戏开发小记02 --- 伪透视图、2D物体碰撞、瓦片地图碰撞、素材缩放平铺

1. 伪视图 在2D游戏开发当中,当角色移动时,会发生物体与物体之间的前后遮挡。2D视图中的前后关系是由 Y 轴决定,y 值越小物体越靠前。unity的渲染应开启根据 y 值的大小进行渲染才能保证正确的遮挡效果,在菜单栏Editor–>project setting --> Graphic中按照下图方式…

MySQL之Doublewrite Buffer详解

前言 本文已收录在MySQL性能优化原理实战专栏&#xff0c;点击此处浏览更多优质内容。 上一篇文章MySQL之Adaptive Hash Index详解我们学习了InnoDB Adaptive Hash Index自适应哈希索引的工作原理。其本质是将频繁访问数据页的索引键值以“Key”放在缓存中&#xff0c;“Value”…