我想在列车里和你相爱
阳光流淌
都漫过我们的灵魂尽头
然后看着人间
安静的盛开在一扇窗里
目录
1.原理介绍
2.步骤详解
2.1 确定指标在各主成分线性组合中的系数
2.2 利用主成分的方差贡献率确定综合得分模型系数
2.3 指标权重归一化
3. 案例分析
3.1 数据获取
3.2 确定指标在各主成分线性组合中的系数
3.3 利用主成分的方差贡献率确定综合得分模型系数
3.4 指标权重归一化
4. 完整代码(Java)
1.原理介绍
在阅读本文前建议先阅读上一篇文章 “数据降维:主成分分析法(PCA)”,因为在本文中需要用到部分数据降维中的数据。
用主成分分析确定权重有:指标权重等于以主成分的方差贡献率为权重,对该指标在各主成分线性组合中的系数的加权平均的归一化。
因此,要确定指标权重需要知道三点:
A.指标在各主成分线性组合中的系数
B.主成分的方差贡献率
C.指标权重的归一化
通过前文利用主成分分析对数据降维我们可以得到以下数据:
A.前p个主成分的特征值以及对应的特征向量
B.前p个主成分特征值各自的方差贡献率
2.步骤详解
2.1 确定指标在各主成分线性组合中的系数
假设现有一组数据,有n个指标,m条待评价对象。
用主成分分析法可以的到前p个主成分以及其对应的特征值 和特征向量 。
则每个主成分中对应指标的系数为:
每个主成分都可以用如下的线性组合表示:
2.2 利用主成分的方差贡献率确定综合得分模型系数
记前p个主成分特征值的方差贡献率为,综合得分模型系数为(对应每个指标的综合系数),则:
则,得到综合得分模型为:
2.3 指标权重归一化
3. 案例分析
3.1 数据获取
本文所用数据均为上文数据降维:主成分分析法(PCA)所计算结果:
| p1 | p2 | p3 | p4 | p5 | p6 | p7 | |
| 特征值 | 2045.737 | 1273.595 | 950.6142 | 821.2534 | 361.4991 | 260.859 | 175.7022 |
| 贡献率 | 34.43% | 21.44% | 16.00% | 13.82% | 6.08% | 4.39% | 2.96% |
| 特征向量 | 0.414 | -0.13 | 0.041 | 0.193 | -0.125 | 0.768 | 0.077 |
| -0.282 | -0.483 | 0.07 | -0.009 | -0.733 | -0.082 | -0.328 | |
| -0.357 | 0.296 | 0.454 | 0.245 | -0.109 | 0.406 | -0.181 | |
| -0.264 | -0.08 | -0.466 | 0.657 | 0.303 | 0.006 | -0.404 | |
| -0.539 | -0.189 | 0.259 | -0.046 | 0.22 | -0.019 | 0.373 | |
| 0.096 | -0.012 | -0.455 | 0.219 | -0.402 | -0.082 | 0.46 | |
| 0.066 | -0.571 | 0.27 | 0.396 | 0.187 | -0.058 | 0.402 | |
| -0.166 | 0.539 | 0.07 | 0.369 | -0.312 | -0.131 | 0.355 | |
| 0.468 | 0.059 | 0.467 | 0.358 | -0.044 | -0.459 | -0.228 |
3.2 确定指标在各主成分线性组合中的系数
//计算每个指标在不同主成分线性组合中的系数
public double[][] coefficient(double[][] comp){
double[][] coeff = new double[comp.length-1][comp[0].length];//每列存储每个主成分对应的系数
var = new double[comp[0].length];
for(int j=0;j
输出:
3.3 利用主成分的方差贡献率确定综合得分模型系数
public double[] var_cont(double[][] coefficient) {
double[] cont = new double[var.length];//每个特征值对应的贡献率
double[] var_cont = new double[coefficient.length];
double total = 0;
double sum = 0;
System.out.println("请按以下特征值顺序依次输入对应的贡献率!");
for(int i=0;i
输出:
3.4 指标权重归一化
在此模块做了一点变动,由于在计算过程中存在负数,导致最后求得的权重也存在负数,所以在此我们找出负数中最小的值,让每一个数都加上该值得绝对值,在进行运算。
public double[] unifor(double[] varcont) {
double sum=0;
double min=varcont[0];
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i
输出:
4. 完整代码(Java)
package pca_weight;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WriteException;
public class PCA_weight {
int rows,cols;
double[] var;//存储特征值
Scanner input = new Scanner(System.in);
//输出一维矩阵
public void matrixoutput1(double[] x) {
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i
输出:
3.3 利用主成分的方差贡献率确定综合得分模型系数
public double[] var_cont(double[][] coefficient) {
double[] cont = new double[var.length];//每个特征值对应的贡献率
double[] var_cont = new double[coefficient.length];
double total = 0;
double sum = 0;
System.out.println("请按以下特征值顺序依次输入对应的贡献率!");
for(int i=0;i
输出:
3.4 指标权重归一化
在此模块做了一点变动,由于在计算过程中存在负数,导致最后求得的权重也存在负数,所以在此我们找出负数中最小的值,让每一个数都加上该值得绝对值,在进行运算。
public double[] unifor(double[] varcont) {
double sum=0;
double min=varcont[0];
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i
输出:
4. 完整代码(Java)
package pca_weight;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WriteException;
public class PCA_weight {
int rows,cols;
double[] var;//存储特征值
Scanner input = new Scanner(System.in);
//输出一维矩阵
public void matrixoutput1(double[] x) {
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i
输出:
3.4 指标权重归一化
在此模块做了一点变动,由于在计算过程中存在负数,导致最后求得的权重也存在负数,所以在此我们找出负数中最小的值,让每一个数都加上该值得绝对值,在进行运算。
public double[] unifor(double[] varcont) {
double sum=0;
double min=varcont[0];
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i
输出:
4. 完整代码(Java)
package pca_weight;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WriteException;
public class PCA_weight {
int rows,cols;
double[] var;//存储特征值
Scanner input = new Scanner(System.in);
//输出一维矩阵
public void matrixoutput1(double[] x) {
for(int i=0;i= 0) {
min = 0;
}
for(int i=0;i



