鱼C论坛

 找回密码
 立即注册
查看: 1539|回复: 0

[技术交流] 机器学习系列------PCA

[复制链接]
发表于 2018-6-23 11:26:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        PCA算法是属于SVD算法的一种,叫做Principal Component Analysis,是用于数据压缩用的。在真实情况下我们处理的数据都是相当大的,几亿甚至几十亿,数据的维度有上千维(就是上千个矩阵的列)。电脑处理起来非常慢,就需要降维。我们以MINIST数据为例介绍一下PCA算法,先把以前的代码复制过来(你的电脑目录下最好之前已经下载了MINIST数据集):
  1. from sklearn.datasets import fetch_mldata
  2. import numpy as np
  3. mnist=fetch_mldata('MNIST original',data_home='.\datasets\mldata')
  4. X,y=mnist["data"],mnist["target"]
  5. %matplotlib inline
  6. import matplotlib
  7. import matplotlib.pyplot as plt

  8. some_digit=X[36000]
  9. some_digit_imge=some_digit.reshape(28,28)
  10. plt.imshow(some_digit_imge,cmap=matplotlib.cm.binary,interpolation="nearest")
  11. plt.axis("off")
  12. plt.show()
复制代码

        输出的这张图是一个数字5,下面我们将所有的数据进行压缩:
  1. from sklearn.decomposition import PCA

  2. pca=PCA(n_components=144)
  3. X_minist_reduced=pca.fit_transform(X)
  4. X_minist_recovered=pca.inverse_transform(X_minist_reduced)
复制代码

        然后再画图:
  1. some_digit=X_minist_reduced[36000]
  2. some_digit_imge=some_digit.reshape(12,12)
  3. plt.imshow(some_digit_imge,cmap=matplotlib.cm.binary,interpolation="nearest")
  4. plt.axis("off")
  5. plt.show()
复制代码

        输出的这张图片是一张非常模糊的图片,如下:
sdfoisjoi.png
        原来是28*28的矩阵被我们压缩为14*14了,但是特征还是存在这张图片里,只是我们肉眼没法分辨而已,下面我们看看还原后的图片(以上代码里的第二个变量X_minist_recovered就是还原的数据):
  1. some_digit=X_minist_recovered[36000]
  2. some_digit_imge=some_digit.reshape(28,28)
  3. plt.imshow(some_digit_imge,cmap=matplotlib.cm.binary,interpolation="nearest")
  4. plt.axis("off")
  5. plt.show()
复制代码

        输出图片为:
sadasd.png
        比原图稍微有点模糊,因为这个压缩会有些误差的,叫做reconstruction error。
       
        如果我们进行大数据量的压缩,电脑没办法一次读取到内存中,就要使用以下方法进行压缩:
  1. from sklearn.decomposition import IncrementalPCA

  2. n_batches=100
  3. inc_pca=IncrementalPCA(n_components=144)
  4. for X_batch in np.array_split(X,n_batches):
  5.     inc_pca.partial_fit(X_batch)
  6. X_minist_reduced=inc_pca.transform(X)
复制代码

        然后画图:
  1. some_digit=X_minist_reduced[36000]
  2. some_digit_imge=some_digit.reshape(12,12)
  3. plt.imshow(some_digit_imge,cmap=matplotlib.cm.binary,interpolation="nearest")
  4. plt.axis("off")
  5. plt.show()
复制代码

        输出图片为:

        就跟上次的压缩效果一样。还有一种随机的压缩方式速度会快点:
  1. rnd_pac=PCA(n_components=144,svd_solver="randomized")
  2. X_reduced=rnd_pac.fit_transform(X)
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表