数据降维方法之PCA

降维的概述

降维属于对数据的预处理,通过降低维度,降低数据的复杂性,识别最重要的多个特征。
常见的降维方法有:

  • 主成分分析法(PCA)
  • 因子分析(FA)
  • 独立成分分析(ICA)

本文主要对PCA方法进行展开。

知识基础

均值、方差、协方差的定义:

数据降维方法之PCA_第1张图片
PS:样本方差的期望并不是无偏的,要无偏估计,应该再乘上一个系数。N-1既为自由度,就是说,在一个容量为N的样本里,当确定了N-1个变量以后,第N个变量就确定了,因为样本均值是无偏的。
协方差除以N-1原理和方差一样,因为方差为协方差的特殊情况。

特征值和特征方向的定义:

对于矩阵 A,若满足 Aζ=λζ,则称 ζ是矩阵 A 的特征向量,而 λ 则是矩阵 A的特征值。将特征值按照从大到小的顺序进行排序,选择前 k个特征值所对应的特征向量即为所求投影向量。
对于特征值与特征向量的求解,主要是:特征值分解(当 A为方阵时),奇异值SVD分解(当 A 不为方阵时)

求最大协方差的原理

数据降维方法之PCA_第2张图片
数据降维方法之PCA_第3张图片

PCA的算法流程

1、去除平均值
2、计算协方差矩阵
3、计算协方差矩阵的特征值和特征向量
4、将特征值排序
5、保留前N个较大特征值对应的特征向量
6、将数据转换到上面N维特征向量的坐标系中,实现特征压缩

模块代码pca.py

from numpy import *
import matplotlib.pyplot as plt


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=1000):
    meanVals = mean(dataMat, axis=0)
    # 减去平均值 默认求全部,axis=0压缩行,求各列平均;axis=1,压缩列,求各行平均
    meanRemoved = dataMat - meanVals
    # 求取协方差矩阵  rowvar=0,除以N-1;rowvar=1,除以N
    covMat = cov(meanRemoved, rowvar=0)
    # 求协方差的特征值和特征向量
    eigVals, eigVects = linalg.eig(mat(covMat))
    # 由小到大排序
    eigValInd = argsort(eigVals)
    # 从后往前取前N大特征值
    eigValInd = eigValInd[:(topNfeat - 1):-1]
    # 找出N特征值对应的特征向量
    redEigVects = eigVects[:, eigValInd]
    # 维度坐标系准换
    lowDDataMat = meanRemoved * redEigVects
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat


if __name__ == "__main__":
    dataMat = loadDataSet("testSet.txt")
    lowDDataMat, reconMat = pca(dataMat, 1)
    # 绘制散点图
    fig = plt.figure()
    ax = fig.add_subplot(111)
    # print(type(reconMat))
    # print(type(dataMat))   
    # faltten()适用于array和mat,及数组和矩阵 *flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组
    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')
    plt.show()

运行结果

数据降维方法之PCA_第4张图片
含有缺失值的数据为NaN,这里给出置换成平均值的函数,之后我们计算得到的特征值很多为0,也就是我们降维的对象 。

def replaceNanWithMean():
    dataMat=loadDataSet('secom.data',' ')
    numFeat=shape(dataMat)[1]
    for i in range(numFeat):
        meanVal=mean(dataMat[nonzero(~isnan(dataMat[:,i]))[0],i])
        dataMat[nonzero(isnan(dataMat[:,i].A))[0],i]=meanVal
    return dataMat
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved, rowvar=0)
eigVals, eigVects = linalg.eig(mat(covMat))
print(eigVals)

数据降维方法之PCA_第5张图片

参考:
<机器学习实战>
https://www.cnblogs.com/lliuye/p/9156763.html

你可能感兴趣的:(机器学习,PCA,降维,机器学习)