机器学习笔记(11)-PCA/SVD

来源:互联网 发布:淘宝网品牌羽绒服 编辑:程序博客网 时间:2024/06/05 17:30

利用PCA简化数据

降维技术

降维(dimensionality reduction):将百万像素点的数据,降至为三维的这个过程。
3种降维技术:
1,主成分分析(Principal Component Analysis, PCA):就是找出一个最主要的特征,然后进行分析。
2,因子分析(Factor Analysis):将多个实测变量转换为少数几个综合指标。它反映一种降维的思想,通过降维将相关性高的变量聚在一起,从而减少需要分析的变量的数量,而减少问题分析的复杂性。
3,独立成分分析(Independ Component Analysis, ICA):ICA 认为观测信号是若干个独立信号的线性组合,ICA 要做的是一个解混过程。

PCA

PCA 工作原理
1,找出第一个主成分的方向,也就是数据方差最大的方向。
找出第二个主成分的方向,也就是数据方差次大的方向,并且该方向与第一个主成分方向 正交(orthogonal 如果是二维空间就叫垂直)。
3,通过这种方式计算出所有的主成分方向。
4,通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
5,一旦得到了协方差矩阵的特征值和特征向量,我们就可以保留最大的 N 个特征。这些特征向量也给出了 N 个最重要特征的真实结构,我们就可以通过将数据乘上这 N 个特征向量 从而将它转换到新的空间上。
这里写图片描述

PCA实现与应用

方差:(一维)度量两个随机变量关系的统计量
协方差: (二维)度量各个维度偏离其均值的程度
协方差矩阵:(多维)度量各个维度偏离其均值的程度
1,当 cov(X, Y)>0时,表明X与Y正相关;(X越大,Y也越大;X越小Y,也越小。这种情况,我们称为“正相关”。)
2,当 cov(X, Y)<0时,表明X与Y负相关;
3, 当 cov(X, Y)=0时,表明X与Y不相关。
数据处理

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

这里写图片描述
将value为NaN的求均值

def replaceNanWithMean():    datMat = loadDataSet('input/13.PCA/secom.data', ' ')    numFeat = shape(datMat)[1]    for i in range(numFeat):        meanVal = mean(datMat[nonzero(~isnan(datMat[:, i].A))[0], i])  # 对value不为NaN的求均值;.A 返回矩阵基于的数组        datMat[nonzero(isnan(datMat[:, i].A))[0],i] = meanVal  # 将value为NaN的值赋值为均值    return datMat

PCA算法

def pca(dataMat, topNfeat=999999999):    '''    :param dataMat:原数据集矩阵(1000,2)    :param topNfeat:返回前N个特征    :return:        lowDDataMat:降维后数据集        reconMat:重构成原始数据    '''    meanVals = mean(dataMat, axis=0)  # 计算每一列的均值,每个向量同时都减去均值    meanRemoved = dataMat - meanVals    covMat = cov(meanRemoved, rowvar=0)  # 计算协方差    eigVals, eigVects = linalg.eig(mat(covMat))  # 计算协方差的特征值和特征向量    eigValInd = argsort(eigVals)  # 抽取前N个特征向量    eigValInd = eigValInd[:-(topNfeat + 1):-1]  # -1表示倒序,返回topN的特征值[-1 到 -(topNfeat+1) 但是不包括-(topNfeat+1)本身的倒叙]    redEigVects = eigVects[:, eigValInd]    lowDDataMat = meanRemoved * redEigVects # 将数据转换到上述N各特征向量构建的新空间    reconMat = (lowDDataMat * redEigVects.T) + meanVals    return lowDDataMat, reconMat

前6个主成分覆盖了数据96.8%的方差,如果只保留前6个,则实现100:1的压缩比
这里写图片描述

利用SVD简化数据

SVD概述与应用

奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征。从生物信息学到金融学,SVD 是提取信息的强大工具。
隐性语义索引:矩阵 = 文档 + 词语
最早的 SVD 应用之一,我们称利用 SVD 的方法为隐性语义索引(LSI)或隐性语义分析(LSA)。
这里写图片描述
推荐系统
1,利用 SVD 从数据中构建一个主题空间【由餐馆的菜和品菜师对这些菜的意见构成,】。
2,再在该空间下计算其相似度。(从高维-低维空间的转化,在低维空间来计算相似度,SVD 提升了推荐系统的效率。)
这里写图片描述
图像压缩
例如:32*32=1024 => 32*2+2*1+32*2=130(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。

SVD 原理

矩阵分解
这里写图片描述
1,上述分解中会构建出一个矩阵∑,该矩阵只有对角元素,其他元素均为0(近似于0)。另一个惯例就是,∑的对角元素是从大到小排列的。这些对角元素称为奇异值。
2,奇异值与特征值(PCA 数据中重要特征)是有关系的。这里的奇异值就是矩阵Data * Data^T)特征值的平方根。
3,,在某个奇异值的数目(r 个=>奇异值的平方和累加到总值的90%以上)之后,其他的奇异值都置为0(近似于0)。这意味着数据集中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。
代码实现

>>> from numpy import *>>> U,Sigma,VT = linalg.svd([[1,1],[7,7]])>>> Uarray([[-0.14142136, -0.98994949],       [-0.98994949,  0.14142136]])>>> Sigma  # 这里以行向量返回,而非矩阵array([  1.00000000e+01,   2.82797782e-16])>>> VTarray([[-0.70710678, -0.70710678],       [ 0.70710678, -0.70710678]])

如果Sigma只有前3个数值比其他的值大,则可以去掉其他值重构原始数据
这里写图片描述

>>> Sig3 = mat([[Sigma[0],0,0],[0,Sigma[1],0],[0,0,Sigma[2]])>>> U[:,:3]*Sig3*VT[:3,:]
原创粉丝点击