《机器学习实战》第13章学习笔记(降维技术---PCA)

一、降维技术

数据往往拥有大规模的特征。这会导致利用学习算法进行分析时,造成很大的困扰。因此,数据降维就显得尤为重要。

其优点:

  • 使得数据集更易使用;
  • 降低很多算法的计算开销;
  • 去除噪声;
  • 使得结果易懂。

常见的降维技术:

  • 主成分分析(Principal  Component  Analysis, PCA )。在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差 的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。
  • 因子分析(Factor Analysis)。在因子分析中,我们假设在观察数据的生成中有一些观察不到的隐变量    (latent variable)。假设观察数据是这些隐变量和某些噪声的线性组合。那么隐变量的数据可能比观察数据的数目少,也就是说通过找到隐变量就可以实现数据的降维。因子分析已经应用于社会科学、金融和其他领域中了。
  •  独立成分分析(Independent Component  Analysis,ICA )。ICA假设数据是从N个数据源生成的,这一点和因子分析有些类似。 假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在PCA中只假设数据是不相关的。同因子分析一样,  如果数据源的数目少于观察数据的数目,则可以实现降维过程。

二、主成分分析(PCA)

2.1 基本原理

特征值分析

特征值分析是线性代数中的一个领域,它能够通过数据的一般格式来揭示数据的“ 真实”结构,即我们常说的特征向量和特征值。在等式中,v是特征向量,是特征值。特征值都是简单的标量值,因此 代表的是:如果特征向量v被某个矩阵A左乘,那么它就 等于某个标量乘以v。幸运的是,Numpy中有寻找特征向量和特征值的模块linalg , 它有eig()方法,该方法用于求解特征向量和特征值。

2.2 代码实现

# -*- coding: utf-8 -*-
"""
Created on Fri May 18 09:19:29 2018

@author: lizihua
"""
from numpy import *

def loadDataSet(fileName, delim = '\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [list(map(float,line)) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat = 9999999):
    meanVals = mean(dataMat,axis = 0)   #求列平均值,若dataMat是m*n,则,meanVals是1*n
    meanRemoved = dataMat - meanVals
    #每列代表一个方差,求协方差矩阵
    covMat = cov(meanRemoved, rowvar = 0)      #shape为n*n
    #linalg.eig()求特征向量和特征值
    eigVals,eigVects = linalg.eig(mat(covMat))  
    #shape(eigVals):n*1        shape(eigVects):n*n
    #将特征值eigVals从小到大排列,并将其排序索引返回给eigValInd
    eigValInd = argsort(eigVals)
    #选取topNfeat个最大的特征值
    eigValInd = eigValInd[:-(topNfeat+1):-1]
    #将特征向量按照特征值从小到大排列(按列排),选取前topNfeat个最大特征值对应的特征向量
    redEigVects = eigVects[:,eigValInd]     #shape为n*topNfeat
    #将数据转换到新空间(原始数据*topNfeat个特征向量)
    #lowDDataMat是映射到低维空间的数据:shape为 m*topNfeat
    lowDDataMat = meanRemoved *redEigVects
    #利用降维矩阵,重构原始数据reconMat,
    #redEigVects是标准正交矩阵,所以redEigVects*redEigVectS.T是n*n的1矩阵
    #reconMat = (lowDDataMat *redEigVects.T) +meanVals
    #reconMat = (((dataMat - meanVals) *redEigVects )*redEigVects.T) +meanVals=dataMat
    return lowDDataMat,reconMat

if __name__ == "__main__":
    dataMat = loadDataSet('testSet.txt')
    lowDMat, reconMat = pca(dataMat, 1)
    print("lowDMat的形状:",shape(lowDMat))
    print("reconMat的形状:",shape(reconMat))
    import matplotlib
    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker = '^',s=90)
    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker = 'o',s=50,c='red')

2.3 结果显示

三、小结

      降维技术使得数据变得更易使用, 并且它们往往能够去除数据中的噪声, 使得其他机器学习任务更加精确。降维往往作为预处理步骤, 在数据应用到其他算法之前清洗数据。有很多技术可以用于数据降维,在这些技术中,独立成分分析、因子分析和主 成分分析比较流行,其中又以主成分分析应用最广泛。
      PCA可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。

猜你喜欢

转载自blog.csdn.net/LZH_12345/article/details/80368522