zoukankan      html  css  js  c++  java
  • 数据降维

    数据降维

    分类

    • PCA(主成分分析降维)
    • 相关系数降维

    PCA 降维(不常用)

    实现思路

    • 对数据进行标准化
    • 计算出数据的相关系数矩阵(是方阵, 维度是nxn, n是特征的数量)
    • 计算出相关系数矩阵的特征值和特征向量(虽然这里说的是向量, 但是是矩阵, 这个矩阵的每一列都是特征值或者特征向量, 是nxn), 特征值是每一个特征的特征值的集合, 但是在特征向量是每一个特征的特征向量的集合, 前者我们提到的特征值和特征向量是集合
    • 多特征值进行降序排序
    • 根据已经得到的特征值计算出贡献率和累计贡献率(主要看累计贡献率, 单单一个贡献率指的是一个主成分保存的原始特征的信息, 累计贡献率是总共保存的原始特征信息)
    • 设置信息阈值T, 一般设置为0.9, 如果大于T, 则记录下来当前的位置k(k也就是我们选择的主成分的个数, 主成分就是特征, 也就是一列)
    • 根据k选择主成分对应的特征向量
    • 将标准化之后的数据(矩阵)右乘在上一步中选择出来的特征向量(在这一步得到的矩阵就是m x new_n维度的了), 得到的就是主成分的分数, 也就是降维之后的数据集合

    伪代码

    X = load('data.xlsx', 'B1:I11');
    m = size(X, 1); % m 表示样本的数量
    n = size(X, 2); % n 表示特征的数量
    % 数据标准化
    for i = 1:n
        SX(:, i) = (X(:, i) - mean(X(:, i))) / std(X(:, i));
    end
    
    % 计算相关系数
    CM = corrcoef(SX);
    % V 是特征向量, D 是特征值
    [V D] = eig(CM);
    
    % 对D特征值进行降序排序, 将结果保存到DS的第一列
    for i = 1:n
        DS(:, 1) = D(n + 1 - i, n + 1 - i);
    end
    
    % 计算贡献率和累计贡献率
    for i = 1:n
        % 第二列为当前单个, 每一个, 主成分的贡献率
        DS(:, 2) = D(i, 1) / sum(D(:, 1));
        % 第三列为到当前主成分的累计贡献率
        DS(:, 3) = sum(D(1:i, 1)) / sum(D(:, 1));
    end
    
    % 选择主成分
    T = 0.9;
    for i = 1:n
        if DS(:, i) > T
            k = i;
            break;
        end
    end
    
    % 获取主成分对应的特征向量
    for i = 1:k
        PV(:, i) = V(:, n + 1 - i);
    end
    
    % 获取新的特征样本
    X_new = SX * PV;
    

    相关系数降维

    • 公式: $$r=sum_{j=1}^{m}{{(x_{j}-overline{x_{j}})({y_{j}-overline{y_{j}}})}over{std(x_{j})std(y_{j})}}$$
    • 如果|r|在[0.7, 1]时表示强线性关系, 说明x和y有很紧密的线性关系
    • 如果|r|在[0.5, 0.7]时表示中线性关系
    • 如果|r|在[0.2, 0.5]时表示低线性关系
    • 如果|r|在[0, 0.2]时表示没有关系
    • r > 0表示正相关, r < 0表示负关系
  • 相关阅读:
    manacher算法笔记
    2019qbxtCSP-S2 模拟题1
    三元环计数
    踩坑日记
    我的Ubuntu16.04 安装配置
    SLAM14讲项目在 mac 上无法正常运行
    平面最近点对的算法实现
    hiho 1996
    【游记】NOIP2018 退役滚粗记
    铁板铮铮♂+习题集
  • 原文地址:https://www.cnblogs.com/megachen/p/9972443.html
Copyright © 2011-2022 走看看