主成分分析是用降维的方法将多指标转化为几个综合指标的多元统计分析方法,使用较少的变量去解释原来资料中的大部分信息。
二:基本原理和步骤 1.基本原理:略。需要注意的是:
(1)主成分分析法结果受量纲的影响,需要先进行无量纲化处理,然后用协方差或相关系数矩阵进行分析。
(2)实际研究中选取的主成分不超过6个,只需要贡献率超过85%即可。
2.基本步骤: 三:例题#程序文件Pex11_7.py
import numpy as np
from sklearn.decomposition import PCA
a=np.loadtxt("Pdata11_7.txt")
b=np.r_[a[:,1:4],a[:,-3:]] #构造数据矩阵
# #np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。‘
#所以上面构造矩阵的方法研究一下就明白了。
md=PCA().fit(b) #构造并训练模型
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))
如上所示:使用库函数PV=CA时,主成分正负号不可控,因此我们直接计算特征值和特征向量。
同时:PCA使用协方差矩阵进行主成分分析。我们也可以选用相关系数阵。这样相当于对数据进行了标准化处理。
四:主成分分析的应用用于综合评价的一般步骤:
例11.8
#程序文件Pex11_8.py
import numpy as np
from scipy.stats import zscore
a=np.loadtxt("Pdata11_8.txt")
print("相关系数阵为:n",np.corrcoef(a.T))
b=np.delete(a,0,axis=1) #删除第1列数据
#这是因为r12=r21=1,所以x1,x2完全线性相关,选取指标一致,只保留一个即可
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 #通过观测,调整得分的正负号
#这里主要是因为前面特征向量没有取相反数。如果取了这里就不用取反
print("各评价对象的得分为:",score2)
index=score1.argsort()+1 #排序后的每个元素在原数组中的位置
print("从高到低各个城市的编号排序为:",index)
这里注意:先观察相关系数阵,如果有非对角线元素为1,则说明变量选取不合理,二者完全线性相关,应删除一个指标。
注意:关于主成分得分矩阵以及评价对象得分,详见下图。因为本题为效益型指标值,所以评价值越大排名越高。否则排名取反即可。



