# 导包 import numpy as np X = np.array([ [1, 3, 6], [5, 7, 9], [4, 5, 9] ]) # 定义PCA函数 def myPCA(X, k): # m_sample :m个样本, n_feature:n个特征 m_sample, n_feature = X.shape # 一。去中心化 # 1.计算 每一个 属性的均值 mean = np.mean(X, axis=0) # 2. 去中心化 X = X - mean # 二。构造协方差矩阵 cov_mat = np.dot(X.T, X) # 三 。求出 协方差矩阵 cov_mat,特征值lmd s 和对应的 特征向量us lmd_s, us = np.linalg.eig(cov_mat) # lmd_s = [入1,入2,入3] ,us = [u1,u2,u3] # print(lmd_s,'\n',us) us = us.T # print(lmd_s, '\n', us) # [(λ1,us1),(λ2,us2),(λ3,us3)] # 四。绑定 特征值 和 特征向量 eig_pair = [] for i in range(n_feature): pair = (lmd_s[i], us[i]) eig_pair.append(pair) # 五。对 eig_pair 从大到小排序 eig_pair.sort(reverse=True) # 六。拼接k列的U矩阵 # print(eig_pair) ''' [(21.73098264032146, array([0.63112622, 0.58851165, 0.50530559])), (0.9356840263451855, array([ 0.10731153, -0.71141623, 0.69452947])), (1.008137404897603e-15, array([ 0.76822128, -0.38411064, -0.51214752]))] ''' U = eig_pair[0][1] # U = np.c_(U,eig_pair[1][1]) # U = np.c_(U,eig_pair[2][1]) for i in range(1, k): U = np.c_[U, eig_pair[i][1]] # 七.将 协方差 矩阵 进行 降维 return np.dot(X, U) # 进行函数调用 print(myPCA(X, 2))
PCA底层实现
最新推荐文章于 2024-08-26 18:56:03 发布