INPUT: X - (array) 特征数据数组 k - (int) 设定的主成分个数 OUTPUT: fac_load - (array) 因子负荷量数组 dimrates - (list) 可解释偏差列表 Y - (array) 主成分矩阵
(X, k)
| 84 | |
| 85 | #定义主成分分析函数 |
| 86 | def do_pca(X, k): |
| 87 | ''' |
| 88 | INPUT: |
| 89 | X - (array) 特征数据数组 |
| 90 | k - (int) 设定的主成分个数 |
| 91 | |
| 92 | OUTPUT: |
| 93 | fac_load - (array) 因子负荷量数组 |
| 94 | dimrates - (list) 可解释偏差列表 |
| 95 | Y - (array) 主成分矩阵 |
| 96 | |
| 97 | ''' |
| 98 | eigvalues, V = cal_V(X) #计算特征值和V矩阵 |
| 99 | Vk = V[:, :k] #取V矩阵的前k列 |
| 100 | Y = np.matmul(Vk.T, X) #计算主成分矩阵,将m*n的样本矩阵X转换成k*n的样本主成分矩阵 |
| 101 | dimrates = [i / sum(eigvalues) for i in eigvalues[:k]] #计算可解释偏差,即前k个奇异值中每个奇异值占奇异值总和的比例,这个比例表示主成分i可解释原始数据中的可变性的比例 |
| 102 | fac_load = np.zeros((k, X.shape[0])) #用来保存主成分的因子负荷量 |
| 103 | for i in range(k): |
| 104 | for j in range(X.shape[0]): |
| 105 | fac_load[i][j] = np.sqrt(eigvalues[i]) * Vk[j][i] / np.sqrt(np.var(X[j])) #计算主成分i对应原始特征j的因子负荷量,保存到fac_load中 |
| 106 | return fac_load, dimrates, Y |
| 107 | |
| 108 | |
| 109 | if __name__ == "__main__": |