【Python机器学习】利用PCA来简化数据——PCA

news2024/12/26 6:21:52

PCA(主成分分析)的优缺点:

优点:降低数据的复杂性,识别最重要的多个特征;

缺点:不一定需要,且可能损失有用信息;

适用数据类型:数值型数据。

移动坐标轴

如下图,如果要求我们画出一条直线,这条线要尽可能覆盖这些点。

在PCA中,我们对数据的坐标进行旋转,该旋转的过程取决于数据的本身。第一条坐标轴旋转到覆盖数据的最大方差位置。数据的最大方差给出了数据的最重要信息。

在选择了覆盖数据最大差异化的坐标轴之后,我们选择第二条坐标轴。假如该坐标轴与第一条坐标轴垂直,它就是覆盖数据次大差异性的坐标轴。这里更严谨的说法是正交。利用PCA,我们将数据坐标轴旋转至数据角度上的那些最重要方向。

我们已经实现了坐标轴的旋转,接下来是降维。坐标轴的旋转并没有减少数据的维度。考虑上图的数据,其中包含3个不同的类别。要区分这3个类别,可以使用决策树。决策树是基于一个特征来做决策的。我们会发现,在x轴上可以找到一些值,这些值能够很好的将这3个类别分开。这样,我们就可能得到一些规则,比如当(x<4)时,数据属于类别0.如果使用SVM这样稍微复杂一些的分类器,我们就会得到更好地分类面和分类规则,比如当(w0*x+w1*y+b)>0时,数据也属于类别0.SVM可能比决策树得到更好的分类间隔,但是分类超平面时就很难解释。

通过PCA进行降维处理,我们就可以同时获得SVM和决策树的优点:一方面,得到了和决策树一样简单的分类器,同时分类间隔和SVM一样好。考虑到上图中的下半部分,其中的数据来自于上半部分并经PCA转换之后绘制而成的。如果仅使用原始数据,那么这里的间隔会比决策树的间隔更大。另外,由于只需要考虑一维信息,因此数据就可以通过比SVM简单得多的、很容易采用的规则进行区分。

还是上图的数据中,我们只需要一维信息即可,因为另一维信息只是对分类缺乏贡献的噪声数据。在二维平面下,这一点看上去微不足道,但是如果在高维空间下则意义重大。

通过数据集的协方差矩阵及其特征值的分析,我们可以求得这些主成分的值。一旦得到了协方差矩阵的特征向量,我们就可以保存最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。我们可以通过将数据乘上这N个特征向量而将它转换到新的空间。

在NumPy中实现PCA

将数据转换成前N个主成分的伪代码大致如下:

去除平均值

计算协方差矩阵

计算协方差矩阵的特征值和特征向量

将特征值从大到小排序

保留最上面的N个特征向量

将数据转换到上述N个特征向量构建的新空间中

实际代码实现:

from numpy import *

def loadDataSet(fileName,delim='\t'):
    fr=open(fileName)
    stringArr=[line.strip().split(delim) for line in fr.readlines()]
    datArr=[list(map(float,line)) for line in stringArr]
    return mat(datArr)

def pca(dataMat,topNfeat=9999999):
    meanVals=mean(dataMat,axis=0)
    #去除平均值
    meanRemoves=dataMat-meanVals
    covMat=cov(meanRemoves,rowvar=0)
    eigVals,eigVects=linalg.eig(mat(covMat))
    eigValInd=argsort(eigVals)
    #从小到大对N个值进行排序
    eigValInd=eigValInd[:-(topNfeat+1):-1]
    redEigVects=eigVects[:,eigValInd]
    #将数据转换到新空间
    lowDDateMat=meanRemoves*redEigVects
    reconMat=(lowDDateMat*redEigVects.T)+meanVals
    return lowDDateMat,reconMat

上述代码包含了通常的NumPy导入和loadDataSet()函数。这里的loadDataSet使用了两个list comprehension来构建矩阵。

