机器学习实战(十三)


title: 机器学习实战(十三)
date: 2020-06-04 16:20:50
tags: [PCA, 降维, 主成分分析]
categories: 机器学习实战
更多内容请关注我的博客

利用PCA来简化数据

降维(dimensionality reduction),数据在低纬度时更容易处理。

降维技术

数据进行简化的原因:

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

降维方法,主成分分析(Principal Component Analysis,PCA),数据从原来的坐标系转换到新的坐标系,新的坐标系的选择由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。

另一种降维技术是,因子分析(Factor Analysis),在因子分析中,我们假设在观察数据的生成中有一些观察不到的隐变量(latent variable)。假设观察数据是这些隐变量和某些噪声的线性组合。那么隐变量的数据可能比观察数据的数目少,也就是说通过找到隐变量就可以实现数据的降维。

还有一种降维技术就是独立成分分析(Independent Component Analysis,ICA),ICA假设数据是从N个数据源生成的,这一点和因子分析有些类似。假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在PCA中假设数据是不相关的。同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。

PCA

主成分分析

优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用的信息
适用数据类型:数值型数据

在Numpy中实现PCA

伪代码大致如下:

去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最上面的N个特征向量
将数据转换到上述N个特征向量构建的空间中
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)
    meanRemoved = dataMat - meanVals # 去平均值
    covMat = cov(meanRemoved, rowvar=0)
    eigVals, eigVects = linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)            # 从小到大排序
    eigValInd = eigValInd[: -(topNfeat+1): -1]  # 去掉多余的
    redEigVects = eigVects[:, eigValInd]
    lowDDataMat = meanRemoved * redEigVects # 将数据转换为新的维度
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat
dataMat = loadDataSet('MLiA_SourceCode/Ch13/testSet.txt')
lowDMat, reconMat = pca(dataMat, 1)
shape(lowDMat)
(1000, 1)

将原始数据和降维后的数据绘制出来

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=90)
plt.show()

png

实例:利用PCA对半导体制造数据降维

数据拥有590个特征,包含许多的缺失值,这些缺失值是以NaN标识的。用平均值来代替缺失值。

def replaceNanWithMean(): 
    datMat = loadDataSet('MLiA_SourceCode/Ch13/secom.data', ' ')
    numFeat = shape(datMat)[1]
    for i in range(numFeat):
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) # 计算所有非Nan的平均值
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  # 将所有的Nan设置为平均值
    return datMat
dataMat = replaceNanWithMean()

观察pca()的工作过程

首先是去除均值

meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals

然后计算协方差矩阵:

covMat = cov(meanRemoved, rowvar=0)

对该矩阵进行特征值分析

eigVals, eigVects = linalg.eig(mat(covMat))

观察特征值结果

eigVals
array([ 5.34151979e+07+0.00000000e+00j,  2.17466719e+07+0.00000000e+00j,
        8.24837662e+06+0.00000000e+00j,  2.07388086e+06+0.00000000e+00j,
        ...
        ...
        0.00000000e+00+0.00000000e+00j,  0.00000000e+00+0.00000000e+00j,
        0.00000000e+00+0.00000000e+00j,  0.00000000e+00+0.00000000e+00j,
        0.00000000e+00+0.00000000e+00j,  0.00000000e+00+0.00000000e+00j,
        0.00000000e+00+0.00000000e+00j,  0.00000000e+00+0.00000000e+00j,
        0.00000000e+00+0.00000000e+00j,  0.00000000e+00+0.00000000e+00j])

我们可以看到一堆的值,发现其中有超过20%的特征值都是0。这就意味着这些特征都是其他特征的副本,也就是说,他们可以通过其他特征来表示,而本身并没有提供额外的信息。

总结

降维技术使得数据变得更易使用,并且它们往往能够去除数据中的噪声,使得其他机器学习任务更加精确。降维往往作为i预处理的步骤,在数据应用到其他算法之前清洗数据。很多技术可以用于数据降维,在这些技术中,独立成分分析,因子分析和主成分分析比较流行,其中又以主成分分析应用最广泛。

PCA可以从数据中识别其主要特征,他是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。
法之前清洗数据。很多技术可以用于数据降维,在这些技术中,独立成分分析,因子分析和主成分分析比较流行,其中又以主成分分析应用最广泛。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值