sklearn.decomposition中的主成分pca应用

注:使用的数据所包含的特征只有4个,选取的数据不是很合适,因此本文重在表达主成分分析的过程

一、数据准备
# 提取数据
data = load_iris()
data1 = pd.DataFrame(data['data'])
label = pd.DataFrame(data['target'])


二、巴特利KMO检验

巴特利所计算出的p值小于给定的显著性水平(通常取0.05)则拒绝原假设,认为模型可以做主成分,kmo越大效果越好,一般至少大于0.6

from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity #巴特利球形检验
from factor_analyzer.factor_analyzer import calculate_kmo #kmo检验

# 巴特利球形检验,若拒绝原假设即可进行主成分分析
chi_square_value, p_value = calculate_bartlett_sphericity(data1)
print(chi_square_value, p_value)
# KMO检验 越接近1,变量间的相关性越强,因子分析的效果越好
kmo_all, kmo_model = calculate_kmo(data1) # all是每个特征单独的kmo值,model是整个模型即所有特征合在一起的kmo值
print(kmo_all, kmo_model)
三、数据标准化
scaler = StandardScaler()
data_s = scaler.fit_transform(data1)
data_s = pd.DataFrame(data_s)
datas = pd.concat([data_s,label],ignore_index=True, axis=1) # 合并标签与数据
四、计算相关系数矩阵
covX = np.around(np.corrcoef(data_s.T), decimals=3)# 保留三位小数
print(covX)
五、绘制碎石图

本例中特征共有4个,先计算所有特征的特征值以及特征向量,绘制碎石图

# 主成分分析
pca = PCA(n_components=4)
pc = pca.fit(data_s)
print("explained variance ratio:{}".format(pca.explained_variance_ratio_))# 打印累计方差贡献率
print(pca.explained_variance_) # 打印特征值
print(pc.get_covariance()) # 打印协方差矩阵

# 绘制碎石图
fig, ax1 = plt.subplots(figsize=(8,6))
plt.plot(range(1,data1.shape[1]+1),sorted(pca.explained_variance_)[::-1])
plt.scatter(range(1,data1.shape[1]+1), sorted(pca.explained_variance_)[::-1])
plt.title('碎石图')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
碎石图

六、进行主成分分析

根据碎石图于累计方差贡献率,选择需要保留的特征个数或最少的需达到的累计方差贡献率,一般所需要选择的特征值要大于1,累积方差贡献率达到85%

pca1 = PCA(n_components=2)
pc1 = pca1.fit_transform(data_s) #注:fit和transform在一起使用时,得到的直接是降维后的特征向量
print(pca1.components_.T) #(转置之前)成分矩阵 行是成分,列是特征 即载荷系数

 其表达的意思为第一主成分与第二主成分对原来指标的载荷数(提取的公因子对原始变量的影响程度)。例如,第一主成分对第一个特征的载荷数为0.52106591。

载荷系数(pca1.components_.T)
七、主成分分析计算权重
7.1  计算线性组合系数矩阵

公式为:loading矩阵/Sqrt(特征根),即载荷系数除以对应特征根的平方根

k1_spss = pca1.components_ / np.sqrt(pca1.explained_variance_.reshape(pca1.n_components_,1))  # 成分得分系数矩阵
print(k1_spss.T)
线性组合系数矩阵(k1_spss.T)

由此得到的两个主成分线性组合如下:
F1 = 0.304X1 - 0.157X2 + 0.339X3 + 0.330X4
F2 = 0.393X1 + 0.962X2 + 0.026X3 + 0.070X4

7.2  计算综合得分系数

公式为:累积(线性组合系数*方差解释率)/累积方差解释率,即线性组合系数分别与方差解释率相乘后累加,并且除以累积方差解释率,即得到综合得分系数

grade = (np.dot(k1_spss.T, pca1.explained_variance_.T) / np.cumsum(pca1.explained_variance_ratio_)[-1]).reshape(4,1)
print(grade)
综合得分系数grade

由此得到综合得分模型为:
Y = 1.310X1 + 0.443X2 + 1.063X3 + 1.078X4

7.3 计算各指标权重

将综合得分系数进行求和归一化处理即得到各指标权重值

nor = grade / np.sum(grade)
print(nor)
各指标权重值(nor)

本人水平有限 哪里出现了什么错误还请大佬指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值