主成分分析以及应用:企业综合实力排序

这段时间一直在学习数据挖掘的一些算法,今天通过不断查阅资料,学习整理了一下主成分分析这个数据降维算法。并且结合一个实例进行matlab编程实现。

  1. 主成分基本原理

    在数据挖掘中,经常会遇到一个问题就是一个问题出现了n多个变量,而且变量之间还可能会存在各种复杂的相互联系,变量之间并不是独立的。那么主成分分析就是将多个变量综合为少数几个代表性的变量,而且这些主要的变量仅能够代表原始变量的绝大多数信息又互不相关的一种数据降维算法。

    主成分分析采取一种数据降维思想,其所要做的就是设法就原来众多的具有一定相关性的变量,重新组合为一种新的相互无关的综合变量来代表原来的众多个变量。它借助于一个正交变换,将其分量相关的原随机向量转化成其分量不相关的新随机向量,这在代数上表现为将原随机向量的协方差阵变换成对角形阵,在几何上表现为将原坐标系变换成新的正交坐标系,使之指向样本点散布最开的p 个正交方向,然后对多维变量系统进行降维处理,使之能以一个较高的精度转换成低维变量系统,再通过构造适当的价值函数,进一步把低维系统转化成一维系统。

    主成分分析的原理是设法将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的总和变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上处理降维的一种方法。主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Var(F1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现再F2中,用数学语言表达就是要求:
    CovF1,F2=0
    则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。

  2. PCA方法计算步骤
    (1)首先对于原始数据进行标准化处理。
    X=

    x11x21xn1x12x22xn2x1px2pxnp

    那么就可以将X按照列进行Zscore标准化.其转化函数为:
    x=xμσ
    其中μ为按照列计算得到的样本数据均值,σ 位按照列计算得到的样本数据的标准差。
    (2)计算经过标准化处理后得到的数据的相关性矩阵。
    R=
    r11r21rn1r12r22rn2r1pr2prnp

    其中:rij=Cov(xi,xj)var(xi)var(xj)=k=nk=1(xkix¯i)(xkjx¯j)k=nk=1(xkix¯i)k=nk=1(xkjx¯j)n>1.
    (3)计算相关系数矩阵R特征值(λ1,λ2,,λp 和相应的特性向量ai=(ai1,ai2,,ai3)
    (4)对特征值进行降序排列。
    (5)计算降序排列后的特征值的贡献率以及累计贡献率
    contributionRate=λipi=1λi
    accumulativeContributionRate=ki=1λipi=1λi,kp.
    (6)计算主成分得分矩阵
    根据标准化的原始数据,按照各个样品,分别带入主成分表达式,就可以得到各个主成分下的各个样品的新数据,即主成分的得分。具体形式为:
    F11F21Fn1F12F22Fn2F1kF1kFnk

    其中,Fij=aj1xi1+aj2xi2++ajpxip,i=1,2,,n,j=1,2,,k

  3. Matlab程序实现

clc
clear 
close all
%%
%数据导入
coporationEvaluation=xlsread('Coporation_evaluation.xlsx','B2:I16');
%%
%数据预处理
%利用size函数得到数据集中的公司数量以及变量数量
[corporationNumber,variableNumber]=size(coporationEvaluation);
%预先定义标准化后的数据矩阵
normalizedcorporationEvaluation=zeros(corporationNumber,variableNumber);
%利用Z-score方法进行数据标准化
for i=1:variableNumbernormalizedcorporationEvaluation(:,i)=(coporationEvaluation(:,i)-...mean(coporationEvaluation(:,i)))./std(coporationEvaluation(:,i));
end
%%
%数据相关系数矩阵求解以及相关系数矩阵的对应的特征值以及特征向量求解。
%计算标准化后的数据集的相关系数矩阵relativeCoefficientMatrix=corrcoef(normalizedcorporationEvaluation);%计算相关系数矩阵的特征向量以及特征值矩阵,
[eigenVector,eigenValueDig]=eig(relativeCoefficientMatrix);
%因为使用eig函数计算得到的特征值为一个variable*variable的对角阵,
%因此需要处理一下将特征值矩阵存放在一个行向量里面
eigenValue=zeros(variableNumber,1);
for j=1:variableNumbereigenValue(j,1)=eigenValueDig(j,j);
end
%将特征值进行降序排列
eigenValue=sort(eigenValue,'descend');
%%
%计算排序后的主成分的贡献率以及累计贡献率
for k=1:variableNumbercontributionRateOfEachEigenValue=eigenValue(k,1)/sum(eigenValue);accumulativeContributionRate(k,1)=sum(eigenValue(1:k,1))/sum(eigenValue);
end
%设置主成分信息保留率
pcaInformationRetensionRatio=0.9;
%统计在满足主成分保留率的主成分的数量。
for l=1:variableNumberif accumulativeContributionRate(l,1)>pcaInformationRetensionRatio;mainComponentNumber=l;break;end
end
%截取主成分对应的特征向量
for ii=1:mainComponentNumbermainComponentBasedVector(:,ii)=eigenVector(:,variableNumber+1-ii);
end
%%
%计算打分矩阵
scoreMatrix=normalizedcorporationEvaluation*mainComponentBasedVector;
%计算最终的公司的总打分,finalScoreMatrix的第一列为打分值,第二列为公司序号。
for jj=1:corporationNumberfinalScoreMatrix(jj,1)=sum(scoreMatrix(jj,:));finalScoreMatrix(jj,2)=jj;
end
%对打分矩阵按照分数那一列进行降序排列
finalScoreMatrix=sortrows(finalScoreMatrix,-1);
disp('the tope 5 corperations is: ')
%输出排名前5的公司序号
for kk=1:5finalScoreMatrix(kk,2)
end

4 . 结果

1)特征值贡献率以及累计贡献率:

特征值贡献率累计贡献率
5.72610.71700.7170
1.09720.13720.8547
0.58960.07370.9279
0.28580.03570.9636
0.14560.01820.9818
0.13690.01710.9989
0.00600.000750.9997
0.00270.0020341.0000

2)公司打分以及排名

