[关闭]
@notmylove 2019-07-10T14:08:00.000000Z 字数 3327 阅读 5804

基于主成分分析的权重确定方法

主成分分析法 权重确定


今天介绍一种基于主成分分析的权重确定方法。通过分析主成分分析方法的应用现状,提出了基于主成分分析的权重确定思路。在主成分分析法的基础上提出了权重确定的假设,建立了基于主成分分析的权重确定模型。在无需指标样本数据的情况下利用主成分分析方法基本原理,解决权重确定问题。

主成分分析法的计算过程已在上篇文章讲到,这里就不在重复提及。

建立权重模型

提出假设

假设需确定权重的指标个数为 h 个。现分别咨询L位专家得出 h 组权重评分值,其中每组评分值中均有 L 个元素。具体形式可由下表 表示。

指标\专家 ...
...
...
... ... ... ... ...
....

由于各位专家所研究方向不同,其打分也存在一定的偏向,从而给权重的确定带来一定的模糊性。研究发现,专家人数越多,得到的权重越科学,与此同时权重的确定也就越模糊。在此基础上提出以下假设,即在专家人数不变的情况下,利用各位专家评分间的线性关系对实际评分专家数进行类似的简化,从而实现权重评判的精确性。经分析得,思路符合主成分分析的基本原理,故可尝试用主成分分析方法来确定权重。

权重确定过程

根据上述条件可知,权重的确定过程其实就是主成分分析求综合评价函数的过程。在此过程中,原评价系统中的指标变为样本;现有指标为各位专家。具体的权重确定流程可用下图表示:

权重模型

首先确定的初级权重模型即是主成分模型:


式中,为分析后得到的个主成分;是第个特征值对应的特征向量的第个分量.

在此基础上构建综合评价函数:

式中,即指标 在主成分中的综合重要度。在此基础上结合专家实际打分,可算出原有指标得分综合值.


可得各指标权重为:

综合可得二级权重模型

示例分析

现有任务成功性评定指标集:(任务强度,环境等级,寿命等级,人员素质,技术状态)假定变量与指标集中元素满足如下
对应关系: -任务强度; -环境等级; -寿命等级; -人员素质; -技术状态。另有,-专家 1; -专家 2;-专家 3; -专家 4;-专家 5; -专家 6。

由 6 位专家采取 5 分制原则对 5 个指标进行评分,评分表如下:

指标\专家 专家 1 专家 2 专家 3 专家 4 专家 5 专家 6
任务强度 3 4 3 3 3 4
环境等级 2 3 2 3 2 2
寿命等级 5 4 4 3 3 4
人员素质 3 2 3 2 3 3
技术状态 5 3 4 4 3 4

表中: 5-非常重要; 4-比较重要; 3 - 一般重要; 2-不太重要; 1-不重要.

以原指标项为样本,专家项为指标对评分表进行主成分分析,信息利用率达到80%以上,确定主成分个数为2,得到成分矩阵:

专家 成分
1 2
专家1 -0.4736 0.0186
专家2 -0.2497 -0.5655
专家3 -0.4889 0.1460
专家4 -0.2639 -0.6435
专家5 -0.4084 0.4904
专家6 -0.4877 0.0627

方差解释表:

成分 特征值 方差占比(%) 方差累积占比(%)
1 3.860 64.328 64.328
2 1.222 20.362 84.690
3 0.709 11.814 96.504
4 0.210 3.496 100.000
5 -6.417E-17 -1.070E-15 100.000
6 -2.059E-16 -3.432E-15 100.000

得到初始权重模型:

二级权重模型可得:


(ps这里求出的),都是负值,因为我们这里表示的是指标 在主成分中的综合重要度,可以取绝对值,对最后的结果不影响)

补充

matlab程序代码

%输入数据
X = [[3, 2, 5, 3, 5]' ,[4, 3, 4, 2, 3]', [3, 2, 4, 3, 4]', [3, 3, 3, 2, 4]', [3, 2, 3, 3, 3]', [4, 2, 4, 3, 4]'];

%数据预处理:标准化
mu = mean(X);
X_norm = bsxfun(@minus, X, mu);
sigma = std(X_norm);
X_norm = bsxfun(@rdivide, X_norm, sigma);

%协方差矩阵
covMat = cov(X_norm);

%奇异值分解,U为特征向量,S为特征值
[U, S] = svd(covMat);

%确定主成分个数,也就是k值,一般要利用信息的80%以上
lambda = diag(S);
fprintf('累积信息占比:%.4f \n', cumsum(lambda)/sum(lambda));
k = find(cumsum(lambda)/sum(lambda) < 0.8, 1, 'first') + 1;

%成分矩阵
u = U(:, 1:k);

%各个指标在主成分中的综合重要度
a = zeros(size(X, 2), 1);
for i=1:k
    a = a + lambda(i) / sum(lambda(1:k)) * u(:, i);
end

qz = X * a / sum(X * a);
fprintf('权重为:%.4f \n', qz);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注