美文网首页
python用PCA求各特征权重

python用PCA求各特征权重

作者: 丙吉 | 来源:发表于2023-05-25 08:27 被阅读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

    相关文章

      网友评论

          本文标题:python用PCA求各特征权重

          本文链接:https://www.haomeiwen.com/subject/qyxhedtx.html