zoukankan      html  css  js  c++  java
  • 机器学习:PCA(降噪)

    一、噪音

    • 噪音产生的因素:可能是测量仪器的误差、也可能是人为误差、或者测试方法有问题等;
    • 降噪作用:方便数据的可视化,使用样本特征更清晰;便于算法操作数据;
    • 具体操作从 n 维降到 k 维,再讲降维后的数据集升到 n 维,得到的新的数据集为去燥后的数据集;
    • 降维X_reduction = pca.transform ( X )
    • 升维:X_restore = pca.inverse_transform ( X_reduction ),数据集 X_restore 为去燥后的数据集;

    二、实例

     1)例一

    • 模拟并绘制样本信息

      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, 5, size=100)
      
      plt.scatter(X[:, 0], X[:, 1])
      plt.show()

    1. 实际上,样本的状态看似在直线上下抖动式的分布,其实抖动的距离就是噪音;
    • 使用 PCA 降维,达到降噪的效果

    1. 操作:数据降维后,再升到原来维度;
    2. inverse_transform(低维数据):将低维数据升为高维数据
    3. from sklearn.decomposition import PCA
      
      pca = PCA(n_components=1)
      pca.fit(X)
      X_reduction = pca.transform(X)
      
      
      # inverse_transform(低维数据):将低维数据升为高维数据
      X_restore = pca.inverse_transform(X_reduction)
      
      plt.scatter(X_restore[:,0], X_restore[:,1])
      plt.show()

     2)例二(手写识别数字数据集)

    • 加载数据集(人为加载噪音:noisy_digits)
      from sklearn import datasets
      
      digits = datasets.load_digits()
      X = digits.data
      y = digits.target
      
      # 在数据集 X 的基础上创建一个带噪音的数据集
      noisy_digits = X + np.random.normal(0, 4, size=X.shape)
    • 从带有噪音的数据集 noisy_digits 中提出示例数据集  example_digits
      example_digits = noisy_digits[y==0,:][:10]
      for num in range(1, 10):
          X_num = noisy_digits[y==num,:][:10]
          # np.vstack([array1, array2]):将两个矩阵在水平方向相加,增加列数;
          # np.hstack([array1, array2]):将两矩阵垂直相加,增加行数;
          example_digits = np.vstack([example_digits, X_num])
      
      example_digits.shape
      # 输出:(100, 64)
    • 绘制示例数据集 example_digits(带噪音
      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', interpoltion='nearest',
                       clim=(0, 16))
      
          plt.show()
      
      
      plot_digits(example_digits)

    • 降噪数据集 example_digits
      # 如果噪音比较多,保留较少信息(此例中只保留 50% 的信息) 
      pca = PCA(0.5)
      pca.fit(noisy_digits)
      
      
      # 查看最终的样本维度
      pca.n_components_
      # 输出:12
      
      
      # 1)降维:将数据集 example_digits 降维,得到数据集 components
      components = pca.transform(example_digits)
      
      
      # 2)升维:将数据集升到原来维度(100, 64)
      filtered_digits = pca.inverse_transform(components)
      
      
      # 绘制去燥后的数据集 filtered_digits
      plot_digits(filtered_digits)

  • 相关阅读:
    编译 | 更新标准库_交叉编译工具链
    论文 | 图文_学科
    编码 | 二进制格式设计方案
    图片 | 图片上传管理
    进程 | 查询进程中包含多少线程
    第二周02:Fusion ICP逐帧融合
    exe文件当前目录搜索文件
    第一周:读取XML深度数据并将其重建为三维点云
    第二周:01 ICP迭代交互
    C++文件读写(转载)
  • 原文地址:https://www.cnblogs.com/volcao/p/9261228.html
Copyright © 2011-2022 走看看