• 【笔记】使用PCA对数据进行降噪(理解)


    使用PCA对数据进行降噪(使用手写数字实例)

    (在notebook中)

    加载库并制作虚拟的数据并进行绘制

      import numpy as np
      import matplotlib.pyplot as plt
    
      X = np.empty((100,2))
      X[:,0] = np.random.uniform(0. ,100. , size=100)
      X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0. ,10. ,size=100)
    
      plt.scatter(X[:,0],X[:,1])
    

    图像如下

    这个数据集展现出来这样一个结果,但是实际情况是怎么样的呢,有没有可能其数据集就是一根直线,其数据的上下抖动其实是因为多种原因导致的噪音

    我们使用PCA这种方法将X降维成一维,再恢复成二维的数据,并绘制图像

      from sklearn.decomposition import PCA
    
      pca = PCA(n_components=1)
      pca.fit(X)
      X_reduction = pca.transform(X)
      X_restore = pca.inverse_transform(X_reduction)
    
      plt.scatter(X_restore[:,0],X_restore[:,1])
    

    图像如下(此时的数据就变成了一条直线)

    上面的过程可以理解成将数据的噪音去除了,当然,实际情况下,这不能说是一点噪音都没有,可以理解成,降低了维度,丢失了信息,同时也去除了部分噪音

    我们使用手写识别的例子来更加直观的看待这个操作

    我们使用手写数字数据集

      from sklearn import datasets
    
      digits = datasets.load_digits()
      X = digits.data
      y = digits.target
    

    重新创造一个具有噪音的数据集

      noisy_digits = X + np.random.normal(0,4,size=X.shape)
    

    为了更加直观的看到,我们绘制一下这些数字

    从样本中取出100个digits,称其为example_digits,初始的时候,在noisy_digits中y=0中取十个,然后进行循环从一到十,每一个都再从noisy_digits中取出y=num的十个,将这些样本和原来的样本垒在一起

      example_digits = noisy_digits[y==0,:][:10]
      for num in range(1,10):
          X_num = noisy_digits[y==num,:][:10]
          example_digits = np.vstack([example_digits,X_num])
    

    这样就有了含有100个的元素的,每个元素有64位的数据

      example_digits.shape
    

    结果如下

    绘制代码:

      def plot_digits(data):
          fig,axes = plt.subplots(10,10,figsize=(10,10),
                                   subplot_kw={'xticks':[],'yticks':[]},
          gridspec_kw=dict(hspace=0.1,wspace=0.1))
          for i,ax in enumerate(axes.flat):
              ax.imshow(data[i].reshape(8,8),
                        cmap='binary',interpolation='nearest',
                        clim=(0,16))
          plt.show()
    
      plot_digits(example_digits)
    

    图像如下

    然后我们使用PCA降噪,实例化然后取0.5,进行fit操作

      pca = PCA(0.5)
      pca.fit(noisy_digits)
    

    结果如下

    此时我们的保留数据维度为

      pca.n_components_
    

    结果如下

    然后对低维返回高维,再进行绘制

      components = pca.transform(example_digits)
      filtered_digits = pca.inverse_transform(components)
      plot_digits(filtered_digits)
    

    图像如下

    简单使用PCA来对图像进行降噪就完成了

  • 相关阅读:
    ShoreWall不错的Linux防火墙 规格严格
    数据挖掘 规格严格
    GLIBC 规格严格
    Solr/Lucene Wiki 规格严格
    Zope??? 规格严格
    用Apache htpasswd管理SVN帐户
    假装
    拼包函数及网络封包的异常处理(含代码)
    云计算
    云计算
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14302649.html
Copyright © 2020-2023  润新知