首页 > 其他 > 详细

机器学习:降维工具 - PCA

时间:2020-03-14 19:24:39      阅读:63      评论:0      收藏:0      [点我收藏+]

降维(dimensionality reduction)就是减少数据特征的维度
??
作用
??使得数据集更易使用
??降低很多算法的计算开销
??去除噪声
??使得结果易懂
??
PCA(主成分分析 Principal Component Analysis)
??PCA 将数据从原来的坐标系转换到了新的坐标系
??第一个新坐标轴选择的是原始数据中方差最大的方向
??第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向
??重复该过程,重复次数为特征的数目
??我们会发现,大部分方差都包含在最前面的几个新坐标轴中
??因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理
??
因子分析(Factor Analysis)
??假设在观察数据的生成中有一些观察不到的隐变量(latent variable)
??假设观察数据是这些隐变量和某些噪声的线性组合
??那么隐变量数据可能比观察数据的数目少,就是说通过找到隐变量就可以实现数据的降维
??
独立成分分析(Independent Component Analysis,ICA)
??假设数据是从 N 个数据源生成的,数据为多个数据源的混合观察结果
??这些数据源之间在统计上是相互独立的
??如果数据源的数目少于观察数据的数目,则可以实现降维过程
??
下面只讲 PCA 技术
??
优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用信息
??
技术分享图片
以上图为例
?第一条坐标轴旋转到覆盖数据的最大方差位置 B,最大方差给出了数据最重要的信息
?第二条坐标轴选择和第一条坐标轴正交,并且方差最大的方向 C
?注意坐标轴的旋转并没有减少数据的维度
?如果新坐标 B 比较长,而新坐标 C 比较短,则 B 比较重要而 C 可以忽略
?通过这种方法将数据坐标轴旋转至数据角度上的那些最重要的方向

一旦得到了协方差矩阵的特征向量,就可以保留最大的 N 个值
这些特征向量给出了 N 个最重要特征的真实结构
可以通过将数据乘上这 N 个特征向量而将它转换到新的空间
??
代码

# coding=utf-8
import numpy as np


def pca(dataMat, topNfeat=9999999):
    """
    dataMat - 原数据集
    topNfeat - 压缩为 topNfeat 个特征
    """

    # 所有数据减去平均值
    meanVals = np.mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals

    # 计算协方差矩阵,协方差用于衡量两个变量(特征)的总体误差
    # 正值表示有正相关性,负值表示有负相关性,0 表示两个变量是统计独立的
    # 而方差是协方差的一种特殊情况,即当两个变量是相同的情况
    covMat = np.cov(meanRemoved, rowvar=False)

    # 计算协方差矩阵(n阶矩阵) covMat 的特征值向量 eigVals (维度 n*1) 和特征向量矩阵 eigVects (维度 n*n)
    # eigVals 的每个值是一个特征值,eigVects 的每一列是一个特征向量,所有特征向量之间都是线性无关的
    # 满足 covMat * eigVects[:,j] = eigVals[j] * eigVects[:,j]
    # 注意这里的特征、特征向量是针对协方差矩阵的,不是针对数据集的
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))

    # 对特征值向量进行从小到大的排序,eigValInd 的值是 eigVals 的下标
    eigValInd = np.argsort(eigVals)

    # 步长 -1 所以从最后一个 (既最大的) 开始取,取 topNfeat 个最大的值的下标
    eigValInd = eigValInd[:-(topNfeat + 1):-1]

    # 通过下标取特征值最大的 topNfeat 个特征向量得到 redEigVects (维度 n*topNfeat)
    redEigVects = eigVects[:, eigValInd]

    # 使用新的特征向量矩阵对原始数据进行降维
    lowDDataMat = meanRemoved * redEigVects

    # 使用新的特征向量矩阵将原始数据集矩阵转换到新的空间
    reconMat = (lowDDataMat * redEigVects.T) + meanVals

    # 返回降维后的原始数据,和转换到新空间的数据
    return lowDDataMat, reconMat

??



机器学习:降维工具 - PCA

原文:https://www.cnblogs.com/moonlight-lin/p/12493507.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!