python 实现PCA变换

在机器学习中,指标不全面会无法保证模型的准确性,但指标太多又容易造成指标维度灾难。主成分分析的主要思想
1) 进行特征降维变换,不能完全地表示原有的对象,能量总会有损失。
2) 希望找到一种能量最为集中的变换方法使得损失最小
主成分分析就是试图在力保数据信息丢失最小的原则下,对这种多变量的数据进行最佳综合简化,也就是,对高维变量空间进行降维。
python 代码如下:

## Original_data: 输入待降维的数据(全部为数值型变量),返回该数据应该保留下来的成分维度数n
def cal_n(Original_data):
    mean_vals = Original_data.mean()
    # 计算每列的均值
    mid = Original_data - mean_vals
    ### step01 计算协方差矩阵
    cov_mat = mid.cov()
    
    ### step02: 计算协方差矩阵的特征值和特征向量
    eig_vals, eig_vectors = np.linalg.eig(cov_mat)
    eig_vals = sorted(eig_vals, reverse = True)
    ## 把主成份含量总和 > 95%的成分留下来
    sum_prop = sum(eig_vals)
    n = 1
    x_prop = 0
    for i in range(len(eig_vals)):
        x_prop += eig_vals[i]
        prop = x_prop / sum_prop
        if prop <= 0.95:
            n += 1
        else:
            break
    return n

该方法可以找到一个n,使得降维后变换后留下原来95%的信息量。接下来进行PCA变换,代码如下:

# 对数据进行PCA变换处理
## data: 要进行处理的数据 ; n_compotents: 要留下的成分个数

## 定义pca变换
def chensqPca(data , n_compotents):
    mean_vals = data.mean()
    mid = data - mean_vals
    ### step01 计算协方差矩阵
    cov_mat = mid.cov()
    ### step02: 计算协方差矩阵的特征值和特征向量
    eig_vals, eig_vectors = np.linalg.eig(cov_mat)
    #print(type(eig_vals))
    ### step03把特征值按照从小到大的顺序排列,并选取排在前面的n_components个特征值所对应的特征向量
    eig_val_index = np.argsort(eig_vals)
    #print(eig_val_index)
    #n_compotents = 1
    eig_val_index = eig_val_index[:-(n_compotents + 1): -1]
    #print(eig_val_index)
    eig_vectors = eig_vectors[:, eig_val_index]
    # step04 将样本投影到选取的特征向量上
    low_dim_mat = np.dot(mid, eig_vectors)
    return low_dim_mat
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值