当前位置: 首页 > 编程日记 > 正文

第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)

前言

这部分也许是数据预处理最为关键的一个阶段。

如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析。

本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给出具体的实现步骤。

主成分分析法 - PCA

       主成分分析(principal components analysis, PCA)是一种分析、简化数据集的技术。

       它把原始数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是在处理观测数目小于变量数目时无法发挥作用,例如基因数据。

PCA基本步骤

       第一步:载入所需包和测试集数据:

       

       测试数据集内容大致如下:

       

       第二步:确定主成分的个数:

       

       在该函数中,fa是指定分析类型为主成分,n.iter是指平行分析中模拟测试的迭代次数为100次。结果如下:

       

       其中,蓝线为测试数据集中不同主成分对应的特征值折线图;红线为平行分析中模拟测试矩阵的不同主成分对应的特征值折线图。

       可采用以下几个思路来确定主成分的具体个数:

       1. 保留特征值大于1的主成分个数
       2. 根据图形弯曲的情况,选取图形变化最大处之上的特征值对应的主成分
       3. 特征值大于模拟矩阵的平均特征值的主成分保留

       根据这几个经验法则,可确定主成分的个数为1。

       当然,有一个更简单的确定方法 -- 在你调用fa.parallel函数之后,系统shell端会告诉你建议的主成分个数:

       

       第三步:提取主成分

       

       其中,nfactors是指定提取的主成分的个数。

       执行完毕后shell端打印如下信息:

       

       这些信息中,最重要的是载荷矩阵,也就是上方列为h2,u2的那个矩阵。

       我们只看PC1那一列(h2 u2先不去管它),当然如果你指定的主成分个数是2,那么就会有PC2,以此类推。而行代表的则是每个特征。矩阵的值,也即载荷矩阵的值是数据集协方差矩阵对应的特征向量,也即这个主成分在该特征中所占的比重。如果你了解后面要讲的因子分析,那么也许会对这个表述产生疑惑 - 这不和因子一模一样吗?

       --- 答曰确实是的。主成分法本来就是选择因子的一种方法。事实上很多时候你也可以从载荷矩阵里观察得出主成分的现实意义。如果对主成分分析的结果不满意,可以尝试进行各种旋转以调整各个主成分所占的比重,具体请查阅principal函数的rotate参数。

       第四步:获取主成分得分

       

       得到结果如下:

       

       接下来就可以使用该主成分数据集了。

探索性因子分析法 - EFA

EFA的目标是通过发掘隐藏在数据下的一组较少的,更为基本的无法观测的变量,来解释一组可观测变量的相关性。这些虚拟的,无法观测的变量称作因子。(每个因子被认为可解释多个观测变量间共有的方差,也叫作公共因子)

模型的形式为:

Xi=a1F1+a2F2+……apFp+Ui

- Xi是第i个可观测变量(i=1,2,……k);
       - Fj是公共因子(j=1,2,……p),并且p<k。

EFA基本步骤

第一步:载入所需包和测试集数据:

       第二步:确定因子个数

       

       这次分析的输入是数据集的相关矩阵(当然你也可以像PCA中讲的那样使用原始数据集);n.obs是观测的样本数,这个参数只有在输入为协方差矩阵的时候需要;n.iter是指平行分析中模拟测试的迭代次数为100次,结果如下:

       

       该图的具体含义参考PCA部分讲解,根据同样方法选择因子个数为2。

       第三步:提取因子

       

       函数中,nfactors为因子个数;fm为提取因子的各种方法,有最大似然法(ml),主轴迭代法(pa),加权最小二乘法(wls),广义加权最小二乘法(gls)和最小残差法(minres)等等,本文不细细分析此部分,请自行参阅相关文档。

       执行完毕后shell端打印如下信息:

       

       这些信息中,最重要的是载荷矩阵,也就是上方列有h2,u2等的那个矩阵。

       我们只看PA1和PA2这两列(h2 u2先不去管它),当然如果你指定的因子个数是3,那么就会有PA3,以此类推。而行代表的则是每个特征。矩阵的值,也即载荷矩阵的值是这个因子在该特征中所占的比重。

       如果对因子分析的结果不满意,可以尝试进行各种旋转以调整各因子所占的比重,具体请查阅fa函数的rotate参数。

       第四步:分析特征间的潜在关系:

       

       该函数会图形化的显示载荷矩阵:

       

       图中的散点表示各个特征,而横纵轴则表示各个特征中的两个因子的占比重。

       还可以用下面这个函数,更为直观形象:

       

       结果显示如下:

       

       图中展示了各个因子在各个特征中的占比。此图可以很好地分析出因子的具体意义。

       第五步:提取各个样本的因子得分

       

       注意传递的数据必须是原数据集,如果传递进的是其协方差矩阵,那么这个得分值就没什么意义。

