• 2022年12月3日 PCA学习笔记


    主成分分析概念介绍及公式推导

    主成分分析,因为特征之间可能存在相关性,这样的特征一起利用显得冗余,利用主成分分析,将原始特征进行运算,得到更加合适于样本的特征。从几何意义角度显示就是对数据进行了降维。

    计算过程,整个过程可以结合上面网址例子走一遍

    • 求特征平均值,对于所有的样例,减去对应的特征平均值,再减去方差做归一化处理
    • 计算协方差矩阵
    • 计算协方差的特征值和特征向量
    • 将特征值从大到小排列,选取最大的k个,将对应的k个特征向量作为列向量组成特征向量矩阵
    • 将样本点投影到特征向量上,用减去均值的样本矩阵m*n乘以特征向量组成的矩阵n*k,得到最终的数据矩阵

    上面网站PCA理论基础自行了解


    在进行主成分分析前,先补充对数据做合适性检验先来判断是否数据适合做主成分分析

    • 球形检验

    假设:

    ​ H0:相关系数矩阵为单位阵(即变量不相关)

    ​ H1:相关系数矩阵不是单位阵(即变量间有相关关系)

    • KMO统计量

    KMO的值在0,1之间,该值越大,则样本数据越适合作主成分分析和因子分析。一般要求该值大于0.5,方可作主成分分析或者相关分析。

    代码

    热力图用不了可能是matlab绘图库和它冲突了,可以试试降低matlab绘图库版本

    数据需要删除第一样第一列,否则会报格式错误

    # 数据处理
    import pandas as pd
    import numpy as np
    
    # 绘图
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    
    df = pd.read_csv("aa.csv", encoding='gbk', index_col=0).reset_index(drop=True)
    print(df)
    
    # Bartlett's球状检验
    from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
    
    chi_square_value, p_value = calculate_bartlett_sphericity(df)
    print(chi_square_value, p_value)
    
    # KMO检验
    # 检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。
    # 通常取值从0.6开始进行因子分析
    from factor_analyzer.factor_analyzer import calculate_kmo
    
    kmo_all, kmo_model = calculate_kmo(df)
    print(kmo_all)
    
    
    # #标准化
    
    # #所需库
    # from sklearn import preprocessing
    # #进行标准化
    # df = preprocessing.scale(df)
    # print(df)
    
    # #求解系数相关矩阵
    # covX = np.around(np.corrcoef(df.T),decimals=3)
    # print(covX)
    
    # #求解特征值和特征向量
    # featValue, featVec=  np.linalg.eig(covX.T)  #求解系数相关矩阵的特征值和特征向量
    # print(featValue, featVec)
    
    
    # 不标准化
    # 均值
    def meanX(dataX):
        return np.mean(dataX, axis=0)  # axis=0表示依照列来求均值。假设输入list,则axis=1
    
    
    average = meanX(df)
    print(average)
    
    # 查看列数和行数
    m, n = np.shape(df)
    print(m, n)
    
    # 均值矩阵
    data_adjust = []
    avgs = np.tile(average, (m, 1))
    print(avgs)
    
    # 去中心化
    data_adjust = df - avgs
    print(data_adjust)
    
    # 协方差阵
    covX = np.cov(data_adjust.T)  # 计算协方差矩阵
    print(covX)
    
    # 计算协方差阵的特征值和特征向量
    featValue, featVec = np.linalg.eig(covX)  # 求解协方差矩阵的特征值和特征向量
    print(featValue, featVec)
    
    ####下面没有区分#######
    
    # 对特征值进行排序并输出 降序
    featValue = sorted(featValue)[::-1]
    print(featValue)
    
    # 绘制散点图和折线图
    # 同样的数据绘制散点图和折线图
    plt.scatter(range(1, df.shape[1] + 1), featValue)
    plt.plot(range(1, df.shape[1] + 1), featValue)
    
    # 显示图的标题和xy轴的名字
    # 最好使用英文,中文可能乱码
    plt.title("Scree Plot")
    plt.xlabel("Factors")
    plt.ylabel("Eigenvalue")
    
    plt.grid()  # 显示网格
    plt.show()  # 显示图形
    
    # 求特征值的贡献度
    gx = featValue / np.sum(featValue)
    print(gx)
    
    # 求特征值的累计贡献度
    lg = np.cumsum(gx)
    print(lg)
    
    # 选出主成分
    k = [i for i in range(len(lg)) if lg[i] < 0.85]
    k = list(k)
    print(k)
    
    # 选出主成分对应的特征向量矩阵
    selectVec = np.matrix(featVec.T[k]).T
    selectVe = selectVec * (-1)
    print(selectVec)
    
    # 主成分得分
    finalData = np.dot(data_adjust, selectVec)
    print(finalData)
    
    # 绘制热力图
    
    plt.figure(figsize=(14, 14))
    ax = sns.heatmap(selectVec, annot=True, cmap="BuPu")
    
    # 设置y轴字体大小
    ax.yaxis.set_tick_params(labelsize=15)
    plt.title("Factor Analysis", fontsize="xx-large")
    
    # 设置y轴标签
    plt.ylabel("Sepal Width", fontsize="xx-large")
    # 显示图片
    plt.show()
    
    # 保存图片
    # plt.savefig("factorAnalysis", dpi=500)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
  • 相关阅读:
    BASH shell脚本篇2——条件命令
    HotSpot垃圾收集算法实现细节
    linux rsyslog日志采集格式设定五
    二进制类RPC协议
    react实现动态递增展示数字特效
    Log BERT 日志异常检测
    Kafka开启SASL认证 【windowe详细版】
    9月22日上课内容 Docker
    vue-router的使用
    【优化模型】求解二次规划问题
  • 原文地址:https://blog.csdn.net/qq_61735602/article/details/128162212