pac()函数有两个参数:第一个参数适用于进行PCA操作的数据集,第二个参数topNfeat则是一个可选参数,即应用的N个特征。如果不指定topNfeat的值,那么函数就会返回前9999999个特征,或者原始数据中全部非特征。

pca()函数首先计算并减去原始数据集的平均值。然后,计算协防差矩阵及其特征值,接着利用argsort()函数对特征值进行从小到大的排序。根据特征值排序结果的逆序就可以得到topNfeat个最大的特征向量。这些特征向量将构成后面对数据进行转换的矩阵,该矩阵则利用N个特征将原始数据转换到新空间中。最后,原始数据被重构后返回用于调试,同时降维之后的数据集也被返回了。

我们在testSet.txt文件中加入一个由1000个数据点组成的数据集,在这个数据集上进行PCA操作查看运行效果:

dataMat=loadDataSet('test/testSet.txt')
lowDMat,reconMat=pca(dataMat,1)
print(shape(lowDMat))

可以看到,降维之后的矩阵是一个一维矩阵。

我们将降维后的数据和原始数据一起绘制出来:

import matplotlib.pyplot as plt

fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()

调整参数,观察不同的结果:

dataMat=loadDataSet('test/testSet.txt')
lowDMat,reconMat=pca(dataMat,2)

import matplotlib
import matplotlib.pyplot as plt

fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()

可以看到,设置两个特征值的话,数据就会和原始数据重合。

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

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

相关文章

【研发日记】嵌入式处理器技能解锁(四)——TI C2000 DSP的Memory

文章目录 前言 背景介绍 Memory映射 RAM ROM 外设Register Memory分配 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见《…

在线excel/csv转json数据

具体请访问&#xff1a;在线Csv/Excel(xls/xlsx)转Json格式工具

编程语言进化史

编程语言多到你想象不到。 图片来自: 程序设计语言概念 发展历史 自从1946年冯诺依曼原理被提出&#xff0c;计算机数据和指令是通过二进制形式以及后来的汇编语言(二进制助记符)&#xff0c;但依然没有改变容易出错的本质。1951年Rutishauser提出的用编译程序实现高级语言的思…

开放平台: 签名密钥、回调地址、ip白名单管理。

文章目录 引言I 渠道信息管理(签名密钥)表设计渠道信息管理服务商API配置导出II 签名校验兼容图片上传接口验签规则方案2III 工具类开放平台字典服务接口txt文件的下载see also引言 需求: 提供给下游的开放平台,需要对接口做签名密钥、回调地址、ip白名单管理。 涉及的功…

JS实现一键点击按钮复制文本

JS实现一键点击按钮复制文本 背景描述JS代码实现 背景描述 现在有这样一个需求&#xff0c;想要在页面实现点击按钮&#xff0c;一键复制指定列表字段内容的操作&#xff0c;就像这样的效果 复制成功之后的内容在Notepad 粘贴可以看到 正式列表中链接地址字段的内容&#xf…

【学习笔记】Day 15

一、进度概述 1、《地震勘探原理》第八、九章 二、详情 对于第八章&#xff0c;主要讨论地震资料岩性解释的基本方法&#xff0c;对于利用地震信息进行储层的物性预测于解释、储层的含油性分析与解释、地震地层学解释、层序地层学解释、地球物理资料综合解释等内容。 第五、六…

【图解秒杀系列】秒杀技术点——静态化

【图解秒杀系列】秒杀技术点——静态化 什么是静态化、静态化的作用如何实现静态化FreeMarker、Thymleaf处理流程问题 OpenResty Lualua_shared_dict & lua-resty-template处理流程具体操作 什么是静态化、静态化的作用 静态化就是指通过某种静态化技术&#xff0c;将原本…

【动态规划、dp】P1091 [NOIP2004 提高组] 合唱队形 题解

题意 n n n 位同学站成一排&#xff0c;音乐老师要请其中的 n − k n−k n−k 位同学出列&#xff0c;使得剩下的 k k k 位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设 k k k 位同学从左到右依次编号为 1 , 2 , … , k 1,2, …,k 1,2,…,k&#xff0c;他…

