【Educoder】— 机器学习(PCA第二关)

这篇具有很好参考价值的文章主要介绍了【Educoder】— 机器学习(PCA第二关)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

任务描述

相关知识

PCA与降维

1. demean

2. 协方差矩阵

3. 特征值与特征向量

编程要求

测试说明


PCA第二关—PCA算法流程

任务描述

本关任务:补充 python 代码,完成 PCA 函数,实现降维功能。

相关知识

为了完成本关任务,你需要掌握:

  • demean;
  • 协方差;
  • 特征值分解;
  • PCA 算法流程。

PCA与降维

降维的方法有很多,而最为常用的就是PCA(主成分分析)。 PCA 是将数据从原来的坐标系转换到新的坐标系,新的坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交方差最大的方向。然后该过程一直重复,重复次数为原始数据中的特征数量。最后会发现大部分方差都包含在最前面几个新坐标轴中,因此可以忽略剩下的坐标轴,从而达到降维的目的。

PCA的算法流程

PCA 在降维时,需要指定将维度降至多少维,假设降至 k 维,则 PCA 的算法流程如下:

  1. demean;
  2. 计算数据的协方差矩阵;
  3. 计算协方差矩阵的特征值与特征向量;
  4. 按照特征值,将特征向量从大到小进行排序;
  5. 选取前 k 个特征向量作为转换矩阵;
  6. demean 后的数据与转换矩阵做矩阵乘法获得降维后的数据。

其中demean ,协方差矩阵,特征值与特征向量的相关知识如下:

1. demean

demean 又称为零均值化,意思是将数据中每个维度上的均值变成 0。那为什么要这样做呢? PCA 实质上是找方差最大的方向,而方差的公式如下(其中μ为均值):

Var(x)=n1​i=1∑n​(x−μ)2

如果将均值变成0,那么方差计算起来就更加方便,如下:

Var(x)=n1​i=1∑n​(x)2

在 numpy 中想要 demean 很简单,代码如下:

 
  1. import numpy as np
  2. #计算样本各个维度的均值
  3. u = np.mean(data, axis=0)
  4. #demean
  5. after_demean = data - u

2. 协方差矩阵

协方差描述的是两个特征之间的相关性,当协方差为正时,两个特征呈正相关关系(同增同减);当协方差为负时,两个特征呈负相关关系(一增一减);当协方差为0时,两个特征之间没有任何相关关系。

协方差的数学定义如下(假设样本有 x 和 y 两种特征,而 X 就是包含所有样本的 x 特征的集合, Y 就是包含所有样本的 y 特征的集合):

conv(X,Y)=n−1∑i=1n​(xi​−μx​)∑i=1n​(yi​−μy​)​

如果在算协方差之前做了 demean 操作,那么公式则为:

conv(X,Y)=n−1∑i=1n​xi​∑i=1n​yi​​

假设样本只有 X 和 Y 这两个特征,现在把 X 与 X, X 与 Y, Y 与 X, Y 与 Y 的协方差组成矩阵,那么就构成了协方差矩阵。而协方差矩阵反应的就是特征与特征之间的相关关系。

X Y
X conv(X,X) conv(X,Y)
Y conv(Y,X) conv(Y,Y)

NumPy 提供了计算协方差矩阵的函数 cov,示例代码如下:

 
  1. import numpy as np
  2. # 计算after_demean的协方差矩阵
  3. # after_demean的行数为样本个数,列数为特征个数
  4. # 由于cov函数的输入希望是行代表特征,列代表数据的矩阵,所以要转置
  5. cov = np.cov(after_demean.T)

3. 特征值与特征向量

特征值与特征向量的数学定义:如果向量v 与矩阵 A 满足 Av=λv ,则称向量 v 是矩阵A的一个特征向量, λ 是相应的特征值。