特征值贡献率
4.2359
3.9711
2.3678
1.9706
1.7985
1.10313
0.75215
0.16814
-0.2922
-1.00710
-1.5237
-2.0544
-2.51311
-3.6433
-5.33212

可依据打分结果得出,综合实力最强的是序号为9的那家公司。

5 . Matlab自带主成分分析函数pca对比验证
为了表明计算的准确性,我再采用了matlab自带的主成分函数pca进行了一个对比验证。

[COEFF,SCORE,latent]=pca(zscore(coporationEvaluation))

返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量。
我们主要看latent矩阵得到结果

特征值
5.7261
1.0972
0.5896
0.2858
0.1456
0.1369
0.0060
0.0027

发现计算结果是一样的。

6 . 主成分分析法优缺点
优点:

  ①可消除评估指标之间的相关影响。因为主成分分析法在对原始数据指标变量进行变换后形成了彼此相互独立的主成分,而且实践证明指标间相关程度越高,主成分分析效果越好。

  ②可减少指标选择的工作量,对于其他评估方法,由于难以消除评估指标间的相关影响,所以选择指标时要花费不少精力,而主成分分析法由于可以消除这种相关影响,所以在指标选择上相对容易些。

  ③主成分分析中各主成分是按方差大小依次排列顺序的,在分析问题时,可以舍弃一部分主成分,只取前面方差较大的几个主成分来代表原变量,从而减少了计算工作量。用主成分分析法作综合评估时,由于选择的原则是累计贡献率≥85%,不至于因为节省了工作量却把关键指标漏掉而影响评估结果。

  缺点:

  ①在主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平(即变量降维后的信息量须保持在一个较高水平上),其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释(否则主成分将空有信息量而无实际含义)。

  ②主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。因此,提取的主成分个数m通常应明显小于原始变量个数p(除非p本身较小),否则维数降低的“利”可能抵不过主成分含义不如原始变量清楚的“弊”。

  ③当主成分的因子负荷的符号有正有负时,综合评价函数意义就不明确。

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

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

相关文章

自定义MongoDB的Spring Social Connect框架

在上一篇文章中 ,我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里,我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现,以将用户连接数据持久保存到关系数据库中。 但是&#xff…

算法题:输入aaaabbbcccccc输出a4b3c6。

今日在地铁上浏览今日头条的时候看到这么个小题目,说是输出一长串字符串,输出字母串类别并且统计其出现次数,然后按照顺序将其输出来。例如输入aaaabbbcccccc,输出a4b3c6。 最近也一直在学习,所以就想着就Matlab来试了…

Java World中的GraphQL简介

许多人认为GraphQL仅适用于前端和JavaScript,它在Java等后端技术中没有定位,但事实确实如此。 还经常将GraphQL与REST进行比较,但是这种比较是否合理? 首先,让我开始回答其中最重要的问题。 什么是GraphQL&#xff1…

