文章目录

  • 1. 降维方法
    • 1.1 投影
    • 1.2 流行学习
  • 2. 降维技术
    • 2.1 PCA
    • 2.2 增量PCA
    • 2.3 随机PCA
    • 2.4 核PCA
    • 2.5. 调参
    • 2.6 LLE
    • 2.7 其他方法

本文为《机器学习实战:基于Scikit-Learn和TensorFlow》的读书笔记。
中文翻译参考

  • 特征维度太大,降维加速训练
  • 能筛掉一些噪声和不必要的细节

更高维度的实例之间彼此距离可能越远,空间分布很大概率是稀疏的

1. 降维方法

1.1 投影


上图,三维空间中的点,都近似在灰色平面附近,可以投影到其上

  • 投影并不总是最佳的方法

1.2 流行学习

Manifold Learning
假设:在流形的较低维空间中表示,它们会变得更简单(并不总是成立)

  • 是否流行学习会更好,取决于数据集
  • 第一行的情况,展开后更好分类,第二行的则,直接一个面分类更简单

2. 降维技术

2.1 PCA

《统计学习方法》主成分分析(Principal Component Analysis,PCA)笔记

目前为止最流行的降维算法

  • 首先它找到接近数据集分布的超平面
  • 然后将所有的数据都投影到这个超平面上

  • 将数据投影到方差最大的轴(损失更少的信息)
  • 或者理解为,点到该轴的均方距离最小

矩阵的 SVD分解 可以帮助找到主成分

X_centered=X-X.mean(axis=0)
U,s,V=np.linalg.svd(X_centered)
c1=V.T[:,0]
c2=V.T[:,1]
  • sklearn 的 PCA 类使用 SVD 分解实现
from sklearn.decomposition import PCA
pca=PCA(n_components=2)
X2D=pca.fit_transform(X)
  • components_访问每一个主成分(它返回水平向量的矩阵,如果我们想要获得第一个主成分则可以写成pca.components_.T[:,0]

  • 方差解释率(Explained Variance Ratio),它表示位于每个主成分轴上的数据集方差的比例

print(pca.explained_variance_ratio_)
array([0.84248607, 0.14631839])
看出第二个轴上的比例为14.6%
  • 选择方差解释率占比达到足够(例如95%)的维度即可
pca=PCA()
pac.fit(X)
cumsum=np.cumsum(pca.explained_variance_ratio_)
d=np.argmax(cumsum>=0.95)+1
d为选取的主成分个数pca=PCA(n_components=0.95)
设置为小数,表明保留的方差解释率为0.95
X_reduced=pca.fit_transform(X)

2.2 增量PCA

对大型数据集友好,可在线使用

from sklearn.decomposition import IncrementalPCAn_batches=100
inc_pca=IncrementalPCA(n_components=154)
for X_batch in np.array_split(X_mnist,n_batches):inc_pca.partial_fit(X_batch)
X_mnist_reduced=inc_pca.transform(X_mnist)

注意:array_split()将数据分开,partial_fit(),部分 fit

X_mm=np.memmap(filename,dtype='float32',mode='readonly',shape=(m,n))
batch_size=m//n_batches
inc_pca=IncrementalPCA(n_components=154,batch_size=batch_size)
inc_pca.fit(X_mm)

使用np.memmap方法,就好像文件完全在内存中一样,后面可跟fit

2.3 随机PCA

可以快速找到前 d 个主成分的近似值

  • 它的计算复杂度是O(m×d2)+O(d3)O(m × d^2) + O(d^3)O(m×d2)+O(d3),而不是O(m×n2)+O(n3)O(m × n^2) + O(n^3)O(m×n2)+O(n3),所以当 d 远小于 n 时,它比之前的算法快得多
rnd_pca=PCA(n_components=154,svd_solver='randomized')
X_reduced=rnd_pca.fit_transform(X_mnist)

2.4 核PCA

from sklearn.decomposition import KernelPCArbf_pca=KernelPCA(n_components=2,kernel='rbf',gamma=0.04)
X_reduced=rbf_pca.fit_transform(X)

2.5. 调参

由于 kPCA 是无监督学习算法,没有明显的性能指标帮助选择参数

  • 使用网格搜索来选择最佳表现的核方法和超参数
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipelineclf = Pipeline([("kpca", KernelPCA(n_components=2)),("log_reg", LogisticRegression())
])
param_grid = [{"kpca__gamma": np.linspace(0.03, 0.05, 10),"kpca__kernel": ["rbf", "sigmoid"]}]
grid_search = GridSearchCV(clf, param_grid, cv=3)
grid_search.fit(X, y)

获得最佳参数

print(grid_search.best_params_)
{'kpca__gamma': 0.043333333333333335, 'kpca__kernel': 'rbf'}

还可以比较重构后的数据跟原始数据的误差来找最佳参数

rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433,fit_inverse_transform=True)
X_reduced = rbf_pca.fit_transform(X)
X_preimage = rbf_pca.inverse_transform(X_reduced)
from sklearn.metrics import mean_squared_error
mean_squared_error(X, X_preimage)
32.786308795766132

