zoukankan      html  css  js  c++  java
  • 机器学习:降维工具

    降维(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
    




  • 相关阅读:
    d3.js了解
    java常用验证码
    连接数据库的配置文件
    MD5加密的使用
    ssm下载文件
    Ajax基于rest风格上传图片
    web常见页面错误整理
    前后端一起用cookie来保存密码
    通用mapper插件
    ssm的maven依赖,直接复制可以使用
  • 原文地址:https://www.cnblogs.com/moonlight-lin/p/12493507.html
Copyright © 2011-2022 走看看