Qt-创建第一个Qt项目(3)

目录 新建项目 设置路径 选择构建工具 父类的选择 各个父类的介绍 国际化相关的选项 选择SDK Summary选择 项目初见 新建项目 这一点和在VS里面是一样的&#xff0c;我们首先都得创建一个项目出来 进去之后就是选择项目模板了 我们使用默认的就行了&#xff0c;左边…

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…

涉密载体管控系统DW-S402|实现载体管控新模式

涉密载体管控系统DW-S402是用于对各种涉密载体进行有效管理的智能柜&#xff08;智能管理系统&#xff09;&#xff0c;基于物联网技术实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 载体管控软件对涉密…

可用性检查和短缺部件检查

可用性检查 可用性检查有两种类型&#xff1a; “库存管理”中库存类型的可用性检查&#xff08;静态可用性检查&#xff09;从“物料需求计划”的角度检查可用库存&#xff08;动态可用性检查&#xff09; 库存类型的可用性检查&#xff08;静态可用性检查&#xff09; 此项…

全面解析ETL:数据仓库架构中的关键处理过程

目录 一、数据仓库架构中的ETL 二、数据抽取 &#xff08;1&#xff09;逻辑抽取 &#xff08;2&#xff09;物理抽取 &#xff08;3&#xff09;变化数据捕获 三、数据转换 四、数据装载 &#xff08;1&#xff09;提高装载效率 &#xff08;2&#xff09;处理装载失败 五、ET…

MacOS 下运行 GPT-SoVITS

系统环境&#xff1a; # 安装 ffmpeg brew install ffmpeg # 查看版本 ffmpeg -version # 拉取项目代码 git clone --depth1 https://github.com/RVC-Boss/GPT-SoVITS cd GPT-SoVITS # 安装好 Miniconda 之后&#xff0c;先创建一个虚拟环境&#xff1a; conda create -n GPT…

关于Qt的系统总结

查看详情http://100bcw.com/qt6.htm 编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具。前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写,不能自动生成,另外可能有中文编码的问题。后一…

PSINS工具箱函数介绍——trjfile

文章目录 关于工具箱使用方法运行代码运行方法运行结果输出数据的解释 源代码 关于工具箱 trjfile是导入轨迹数据的函数&#xff0c;在文件夹"psins \base\io"里面&#xff0c;用于导入轨迹相关的mat文件。 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲…

Centos7.9 Kickstart自动应答,无人值守安装

有时候安装一两台服务器是轻松的事&#xff0c;但是如果要安装2&#xff0c;3百台的时候那就不是很轻松了&#xff0c;这时候无人值守的操作系统安装就变得非常重要。通过网络自动安装是非常方便而且快捷的。 先关闭防火墙吧 systemctl stop firewalld systemctl disable fire…

安卓蓝牙日志的获取方法

有过蓝牙调试经历的同学们可能都知道&#xff0c;在安卓系统中&#xff0c;在手机的设置–>开发人员页面下有一个开启蓝牙HCI信息收集日志选项开关&#xff0c;如下图中标红处&#xff0c; 打开该开关&#xff0c;就可以收集本机发送和接收的蓝牙HCI包。蓝牙包的数据会保存在…

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是&#xff0c;数组是升序排列的 算法描述&#xff1a; i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时&#xff0c;设置查找范围在m右边&#xff1a;i m-1 当目标值targat比m小时&#xff0c;设置查找范围在m左边&#xff1a;j m1 当targat的…

苹果手机垃圾清理:释放存储空间的终极指南

随着iPhone成为我们日常生活的重要组成部分&#xff0c;我们越来越多地依赖它来处理个人和工作相关的事务。然而&#xff0c;长时间的使用会让iPhone积累大量不必要的数据和文件&#xff0c;这些所谓的“手机垃圾”不仅占用了宝贵的存储空间&#xff0c;还可能影响设备的性能。…