机器学习:使用PCA简化数据

news2025/1/24 14:49:30

文章目录

    • 使用场景
    • 主成分分析(Principal component analysis)
    • 实验:对半导体数据(590个特征)进行降维处理

使用场景

我们通过电视看实况足球,电视显示屏有100万个像素点,球所占的点数为100个。人眼会把显示器上的百万像素转为三维图像,在图中可以捕捉球的运动轨迹,此时就已经实现通过“降维”获取关键数据的目的。

主成分分析(Principal component analysis)

  • 作用和原理:找出主要特征进行分析,主成分是原始数据的线性组合,通过最大化数据方差来确定,比如第一个主成分解释了数据中最大的方差,第二个主成分解释了剩余数据中最大的方差,以此类推。
  • 方差:用来表述数据的离散程度,一个变量的方差可以视为它每个元素与元素均值的差的平方和的均值,为便于处理,可以想办法把均值化成0(u=0),即:
    V a r ( a ) = 1 m ∑ i = 1 m ( a i − μ ) 2 Var(a) = \frac{1}{m}\sum_{i=1}^{m}(a_i-μ)^2 Var(a)=m1i=1m(aiμ)2
  • 举例:假设我有一个包含房屋面积,房价和使用年限的数据集,现在我想要了解这些特征之间的关系,并找到一种简洁的表示方式。首先,用PCA进行降维,假设得到了两个主成分,第一个是房屋面积,它能反映房屋的整体大小以及宜居人数,第二个是房价,他能影响消费者的购买方式(全额/按揭)。然后,把原始数据集投影到这俩成分里,得到一个新的低维表示(尽可能在不影响结果的前提下实现3维降到2维)。最后,用得到的两个主成分重新分析数据,绘制主成分直接的关系图以了解房屋面积,房价对使用年限的影响;还可以用这些特征做聚类分析,找到具有相似特征的房屋群组。
  • 优点:通过给数据降维,去除冗余信息,减少计算量;
  • 缺点:PCA假定数据之间存在线性q关系,如果数据是非线性的(比如图像曲线是个正弦函数),效果可能就不怎么样。并且,PCA对数据的“单位”比较敏感,如果数据的衡量尺度不一,容易导致结果出现偏差。比如有一个身高-体重数据集,前者单位可以是cm,后者可以是kg,如果不对数据做归一化,PCA就可能给身高更大的权重(假设身高175cm,体重70kg)。

实验:对半导体数据(590个特征)进行降维处理

代码网址:https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/13.PCA/pca.py
处理的数据类型如下所示
在这里插入图片描述
其中有一部分代码需要修改,replaceNanWithMean函数是为了把数据里的NaN(Not a Number)以各个特征的平均值来替换,原代码如下:

def replaceNanWithMean(): 
    datMat = loadDataSet('secom.data', ' ')
    numFeat = shape(datMat)[1]
    for i in range(numFeat):
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean
    return datMat

报错结果:
在这里插入图片描述

修改后的代码如下:

def replaceNanWithMean():
    datMat = genfromtxt('secom.data', delimiter=' ', dtype=float)
    numFeat = datMat.shape[1]
    for i in range(numFeat):
        nonNanIndices = where(~isnan(datMat[:, i]))[0]
        nanIndices = where(isnan(datMat[:, i]))[0]
        meanVal = mean(datMat[nonNanIndices, i])
        datMat[nanIndices, i] = meanVal
    return datMat

代码解析:在原来的代码里,作者用自己定义的 l o a d D a t a s S e t loadDatasSet loadDatasSet函数读取数据,将所有的数据都解析为浮点数,但数据里的NaN并不是数值,我觉得可能是数据类型不同导致的错误。修改后的代码用到 g e n f r o m t x t genfromtxt genfromtxt函数,从文本文件中加载数据,创建一个numpy数组,读取数据集的列数并遍历每一列,用 w h e r e where where i s n a n isnan isnan函数找出Nan和非NaN的索引,分别记录。计算出所有非NaN的均值,再把NaN替换为均值,这样就不会出现报错。
实验解析:尝试输出矩阵的特征值,发现有一部分值是0,如下图所示。用线代的角度来看,应该可以理解为这个矩阵向量可以由其他特征向量线性组合得到,所以590个特征中,大部分的特征意义不大,可以被压缩掉。
在这里插入图片描述
实验结果如下:
在这里插入图片描述
算法每次挑选方差最大的特征加入主成分列表,累计方差逐渐增加。在作者的代码里,设定20个主成分就可以描述器件特性。但看实验结果不难发现,当主成分数量增大到13个的时候,累计方差的增大速率就出现了明显的下降趋势,所以这个数值也是可以再做修改的。

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

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

相关文章

Collectors类作用:

一、Collectors类: 1.1、Collectors介绍 Collectors类,是JDK1.8开始提供的一个的工具类,它专门用于对Stream操作流中的元素各种处理操作,Collectors类中提供了一些常用的方法,例如:toList()、toSet()、to…

真的有线上兼职吗?推荐几个靠谱的线上兼职!

在这个互联网普及,信息爆炸的时代,线上赚钱已经成为一个热门的话题。每个人都想通过互联网赚钱,有些人得到钱,给普通人机会,给骗子一些机会,世界是两面,线上兼职赚钱的方式!有好有坏…

python中的继承

