pca降维算法

PCA主成分分析算法,是一种线性降维,将高维坐标系映射到低维坐标系中。

如何选择低维坐标系呢?

通过协方差矩阵的特征值和特征向量,特征向量代表坐标系,特征值代表映射到新坐标的长度。

算法步骤:
输入:样本集D={x1,x2,…,xm};

低维空间维数k

第一步:将样本集中心化。每一列的特征值减去当前列的均值

第二步:求协方差矩阵的特征值和特征向量

协方差矩阵:矩阵×矩阵的转置;

方法:np.dot(x, np.transpot(x))

特征值和特征向量:协方差矩阵特征分解。

方法一:np.linalg.eig(),返回:特征值,一维数组,没有排序;特征向量,二维数组,列表示特征向量

方法二:np.linalg.svd(),返回:酉矩阵;奇异值,从大到小排序;酉矩阵

第三步:选取前k个特征值,对应的特征向量

新样本集:对应的特征向量×中心化数据

输出:降维后样本集。

k选择问题:
  方差贡献率:特征值与所有特征值总和的比值

累计贡献率:前k个特征值和与所有特征值总和的比值

一般根据累计贡献率选取k值。

代码如下:

import numpy as np


def feature_Normalize(x):
    """
    归一化数据
    (每个数据-当前列的均值)/当前列的标准差
    :param x: 样本集
    :return: 归一化后样本集,均值,标准差
    """
    m, n = x.shape
    mean = np.zeros((1, n))
    std = np.zeros((1, n))
    # 计算各列均值
    mean = np.mean(x, axis=0)
    # 计算各列标准差
    std = np.std(x, axis=0)
    # 对每个特征值归一化
    for i in range(n):
            x[:, i] = (x[:, i] - mean[i]) / std[i]
    return x, mean, std


def cal_eigenvalue(nor_x):
    """
    求样本协方差矩阵的特征值和特征向量
    :param nor_x: 归一化后的样本集
    :return: 特征值,特征向量,排序索引号
    """
    m, n = nor_x.shape
    # 协方差矩阵
    sigma = np.dot(np.transpose(nor_x), nor_x)/(m - 1)
    # 求协方差矩阵的特征值和特征向量,eig_vec[:,i]是对应于eig_val[i]的特征向量
    eig_val, eig_vec = np.linalg.eig(sigma)
    index = eig_val.argsort()
    return eig_val, eig_vec, index


def pca(x, k):
    """
    提取前k个主成分
    :param x: 样本集
    :param k: 前k个特征值
    :return: 返回降维后样本,累计贡献度,主成分索引
    """
    # 归一化
    nor_x, mean, std = feature_Normalize(x)
    # 求特征值和特征向量
    eig_val, eig_vec, index = cal_eigenvalue(nor_x)
    eig_index = index[:-(k+1):-1]
    # 累计贡献度
    sum_con = sum(eig_val[eig_index])/sum(eig_val)
    # 前k个特征值对应的特征向量
    k_eig_vec = eig_vec[:, eig_index]
    lowDData = np.dot(nor_x, k_eig_vec)
    return lowDData, sum_con, eig_index

转发链接:https://www.cnblogs.com/reaptomorrow-flydream/p/9687805.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值