博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCA误差
阅读量:6480 次
发布时间:2019-06-23

本文共 1384 字,大约阅读时间需要 4 分钟。

我们知道,PCA是用于对数据做降维的,我们一般用PCA把m维的数据降到k维(k < m)。

那么问题来了,k取值多少才合适呢?

PCA误差

PCA的原理是,为了将数据从n维降低到k维,需要找到k个向量,用于投影原始数据,是投影误差(投影距离)最小。

这里写图片描述 

用公式来表示,如下

这里写图片描述

其中

  • m表示特征个数

分子表示原始点与投影点之间的距离之和,而误差越小,说明降维后的数据越能完整表示降维前的数据。如果这个误差小于0.01,说明降维后的数据能保留99%的信息。

k值选取的原理

实际应用中,我们一般根据上式,选择能使误差小于0.01(99%的信息都被保留)或0.05(95%的信息都被保留)的k值。

而在实际编码中,参考文章《详解主成分分析PCA》,在PCA的实现过程中,对协方差矩阵奇异值分解时,能得到S矩阵(特征值矩阵)。

PCA误差的表达式等效于下式

 

 
1k1Sim1Si0.011−∑1kSi∑1mSi≤0.01

 

从代码示例中,可以看出,将数据从三维降到二维,保留了99.997%的信息。

[U,S,V] = np.linalg.svd(sigma) # 奇异值分解(S[0]+S[1])/(S www.hbs90.cn/ www.boshenyl.cn [0]+S[1]+S[2]) # result = 0.99996991682077252
  • 1
  • 2
  • 3

实际使用

用sklearn封装的PCA方法,做PCA的代码如下。PCA方法参数n_components,如果设置为整数,则n_components=k。如果将其设置为小数,则说明降维后的数据能保留的信息。

from sklearn.decomposition import PCAimport numpy as npfrom sklearn.preprocessing import StandardScaler x=np.array([[10001,2,55],www.feihuanyule.com [16020,4,11], [12008,6,33], [13131,8,22]]) # feature normalization (feature scaling) X_scaler = StandardScaler() x = X_scaler.fit_transform(x) # PCA pca = PCA(n_components=0.9)# 保证降维后的数据保持90%的信息 pca.fit(x) pca.transform(x

所以在实际使用PCA时,我们不需要选择k,而是直接设置n_components为float数据。

总结

PCA主成分数量k的选择,是一个数据压缩的问题。通常我们直接将sklearn中PCA方法参数n_components设置为float数据,来间接解决k值选取问题。 

但有的时候我们降维只是为了观测数据(visualization),这种情况下一般将k选择为2或3。

参考

  • Andrew NG在coursera的机器学习课程
  • PCA的完整实现过程代码详解
  • http://stackoverflow.com/questions/33509074/sklearn-pca-calculate-of-variance-retained-for-choosing-k
你可能感兴趣的文章
正确认识和使用鲁班尺
查看>>
Linux学习之常用网络通信命令与shell简单应用技巧(四)
查看>>
阅读计数功能实现
查看>>
Python-递归实现
查看>>
webbench压力性能测试
查看>>
java StrutsTypeConverter的使用
查看>>
取出重复的客运车班次,两个字段的值互换视为重复值
查看>>
Android O编译前修改文件和目录权限
查看>>
n!素因子p的幂 swjtuOJ 2090【数论】
查看>>
UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-13串口功能调试
查看>>
设计模式状态
查看>>
day44-Celery异步分布式
查看>>
Android学习之Android studio TraceView和lint工具的使用具体解释
查看>>
python做var模型的滞后阶数怎么确定_请问关于VAR模型的滞后阶数怎么确定?
查看>>
java多线程理解_三个趣味故事,让你如何理解Java多线程!
查看>>
java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值
查看>>
active控件和java脚本_【学习笔记】在原生javascript中使用ActiveX和插件
查看>>
android lua调用java_android lua 在java 中的应用实例
查看>>
java concurrency 线程_JAVA CONCURRENCY EXECUTORS 介绍Java并发处理线程池
查看>>
java equals方法可变_Java性能优化(7):改写equals时遵守通用约定
查看>>