因为协方差矩阵为方阵,所以我们可以计算协方差矩阵的特征向量和特征值。其实这里的特征值从某种意义上来说体现了方差的大小,特征值越大方差就越大。而特征值所对应的特征向量就代表将原始数据进行坐标轴转换之后的数据。

numpy 为我们提供了计算特征值与特征向量的接口 eig,示例代码如下:

  1. import numpy as np
  2. #eig函数为计算特征值与特征向量的函数
  3. #cov为矩阵,value为特征值,vector为特征向量
  4. value, vector = np.linalg.eig(cov)

因此,PCA 算法伪代码如下:

  1. #假设数据集为D,PCA后的特征数量为k
  2. def pca(D, k):
  3. after_demean=demean(D)
  4. 计算after_demean的协方差矩阵cov
  5. value, vector = eig(cov)
  6. 根据特征值value将特征向量vector降序排序
  7. 筛选出前k个特征向量组成映射矩阵P
  8. after_demean和P做矩阵乘法得到result
  9. return result

编程要求

在 begin-end 之间填写pca(data, k)函数,实现 PCA 算法,要求返回降维后的数据。其中:

  • data :原始样本数据,类型为 ndarray;
  • k :需要降维至 k 维,类型为 int。

注意:为了顺利评测,计算协方差矩阵时请使用 NumPy 提供的 cov 函数。

测试说明

只需完成 pca 函数即可,程序内部会调用您所完成的 pca 函数来进行验证。以下为其中一个测试用例(其中 data 部分表示原始样本数据,k 表示需要降维至 k 维):

测试输入: {'data':[[1, 2.2, 3.1, 4.3, 0.1, -9.8, 10], [1.8, -2.2, 13.1, 41.3, 10.1, -89.8, 100]],'k':3}

预期输出: [[-6.34212110e+01 6.32827124e-15 1.90819582e-17] [ 6.34212110e+01 -6.32827124e-15 2.02962647e-16]]

代码 文章来源地址https://www.toymoban.com/news/detail-498843.html

import numpy as np
from sklearn.decomposition import PCA
from sklearn import datasets

 #{'data':[[1, 2.2, 3.1, 4.3, 0.1, -9.8, 10], [1.8, -2.2, 13.1, 41.3, 10.1, -89.8, 100]],'k':3} 
def pca(data, k):
    '''u = np.mean(data,axis=0)
    after_demean = data - u
    print(after_demean)
    cov = np.cov(after_demean.T)
    value,vector = np.linalg.eig(np.mat(cov))
    vector_index=np.argsort(-value)
    n = vector_index[-1:-(k+1):-1]#valueint=valueint[:-(k+1):-1]
    p = vector[:, n]# 对应的特征向量
    result = after_demean.dot(p)
    return result'''
    '''
    对data进行PCA,并将结果返回
    :param data:数据集,类型为ndarray
    :param k:想要降成几维,类型为int
    :return: 降维后的数据,类型为ndarray
    '''

    #********* Begin *********#
    u = np.mean(data, axis=0)
    #demean
    after_demean = data - u
    # 计算after_demean的协方差矩阵
    # after_demean的行数为样本个数,列数为特征个数
    # 由于cov函数的输入希望是行代表特征,列代表数据的矩阵,所以要转置
    cov = np.cov(after_demean.T)
    #eig函数为计算特征值与特征向量的函数
    #cov为矩阵,value为特征值,vector为特征向量
    value, vector =  np.linalg.eig(cov)
    #根据特征值value将特征向量vector降序排序
    vector_index = np.argsort(value)#np.argsort()将矩阵按照value排序,并返回排序后的下标
    #筛选出前k个特征向量组成映射矩阵P
    n = vector_index[-1:-(k+1):-1]# 从索引-1开始到索引-(k+1)停止,间隔为-1
    p = vector[:, n]#取前n个值
    #after_demean和P做矩阵乘法得到result
    result = after_demean.dot(p)
    return result

    #********* End *********#

