首页 > 编程知识 正文

数学建模主成分分析法,数学建模主成分分析法优缺点

时间:2023-05-03 14:01:41 阅读:185555 作者:1597

文章目录PCA介绍了SPSS实现python的简单主成分分析和主成分分析,用于综合评价Notice

PCA介绍

一种多元统计方法,利用主成分分析(Principal Component Analysis,PCA )降维方法,将多指标转化为若干综合指标;

在实际问题中,为了全面分析问题,往往提出与之相关的变量(因素),每个变量都在一定程度上包含了结果的一部分信息;

主成分:将原始指标线性组合形成的几个新指标。 利用这些新指标,尽量说明原指标中包含的大部分信息;

例如,在对国民经济的研究中,经过主成分分析,用三个新变量代替原来的17个变量,可以保持97.4%的准确率;

主要成分与原始变量的关系:

主成分保存着原变量大部分信息的主成分的数量大大少于原变量的数量,各主成分之间互不相关; 各主成分是原始变量线性组合,一般表示原始m个变量的主成分有多个,但不同的主成分的信息不能互相包含。 统计上是指两个主成分的协方差为0,几何上两个主成分正交的记述。

SSS实施步骤:

SPSS导入数据-分析-降维-因子分析;

说明-系数;

提取-碎石图;

显示得分-因子得分系数矩阵;

维主成分分析的结果受维的影响,各变量的单位可能不同,因此结果也不同; 这是最大的问题,需要在主成分分析之前将个变量无量纲化,然后用协方差or相关系数矩阵进行分析;SPSS在分析之前自带无量纲化处理了

无量纲化处理一般分为两种:

(1)正规化

另一方面,最小-最大归一化=x'=xmIn(x ) max ) x ) (FRAC(x ) }{max(x )-min(x ) }x )=max ) x

其二,平均归一化=x'=xmean(x ) m a

x ( x ) − m i n ( x ) x'=frac{x-mean(x)}{max(x)-min(x)} x′=max(x)−min(x)x−mean(x)​
(2) 标准化
x ′ = x − m e a n ( x ) σ ( σ 为 标 准 差 ) x'=frac{x-mean(x)}{sigma}(sigma为标准差) x′=σx−mean(x)​(σ为标准差)

SPSS手动无量纲化(标准化):分析 -> 描述统计 -> 描述 -> 勾选"将标准化得分另存为变量"

相关性矩阵

总方差解释

碎石图

求指标对应系数

方法一:利用成分矩阵+解释总方差求得

Fn前面的系数 就是拿 Fn的贡献率/(F1和F2的累计贡献率);比如F1前面的系数:(72.2/84.5);

方法二:利用成分得分系数矩阵(简单但不建议)

计算综合评价值 F=W1F1+W2F2; Wi 为第 i 主成分的贡献率;

比如方法一代入后最终结果如下:

比如方法二代入后最终结果如下:

python实现 简单的主成分分析

sklearn.decomposition模块的PCA函数sklearn.decomposition.PCA(n_components=None,copy=True)

n_components:缺省默认为None,所有成分被保留;若设为2,则提取2个主成分,若为0.85,则自动选择主成分,使满足累计贡献率85%;copy:缺省默认为True,表示运行算法时,将原始数据复制一份进行分析;若为false,则在原始数据上进行降维计算;

步骤

对数据矩阵A进行标准化得到B;计算相关系数矩阵np.corrcoef(B.T);计算相关系数矩阵R的特征值 λ1>λ2>…>λm ,以及对于的标准正交化特征向量 u1,u2…um,向量是按列的;利用特征变量得到主成分变量表达式 F1 = u11x1’+u21x2’…+um1ym,F2=…;计算主成分贡献率和累计贡献率,一般取累计贡献率达到85%以上的主成分就行利用得到的主成分F1,F2,…Fk分析问题,进行评价;

案例:

import numpy as npfrom sklearn.decomposition import PCAa = np.loadtxt("Pdata11_7.txt")b = np.r_[a[:, 1:4], a[:, -3:]] # 构造数据矩阵print("相关系数矩阵:", np.around(np.corrcoef(b.T), decimals=3)) # 数据标准化并计算相关系数矩阵,并保留三位小数md = PCA(n_components=0.85).fit(b) # 构造并训练模型(累计贡献率>85%即可)print("特征值为:", md.explained_variance_)print("各主成分的贡献率:", md.explained_variance_ratio_)print("奇异值为:", md.singular_values_)print("各主成分的系数:n", md.components_) # 每行是一个主成分"""下面直接计算特征值和特征向量,和库函数进行对比"""cf = np.cov(b.T) # 计算协方差阵c, d = np.linalg.eig(cf) # 求特征值和特征向量print("特征值为:", c)print("特征向量为:n", d)print("各主成分的贡献率为:", c / np.sum(c))


分析评价:

主成分分析用于综合评价

  主成分分析可应用于诸多评价领域,诸如投资组合风险管理、企业效益的综合分析、图像特征识别等;将主成分分析于聚类分析、判别分析以及回归分析方法相结合;
一般步骤

若各指标的属性不同(成本型、利润型等),将原矩阵A标准化为B;计算B的相关系数矩阵R;计算 R 的特征值 λ 以及相应的特征向量 u;根据特征值计算累计贡献率,确定主成分的个数,而特征向量 ui 就是第 i 主成分的系数向量;计算主成分的得分矩阵,若选定 K 个主成分,则主成分得分矩阵为 F = B ·[u1,u2,···,uk];计算综合评价值 Z=FW,其中 W 是第 i 主成分的贡献率(占总主成分贡献率的多少);根据综合评价值进行排序,若为效益型指标,则评价值越大排名越靠前;若为成本型指标值,则评价越小排名越靠前;

对于下列案例:

import numpy as npfrom scipy.stats import zscorea = np.loadtxt("Pdata11_8.txt")print("相关系数阵为:n", np.corrcoef(a.T))b = np.delete(a, 0, axis=1) # 删除第1列数据c = zscore(b)r = np.corrcoef(c.T) # 数据标准化并计算相关系数阵d, e = np.linalg.eig(r) # 求特征值和特征向量rate = d / d.sum() # 计算各主成分的贡献率print("特征值为:", d)print("特征向量为:n", e)print("各主成分的贡献率为:", rate)k = 1 # 提出主成分的个数F = e[:, :k]score_mat = c.dot(F) # 计算主成分得分矩阵score1 = score_mat.dot(rate[0:k]) # 计算各评价对象的得分score2 = -score1 # 通过表中数据以及score1观测,需要调整得分的正负号print("各评价对象的得分为:", score2)index = score1.argsort() + 1 # 排序后的每个元素在原数组中的位置print("从高到低各个城市的编号排序为:", index)



Notice 主成分分析时,主成分的系数的正负号是不可控的,因为特征向量乘以 -1 仍然是特征向量,所以一定要根据实际问题判断系数要不要取相反数!主成分分析之前,一定要进行数据的标准化 or 归一化,一般是标准化;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。