要理解继承首先要有父类和子类的概念,可以理解成子类从父类中继承父类的属性和方法 创建父类 class Pet:def __init__(self,name,age):self.name nameself.age agedef jump(self):print(self.name"在跳")创建子类 class Cat(Pet):pass mycatCat(&quo…

HTML的有序列表、无序列表、自定义列表

目录 背景: 过程: 无序列表: 简介: 代码展示: 效果展示:​ 无序列表: 简介: 效果展示:​ 自定义列表: 简介: 效果展示: 总结: 背景: 1.有序列表(Ordered List): 有序列表是最早的列表类型之一&#xff…

编译器02-词法分析

一:简述 词法分析含义:为了翻译语言,编译器把程序各种成分拆开,那如何拆,首先第一步就是将输入分解成一个个独立的单词(token),这一过程叫词法分析。 二:单词(token)分为哪些种类 保留字…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器…

MAC M1芯片安装mounty读写移动硬盘中的文件

因为移动硬盘中的文件是微软公司NTFS格式,MAC只支持自己的APFS或者HFS,与微软的NTFS不兼容,所以需要第三方的软件来支持读写硬盘中的文件,经过一上午的折腾,最终选择安装mounty这个免费的第三方软件 工具网址连接&am…

C++11 类型转换

#include<iostream> #include<string> using namespace std;//类型转换 void Insert(size_t pos, char ch) {size_t _size 5;//....int end _size - 1;while (end > pos) // end隐式类型转换{//_str[end 1] _str[end];--end;} } void Test1() {int i 1;// …

C++:内存管理

目录 学习目标 1. C/C内存分布 2. C/C动态内存管理 2.1 C动态内存管理 2.2 C动态内存管理&#xff1a; 3. operator new与operator delete函数 4. new和delete的实现原理 5. 定位new表达式 学习目标 1. C/C内存分布 2. C/C动态内存管理&#xff08;malloc,free 与new ,…

【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…

SQL Server2022版本 + SSMS安装教程(手把手安装教程)

SqlServer安装步骤如下&#xff1a; 下载请点点我 1.选择Developer版 2.点击浏览器下载标志&#xff0c;找到SqlServer在文件夹的位置。 3.进入下面的界面&#xff1a;选择自定义版本 4.将下载的C盘的盘符改为D盘 5.点击安装–进入下一步&#xff0c;显示如下界面。 过…

构建知识库的核心要义,试试我的工具和方法吧!

对于企业来说&#xff0c;如果所有人员的知识和经验&#xff0c;都集中沉淀到统一的文档系统中&#xff0c;那么&#xff0c;久而久之&#xff0c;会形成一个丰富的知识和经验库。 在构建知识库之前&#xff0c;我们要先确定知识库范围包含&#xff1a;素材整理、问题提炼、知识…

【Selenium】webdriver.ChromeOptions()官方文档参数

Google官方Chrome文档&#xff0c;在此记录一下 Chrome Flags for Tooling Many tools maintain a list of runtime flags for Chrome to configure the environment. This file is an attempt to document all chrome flags that are relevant to tools, automation, benchm…

7、Spring之依赖注入源码解析(下)

resolveDependency()实现 该方法表示,传入一个依赖描述(DependencyDescriptor),该方法会根据该依赖描述从BeanFactory中找出对应的唯一的一个Bean对象。 @Nullable Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Null…

拦截器学习

什么是拦截器 Spring MVC 中的拦截器( Interceptor )类似于ServLet中的过滤器( Filter )&#xff0c;它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 工作原理 一个拦截器&#xff0c;只有 preHandle …

mac电脑安装paste教程以及重新安装软件后不能使用解决方法

问题背景 mac电脑安装paste教程以及重新安装软件后不能使用解决方法。 mac电脑安装paste失败&#xff0c;安装好后还是无法使用&#xff0c;paste显示还是历史粘贴信息&#xff0c;导致无法使用。新 copy的内容也无法进入历史粘贴版里面。 笔者电脑配置信息&#xff1a;MacB…

7.13 在SpringBoot中 正确使用Validation实现参数效验

文章目录 前言引入Maven依赖一、POST/PUT RequestBody参数校验1.1 Valid或Validated注解配合constraints注解1.2 测试运行 二、GET/DELETE RequestParam参数校验2.1 Validated注解配合constraints注解2.2 测试运行 三、GET 无注解参数校验3.1 Valid或Validated注解配合constrai…

【OpenCV • c++】直方图计算 | 绘制 H-S 直方图 | 绘制一维直方图 | 绘制 RGB 三色直方图

文章目录 一、什么是直方图二、直方图的相关函数1、计算直方图 calcHist()2、找寻最值 minMaxLoc() 三、程序演示1、色调 —— 饱和度直方图2、一维直方图3、RGB 三色直方图 一、什么是直方图 直方图广泛应用于很多计算机视觉处理当中。通过标记帧与帧之间显著的边缘和颜色的变…

【数据结构】 二叉搜索树的实现

文章目录 &#x1f340;二叉搜索树的概念&#x1f6ec;二叉搜索树功能实现&#x1f6a9;查找关键字key&#x1f4cc;代码实现&#xff1a; &#x1f6a9;插入关键字key&#x1f4cc;代码实现&#xff1a; &#x1f6a9;删除关键字key&#x1f4cc;代码实现&#xff1a; &#x…

OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集&#xff0c;数据类型为vector<Point>或者M…