到了这里,关于【Educoder】— 机器学习(PCA第二关)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习——主成成分分析PCA

    如上图所示,一共有4个属性,身高( m为单位),身高(cm),时速(每小时公里),时速(每小时里),身高的两个属性是相关的,时速的两个属性也是相关的,我们把四组具有相关性的变量转换成了两组不相关的变量,我们把转换后的这2组变量称为它的主成分。说白了,就

    2024年01月18日
    浏览(38)
  • 【机器学习】PCA案例的python实现

            虽然可以通过更改优化算法来加快机器学习算法的拟合速度,但加快算法速度的更常用方法是使用主成分分析 (PCA)。如果您的学习算法由于输入维度太高而太慢,那么使用 PCA 加速它可能是一个合理的选择。这可能是PCA最常见的应用。PCA 的另一个常见应用是数

    2024年02月11日
    浏览(29)
  • 封神台靶场第二关

    点击传送门 来到目标公司网站   可以看到有很多的网页 现在我们需要寻找注入点,注入点存在的页面一般可以明显的显示出正确页面和错误页面 这里可以看到有新闻页面 有新闻的一般选择新闻页面 我们点击第一个新闻  进来后可以看到  URL为 http://g8wepfcp.ia.aqlab.cn/shownew

    2024年02月05日
    浏览(25)
  • SqliLabs 第二关 ,数字型注入!!!

    首先打开网页,进行注入点的测试 输入 ?id=1 and 1=1 发现1=2的时候出现了报错,说明服务器接收了我们的指令,并且进行了反馈,说明了有注入点的存在,然后对注入点进行测试 然后输入 order by() 来拆解一下有多少个显示字段,输入4发现没有回显, 输入 order by 3 发现有回

    2024年02月03日
    浏览(38)
  • 【机器学习】主成分分析(PCA)算法及Matlab实现

    【问题引入】 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律。多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上增加了数据采集的工作量,更重要的是在多数情况下,许多变量之间可

    2024年02月04日
    浏览(37)
  • 机器学习实战教程(⑤):使用PCA实战人脸降维

    在互联网大数据场景下,我们经常需要面对高维数据,在对这些数据做分析和可视化的时候,我们通常会面对「高维」这个障碍。在数据挖掘和建模的过程中,高维数据也同样带来大的计算量,占据更多的资源,而且许多变量之间可能存在相关性,从而增加了分析与建模的复

    2024年02月01日
    浏览(34)
  • 算法通关村第二关——单链表加一

    LeetCode369 用一个非空单链表来表示一个非负整数,然后将这个整数加一。你可以假设这个整数除了 0 本身,没有任何前导的 0.这个证书的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。 计算是从低位开始的,而链表是从高位开始的,所以要处理就必须反转过来

    2024年02月14日
    浏览(34)
  • 算法通关村第二关——链表反转

    链表反转,就是链表原来是1-2-3-4-5,经过反转处理过后变成5-4-3-2-1 处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。  这是执行的流程 最核心的两行就是 直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点

    2024年02月13日
    浏览(27)
  • 【机器学习】 奇异值分解 (SVD) 和主成分分析 (PCA)

            在机器学习 (ML) 中,一些最重要的线性代数概念是奇异值分解 (SVD) 和主成分分析 (PCA)。收集到所有原始数据后,我们如何发现结构?例如,通过过去 6 天的利率,我们能否了解其构成以发现趋势?         对于高维原始数据,这变得更加困难。这就像

    2024年02月15日
    浏览(41)
  • 算法通关村第二关——终于学会链表

    LeetCode206 给我们单链表的头结点head,请你反转链表,并返回反转后的链表,如图所示: 本题有两种方法,分别为 建立虚拟头结点辅助反转 以及 直接操作链表实现反转 ,两种方法我将逐一分析讲解。 首先从名字分析一下这种方法,虚拟头结点,顾名思义,我们可以建立一个

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包