然后网格搜索最小误差的 核方法 和 超参数

2.6 LLE

局部线性嵌入(Locally Linear Embedding)是另一种非常有效的非线性降维(NLDR)方法,是一种流形学习技术

  • 它特别擅长展开扭曲的流形
from sklearn.manifold import LocallyLinearEmbeddinglle=LocallyLinearEmbedding(n_components=2,n_neighbors=10)
X_reduced=lle.fit_transform(X)

这个算法在处理 大数据集 的时候 表现 较差

2.7 其他方法

  • 多维缩放(MDS)在尝试保持实例之间距离的同时降低了维度
  • Isomap 通过将每个实例连接到最近的邻居来创建图形,然后在尝试保持实例之间的测地距离时降低维度
  • t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE)可以用于降低维​​度,同时试图保持相似的实例临近并将不相似的实例分开。
    它主要用于可视化,尤其是用于可视化高维空间中的实例(例如,可以将MNIST图像降维到 2D 可视化)
  • 线性判别分析(Linear Discriminant Analysis,LDA)实际上是一种分类算法,但在训练过程中,它会学习类之间最有区别的轴,然后使用这些轴来定义用于投影数据的超平面
    LDA 的好处是投影会尽可能地保持各个类之间距离,所以在运行另一种分类算法(如 SVM 分类器)之前,LDA 是很好的降维技术

[Hands On ML] 8. 降维相关推荐

  1. 92年的小哥,985的特聘教授:3年博士期间发表40篇SCI

    来源:知乎.个人主页等 转自:新智元(AI_era) 参考链接地址:https://www.zhihu.com/question/356327912 "90后"教授.博导越来越多, ...

  2. “985”最年轻的特聘教授惹争议: 曾3年拿下博士学位,期间发40余篇SCI

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看 图片来 ...

  3. php接收mq,php的mq客户端获取队列方法改造

    获取mq中消息然后处理失败重试机制: 下面的代码是php连接mq客户端的获取queue队列中的消息代码: public function createDurableSubscriber($queue, ...

  4. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  5. ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA)

    ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA) 目录 初步理解PCA 输出结果 核心代码 初步理解PCA #理解PCA:线性相关矩阵秩计算样例 import nump ...

  6. ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

    ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA ...

  7. 【ML】经典降维算法 t-SNE

    降维算法将高维数据集 X={x1,x2,⋯,xm}\mathbb{X}=\{\bm{x_1},\bm{x_2},\cdots,\bm{x_m}\}X={x1​,x2​,⋯,xm​} 转换到二维和三维数 ...

  8. ML (Chapter 10): 降维与度量学习

    本文为<机器学习>(周志华).<统计学习方法>(李航) 的读书笔记 参考 南瓜书 目录 kkk 近邻学习 (kkk NN) kkk 近邻算法 kkk 值的选择 距离度量 分类决 ...

  9. 【ML】_00_02_降维算法

    文章目录 [一] PCA(Principal Component Analysis,主要成分分析) [1.1] 斜方差公式(Cov\bm {Cov}Cov) [1.2] 构建斜方差矩阵 C\bm CC ...

最新文章

  1. 如何判断Customer和Administor
  2. MS SQL Server中的CONVERT日期格式化大全
  3. 《HeadFirst Python》第一章学习笔记
  4. c语言堆栈基本代码入栈出栈_c语言的简单的进栈出栈
  5. Python连接ActiveMQ的操作
  6. 时域信号matlab实现
  7. kalman filter卡尔曼滤波器- 数学推导和原理理解-----网上讲的比较好的kalman filter和整理、将预测值和观测值融和...
  8. 古典人物海报设计PSD分层模板,浓郁国风,展古典韵味
  9. ubuntu无法打开外接硬盘
  10. SQL Server 2017 新功能分享
  11. [原创]group by和compute 的使用
  12. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...
  13. 【bzoj1433】[ZJOI2009]假期的宿舍
  14. 如何应用quartz定时任务?
  15. (OK) 编译 cm-13-kiwi for (华为 荣耀 5X) - 成功
  16. AndroidCamera学习笔记一 硬件
  17. 软件需求说明书(文档模板)
  18. mysql l查看历史等锁信息_查看锁信息(开启InnoDB监控)
  19. pyqt5打包成exe可执行文件
  20. 带娃学Scratch----初识Scratch

热门文章

  1. 给未来的自己一封信计算机,给未来的自己的一封信范文(精选5篇)
  2. python大数据工程师 培训_大数据工程师学习之路
  3. c++调用Libsvm
  4. c中session的用法
  5. ftp服务器上传文件权限设置,ftp服务器 上传文件权限设置
  6. 驱动框架8——将驱动集成到内核中
  7. JSONObject,JSONArray,对象,数组互相转化
  8. 关于安卓手机在微信浏览器中无法调起相机的原因
  9. QT - 内存泄漏检测
  10. CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现