PCA底层实现

# 导包
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))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值