前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用PCA来降维

利用PCA来降维

作者头像
用户6021899
发布2019-10-09 16:47:20
4450
发布2019-10-09 16:47:20
举报
文章被收录于专栏:Python编程 pyqt matplotlib

想象这样一种场景:我们通过电视直播观看足球比赛,电视屏幕大概有200万像素,假设我们关注的是任意时刻足球的位置。在这一场景中,人们实时地将屏幕上的百万级像素转换成了三维坐标。这个过程就是一种降维(dimensionnality reduction)。

降维是机器学习中很重要的一种思想。在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”。另外在高维特征中容易出现特征之间的线性相关,这也就意味着有的特征是冗余存在的。基于这些问题,降维思想就出现了。

降维通常有以下原因:

  • 去除冗余数据,使数据集更易于使用
  • 去除噪音
  • 降低计算开销
  • 使得结果直观易懂

在已标注与未标注的数据上均可以应用降维技术。常见的降维算法有:

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

在上述3种降维算法中,PCA 的应用最为广泛。本篇仅介绍PCA技术,PCA 算法的伪代码如下:

  1. 去除平均值
  2. 计算协方差矩阵
  3. 计算协方差矩阵的特征值和特征向量
  4. 将特征值从大到小排序
  5. 保留最上面的N个特征向量
  6. 将数据转换到上述N个特征向量构建的新空间中。 示例代码基于如下的数据集来展示PCA算法:
代码语言:javascript
复制
from numpy import *
from matplotlib import 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=9999999):
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #remove mean
    covMat = cov(meanRemoved, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions
    redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallest
    
    #降维后新坐标系的数据
    lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
    
    #降维后的在原始坐标系下的数据
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat
    
def replaceNanWithMean():
    datMat = loadDataSet('secom.data', ' ')
    numFeat = shape(datMat)[1]
    for i in range(numFeat):
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean
    return datMat

dataMat = loadDataSet("testSet3.txt")
fig = plt.figure()
plt.title("PCA")
ax = fig.add_subplot(2,1,1)
ax.scatter(array(dataMat[:,0]), array(dataMat[:,1]), s=20, color="b")
lowDMat, reconMat = pca(dataMat, 1)
print(shape(lowDMat))
ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0], marker='o', s = 15, c='r')
ax = fig.add_subplot(2,1,2)
ax.scatter(lowDMat.flatten().A[0], zeros(lowDMat.shape[0]), s=15, c="g")
plt.show()

该数据集降维后很容易利用决策树进行分类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档