python用PCA求各特征权重

2023-05-25  本文已影响0人  丙吉

问题: 有个三维数据,想降维成一维然后再用它进行表征。

数据如下:

image.png

方法:用sklearn库中的pca


import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

# 设置数据集要降低的维度

pca = PCA(n_components=None)

# 对数据框的1,2,3列进行降维

pca.fit(df[[1,2,3]])

#  贡献方差,即特征值

pca.explained_variance_

pca.explained_variance_ratio_ # 方差贡献率

[pca.components](http://pca.components/)_ # 成分矩阵

k1_spss = [pca.components](http://pca.components/)_ /np.sqrt(pca.explained_variance_.reshape(-1,1))  # 成分得分系数矩阵

结果如图:
image.png

确定权重

# 确定权重
# 求指标在不同主成分线性组合中的系数

j=0

weights=[]

for j in range(len(k1_spss)):

    for i in range(len(pca.explained_variance_)):

        weights_coefficient = np.sum(100*(pca.explained_variance_ratio_[i]* (k1_spss[i][j]))/

                                    np.sum(pca.explained_variance_ratio_))

    j = j +1

    weights.append(np.float(weights_coefficient))

print('weights:', weights)


from sklearn import preprocessing

#对权重进行归一化

weights= pd.DataFrame(weights)

weights1 = preprocessing.MinMaxScaler().fit(weights)

weights2 = weights1.transform(weights)

print('weights2:', weights2)

这个得出的是每个指标最后的权重。

自实现代码:


R = df1.corr() # 样本相关阵

l, T = np.linalg.eig(R)   # 求特征值l与特征向量T,特征值默认从大到小排序

n, p = df1.shape

s=0

t=0

cr = []  # 累计贡献率

for i in range(len(l)):

    t+=1

    contri=l[i]/np.sum(l)  # 第i主成分贡献率

    cr.append(contri)

    s+=contri

    if s>=0.8: # 累计贡献率达80%即停止

        break

pc=[]

for i in range(t):

    Y=np.dot(df1, T[i].T) # 计算第i主成分

    pc.append(Y)

factor_loading=[]

for i in range(t):

    a = []

    for j in range(p):

        a.append(np.sqrt(l[i])*T[i][j])  # 计算第i 主成分在第j个变量上的载荷

    factor_loading.append(a)

factor_loading=np.array(factor_loading)

print('主成分个数', t)

print('主成分', np.mat(pc))

print('贡献率', cr)

print('累计贡献率', s)

print('因子载荷', factor_loading)

结果不一样,得再查下原因。

参考:https://blog.csdn.net/weixin_43166884/article/details/109363740

https://blog.csdn.net/weixin_60737527/article/details/125144416

上一篇下一篇

猜你喜欢

热点阅读