小结

       R语言的确方便的给出了很多算法的实现。然而,如果想要详细具体的知道如何调整参数,就必须要多去理解算法的思想,机制。

       这种能力是需要通过不断地学习算法,慢慢积累的。

相关文章:

Matlab编程与数据类型 -- 函数M文件的调用

本图文介绍了Matlab中函数M文件的调用方式。

直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突

直接依赖 在本工程pom文件中配置的依赖&#xff0c;称为本工程的直接依赖。间接依赖 本工程pom配置了依赖A&#xff0c;A又依赖B&#xff0c;则本工程也依赖B&#xff0c;B为本工程的间接依赖。可选依赖 在依赖中配置<optional> true/false 是否向下传递&#xff0c;如果…

Windows 编程[9] - WM_CLOSE 消息

本例效果图:program Project1;usesWindows, Messages;{供 WM_CLOSE 消息调用的自定义过程} procedure OnClose(h: HWND); beginif IDOK MessageBox(h, 确认关闭吗?, 提示, MB_OKCANCEL) thenDestroyWindow(h); end;function WndProc(wnd: HWND; msg: UINT; wParam: Integer; …

Python自动化测试白羊座-week3切片+元组

name zcl,py,zyznames [zcl,py,zyz]print(names[0])print(names[0:2]) #切片就是从里面取几个元素, 从第几个取到第几个结束.取值时顾头不顾尾.print(names[1])#切片操作对字符串也适用name1[zcl,py,zyz]print(name1[2])num list(range(10)) #用range生成列表&#xff0c;需…

Matlab编程与数据类型 -- 函数M文件的组成

本图文介绍了Matlab中函数M文件的组成。

intellij idea 必知的debug功能

1.设置断点 选定要设置断点的代码行&#xff0c;在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子&#xff0c;开始进入调试。 IDE下方出现Debug视图&#xff0c;红色的箭头指向的是现在调试程序停留的代码行&#xff0c;方法f2()中&#xff0c;程…

Lession 15 Good news

1 语法:直接引语;间接引语; 直接引语:用引号"" 直接把要说的话引起来; l am busy, he said. 间接引语:转述说话人的话; He said that he is busy. 间接引语:1>陈述句,say,tell,来转述,人称,时态,指示代词,时间状语,地点状语…

使用HTML5监測站点性能

在这个信息爆炸的互联网时代&#xff0c;越来越多的人缺少了等待的耐心。站点性能对于一个站点来说越来越重要。下面为监控到的站点打开时间对跳出率的影响&#xff1a; 当站点打开时间在0-1秒时&#xff0c;跳出率为12% 当站点打开时间在1-2秒时&#xff0c;跳出率为26% 当站点…

Matlab编程与数据类型 -- 单元数组

Matlab编程与数据类型 – 单元数组

反向代理服务器的工作原理

最近接触了nginx&#xff0c;nginx可以作为一个反向代理服务器完成负载均衡&#xff0c;下面记录一下从网上学习到的一些知识。 一 概述 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受Internet上的连接请求&#xff0c;然后将请求转发给…

VS2005 制作安装程序的一些网络教程

原文写于&#xff1a;2006-12-14 在VS2005中&#xff0c;制作安装程序需要建立setup project&#xff0c;后面的操作就比较简单了。我在网上看了一些文章&#xff0c;把它们列在下面&#xff1a; 文章 内容 备注 Customizing Setup Project in Visual Studio.NET 2005 …

还有这种操作?

【GDB调试】 用bat避免路径问题 :a g cyc.cpp -g -Wall -o cyc -m32 gdb32 cyc.exe pause goto a debuger.bat开O2在调试中容易出现奇怪错误&#xff0c;尽量不要开&#xff01; 常用命令&#xff1a; ---------- help info 输出所有cmd指令 r 运行 ---------- b 100 在100行前…

什么是人工神经网络?

本图文详细介绍了人工神经网络的生物学基础&#xff0c;并在此基础上推导出人工神经网络的数学模型。

上传大文件,出现: 413 request Entity too Large错误的解决办法

工作中遇见了一个问题&#xff0c;就是上传一个100M的文件&#xff0c;会报413 request Entity too Large错误&#xff0c;下面给出解决方式。 经过排查&#xff0c;发现服务器使用nginx作为反向代理服务器&#xff0c;报上名错误&#xff0c;是因为请求长度超过了nginx默认的…

Java中的策略模式实例教程

策略模式是一种行为模式。用于某一个具体的项目有多个可供选择的算法策略&#xff0c;客户端在其运行时根据不同需求决定使用某一具体算法策略。 策略模式也被称作政策模式。实现过程为&#xff0c;首先定义不同的算法策略&#xff0c;然后客户端把算法策略作为它的一个参数。使…

struts 2 结合json

struts 2 结合json 在struts 2中&#xff0c;要结合json的话&#xff0c;其实是不错的选择&#xff0c;最近做一个登陆系统时&#xff0c;可以考虑选择用struts 2结合json,下面是要点register页面<s:form action"Regist.action"> <s:textfield id"u…

什么是遗传算法?

本文从遗传算法的生物学基础讲起&#xff0c;详细介绍了遗传算法的原理、步骤和简单应用。

使用FileItem获取文件名时注意事项

获取文件名的时候&#xff0c;要注意对不同浏览器的处理&#xff0c;下面给出方法参考 FileItem类的常用方法&#xff1a; 1. boolean isFormField() isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段&#xff0c;还是一个文件表单字段&#xff0c;如果…

Winson.SqlPager 2.5 发布!

Winson.SqlPager 分页控件 版本: 2.5 此控件必须与Winson.Framework框架一起使用安装方法:只需将解压出来的 SqlPage.cs文件复盖了Winson.WControls\SqlPager\ 目录里的同名文件即可.由于之前的控件存在着一些比较严重的BUG,这次对SqlPager做了比较大的改动,修复了一些BUG和改进…

laravel中查看执行的SQL语句

今天想查看laravel框架中执行的SQL语句,百度了一圈,才找到,这文档真心看着不爽,下面上查看方法 DB::connection()->enableQueryLog();$navObj new NavModel();$data $navObj->where($where)->select($this->field)->orderBy(id, desc)->get();$log DB::ge…

Matlab与线性代数 -- 向量的范数

Matlab与线性代数 – 向量的范数

Mac下sublime text2 解决中文乱码

1.control ~ 调出console 2.粘贴以下代码并回车 import urllib2,os;pfPackage Control.sublime-package;ippsublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),wb).write(urllib2.urlopen(http://sublim…

封装DateTimePicker并使用绑定时遇到的问题

请教各位高手: 我想把一个控件封装起来.DateTimePicker 因为他的value的类型为DateTime所以不可以为Null 但是数据库里有一些日期是为空的.如离职日期 现在我写了一个类继承至DateTimePicker 使用public object Value覆盖了基类的Value方法 这样它就可以为NULL了. 在使用…

php入门01

关于变量 注意点&#xff1a; 在php中&#xff0c;变量是通过$符号定义的在php中&#xff0c;变量名是区分大小写的数据类型 布尔类型 布尔类型有两个值&#xff0c;true和false,它不区分大小写当我们用”echo”指令输出布尔类型时&#xff0c;如果是“true”则输出的是“1”&a…

遗传算法主程序

遗传算法主程序 本图文已经更新&#xff0c;详细地址如下&#xff1a; http://blog.csdn.net/lsgo_myp/article/details/54584840

jquery日历插件FullCalendar使用技巧

原文链接&#xff1a;http://blog.csdn.net/u013493957/article/details/44920341FullCalendar是一款基于jquery的日历控件,它有着很强大的功能&#xff0c;下面我来给大家介绍一下FullCalendar使用技巧吧&#xff0c;希望此方法对各位有帮助呀。简介 官方网站&#xff1a;http…

列表CheckBox全选 结合DataGrid 进行删除操作

//CheckBox全选function CA(){ var frmdocument.Form1; alert(frm) for (var i0;i<frm.elements.length;i) { var efrm.elements[i]; alert(e.type) alert(e.name) if ((e.name ! allbox) && (e.typecheckbox)) { …

遗传算法主程序(辅助)

遗传算法主程序&#xff08;辅助&#xff09; 本图文已经更新&#xff0c;详细地址如下&#xff1a; http://blog.csdn.net/lsgo_myp/article/details/54584840

互联网产品mysql数据库设计总结

mysql数据库性能不比oracle数据库&#xff0c;所以设计上&#xff0c;和oracle有一些不同。下面总结一些互联网产品的数据库设计。 1.主键 主键可以使用bigint(20) unsigned也可以使用varchar&#xff0c;使用bigint&#xff0c;可以设置为自增主键auto_increment。使用varch…

【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

对于AI&#xff0c;我的初始想法非常easy&#xff0c;首先他要能动&#xff0c;而且是在地图里面动。 懂得撞墙后转弯&#xff0c;然后懂得射击&#xff0c;其它的没有了&#xff0c;基于这个想法&#xff0c;我首先创建了一个MyTank类&#xff0c;用于管理玩家的坦克的活动&am…