机器学习实战第十三章-利用PCA来简化数据

本文介绍了降维技术的重要性和应用场景,重点讲解了PCA(主成分分析)的原理及其在Python中的实现方法。通过实例展示了如何使用PCA进行数据降维,并讨论了PCA的优点和潜在局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,降维技术

1,降维的作用

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

2,降维技术的方法

  • PCA
  • 因子分析:我们假设观察数据的生成中有一些观测不到的隐变量,观测数据是这些隐变量和噪声的线性组合。隐变量的数目少的话就可以通过隐变量实现降维。
  • 独立成分分析:类似因子分析,它假设观察数据是由隐含的几个数据源生成(或者说是从某几种数据分布中采样生成)。数据源的数目少的话就可以实现降维。

二,PCA

1,PCA概述

PCA基本思想:第一个主成分是从数据差异性最大(即方差最大)的方向提取出来的;第二个主成分来源与数据差异性次大的方向,并且该方向与第一个主成分方向正交;该过程重复进行,重复次数为原始数据特征的数目。通过忽略最后几个无法体现数据差异性的主成分达到降维的目的。

PCA的原理:最近重构性和最大可分性,通过选取原始数据协方差矩阵的前k大的特征值的特征向量组成线性变换矩阵来对原始数据进行降维。

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

2,用numpy实现PCA

(1)PCA核心步骤
  1. 去除平均值(即样本中心化)。
  2. 计算样本数据的协方差矩阵XXTXmn维的矩阵,其中n为样本数,m为每个样本的特特征数。
  3. 计算协方差矩阵的特征值和特征向量。
  4. 将特征值按从大到小的顺序排序。
  5. 保留前N个特征值对应的特征向量。
  6. 将数据转换到上述前N个特征向量构建的新空间中。
(2)用Python实现PCA
from numpy import *
import matplotlib
import matplotlib.pyplot as plt

def loadDataSet(filename,delim='\t'):
    fr = open(filename)
    stringAttr = [line.strip().split(delim) for line in fr.readlines()]
    datAttr = [[float(x) for x in line] for line in stringAttr]
    return mat(datAttr)
def pca(dataSet,topNfeat=9999):
    meanVals = mean(dataSet,axis=0)
    meanRemoved = dataSet - meanVals
    covMat = cov(meanRemoved,rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat))
    eigValsInd = argsort(eigVals)
    eigValsInd = eigValsInd[:-(topNfeat+1):-1]
    redEigVects = eigVects[:,eigValsInd]
    lowDDataMat = meanRemoved*redEigVects
    reconMat = (lowDDataMat*redEigVects.T)+meanVals
    return lowDDataMat,reconMat
def plotData(dataSet,reconMat):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(dataSet[:,0].flatten().A[0],dataSet[:,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()

原始数据(蓝色)和降维数据的重构数据(红色)效果图:
1

(3)一般在处理前需要用平均值替换NaN(Not a Number)
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])
        datMat[nonzero(isnan(datMat[:,i].A))[0],i]=meanVal
    return datMat
(4)总结

PCA可以从数据中识别出其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值