算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。

今天的算法学习还是和字符串有关,这个题目据说是以前的某公司面试的笔试题目。题目意思就是说,在一个字符串中找到只出现了一次的那些字符,并且输出来。 作为非IT的我,平时使用Matlab比较多。不是科班出身,对于这个题…

Kafka的Spring Cloud Stream

总览 该示例项目演示了如何使用事件驱动的体系结构 , Spring Boot ,Spring Cloud Stream, Apache Kafka和Lombok构建实时流应用程序。 在本教程结束时,您将运行一个简单的基于Spring Boot的Greetings微服务 从REST API获取消息 …

使用JShell的Java 9 Streams API

这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– takeWhile,dropWhile和iterate。 这篇文章延续了My Top Java 9功能,并使用Jshell探索了这些方法。 流API Str…

常见的股票技术因子学习以及计算

最近在看《量化投资数据挖掘技术与实践(MATLAB版)》。学习了其中的常见的股票衍生变量,并且利用WIND金融数据终端的matlab借口windmatlab导出一些数据进行了一个简单的学习。特此记录。 下面是我对于书中提到的几个因子的学习总结&#xff1…

算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”

今天这道算法题比较简单,主要考察的思考问题的全面性。这个需要考虑的几种情况。 如果输入的整数字符串是个负数,怎么处理? 如果输入的第一个字符是0,则怎么处理? 如果输入的是非0~9之间的字符怎么处理?…

排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现

最近在学习排序算法的一些知识。还是比较有趣的。所以好好研究了一下各个算法。并且使用matlab进行了个基本的实现,目前仅仅是实现吧,优化什么的可能目前的水平达不到吧,毕竟是用matlab实现,还是比较简单。以后还是希望使用C/C&am…

Java – HashMap详细说明

HashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数, 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量(16)和默认加载因子(0.75)的HashMap 。 HashMap ​(int initialCapaci…

Python实现石头-剪刀-布小游戏

近日在学习Python的一些基础知识,觉得还是很有趣的一个一门语言!就目前的学习的一些知识,编写了一些一个简单的石头剪刀布的游戏。主要是熟悉一些Python的一些控制语句。 import random while 1:sint(random.randint(1,3))print(s)print()if…

Python:递归输出斐波那契数列

今天学习Python的时候做一道练习题,题目是这样的: 题目 导入 问题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多…

Spring Webflux –编写过滤器

Spring Webflux是Spring 5的一部分提供的新的响应式Web框架。 在传统的基于Spring MVC的应用程序( Servlet Filter , HandlerInterceptor )中编写过滤器的方式与在基于Spring Webflux的应用程序中编写过滤器的方式非常不同,本文将…

排序算法二:快速排序算法原理以及MATLAB与Python实现

今天继续学习排序算法。今天的主角是快速排序算法。 1. 快速排序基本原理 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 该方法的基本思想是: 1.先从数列…

排序算法三:堆排序基本原理以及Python实现

1. 基本原理 堆排序就是利用堆的特性进行一个无序序列的排序工作。 堆的特点 堆分为最大堆和最小堆,其实就是完全二叉树。 最大堆要求节点的元素都要不小于其孩子最小堆要求节点元素都不大于其左右孩子。 两者对左右孩子的大小关系不做任何要求,其实…

spring jms 消息_Spring JMS,消息自动转换,JMS模板

spring jms 消息在我的一个项目中,我应该创建一个消息路由器,就像所有路由器一样,它应该从一个主题获取JMS消息并将其放入另一个主题。 该消息本身是JMS文本消息,实际上包含XML消息。 收到消息后,我还应该添加一些其他…

排序算法四:归并排序基本原理以及Python实现

1. 基本原理 归并排序建立在归并操作上的一种算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是将两 个已经有序的序列合成一个有序的序列的过程。 因此,对于一个待排序的序列来说,首先要将其进行…

如何将JAR添加到Jetbrains MPS项目

Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它,并在我们的咨询工作中定期使用它。 因此,我们之前已经写过关于Jetbrains MPS的文章 。 作为投影编辑器,您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一…

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长,主要是Pyhton可能还不是很熟练,走了很多路,基本是一边写一边学。不过,总算是基本搞出来了。不多说,进入正题。 1. K-邻近…

spring mvc 异步_DeferredResult – Spring MVC中的异步处理

spring mvc 异步DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供。 Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContext异步请求处理。 简要介绍一下它是如何工作的: RequestMapping("/") ResponseBod…