机器学习笔记(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,:]
- 机器学习笔记(11)-PCA/SVD
- 【机器学习笔记】SVD分解
- 笔记-SVD&PCA
- 机器学习实战——PCA和SVD
- 机器学习笔记_ 降维_3:SVD
- 机器学习算法 -- PCA 学习笔记
- 机器学习笔记_ 降维_2:PCA
- 机器学习笔记 —— PCA
- 机器学习实战——第十三/十四章:利用PCA和SVD来简化数据
- 机器学习算法面试—口述(6):数据的简化(PCA、SVD)
- 机器学习中的SVD
- 机器学习----SVD
- PCA SVD LDA --- Machine Learning笔记1
- SVD & PCA
- PCA,SVD
- 机器学习实战笔记——利用SVD简化数据
- 机器学习笔记二十 利用SVD简化数据
- 机器学习实战笔记-利用SVD简化数据
- 莫烦tensorflow教程笔记(五)
- HTML图片变(鼠标移上去变另一张)
- keil中flash download添加列表中没有的芯片flash型号的方法
- 多线程高并发
- 导弹拦截之升级版(1164)
- 机器学习笔记(11)-PCA/SVD
- python装饰器的十种用法
- 二叉树
- Android studio中指定查找路径
- java中的枚举和注解
- Tomcat6.0的安装和配置
- Linux下查看内核、CPU、内存及各组件版本的命令和方法
- 编程之旅-Ext4.X导入excel表格在grid中显示
- JSON.parse()和stringify()