PCA-数据降维实战

概述

数据降维是机器学习领域中非常重要的内容。降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。f可能是显式的或隐式的、线性的或非线性的。

目前大部分降维算法处理向量表达的数据,也有一些降维算法处理高阶张量表达的数据。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少 冗余信息 所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。

在很多算法中,降维算法成为了数据预处理的一部分,如PCA。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。

主成分分析(PCA)

主成分分析(principal component analysis)。在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复的次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,可以忽略余下的坐标轴,即对数据进行了降维处理。
PCA算法步骤:

1、输入:样本集D,低维空间维数d。

2、输出:投影矩阵W。

3、算法步骤:     对原始d维数据集做标准化

                            构造样本的协方差矩阵

                           计算协方差矩阵的特征值和相应的特征向量

                           选择与前k个最大特征值对应的特征向量,其中k为新特征空间维度(k<=d)

                           通过前k个特征向量构建映射矩阵W

                           通过映射矩阵W将d维的输入数据集X转换到新的k维特征子空间

python示例:

scikit-learn中提供了一个PCA类来实现PCA模型。其原型为:

class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

       n_components:一个整数,指定降维后的维数。如果为None,则选择它的值为min(n_samples, n_features)。

      copy:如果为false,则直接使用原始数据来训练,结果会覆盖原始数据所在的数组。

      white:如果为true,则会将特征向量除以n_samples倍的特征值,从而保证非相关输出方差为1。

加载的数据集是iris鸢尾花数据集。iris包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,所以iris数据集是一个150行5列的二维表。

通俗地说,iris数据集是用来给花做分类的数据集,每个样本包含了花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征(前4列),我们需要建立一个分类器,分类器可以通过样本的四个特征来判断样本属于山鸢尾变色鸢尾还是维吉尼亚鸢尾(这三个名词都是花的品种)。


# -*- coding: utf-8 -*-
"""
   降维PCA
"""
import numpy as np
import matplotlib.pyplot as plt
from sklearn import   datasets,decomposition

def load_data():
    '''
    加载用于降维的数据
    :return: 一个元组,依次为训练样本集和样本集的标记
    '''
    iris=datasets.load_iris()# 使用 scikit-learn 自带的 iris 数据集
    return  iris.data,iris.target
def plot_PCA(*data):
    '''
    绘制经过 PCA 降维到二维之后的样本点
    :param data: 可变参数。它是一个元组,这里要求其元素依次为:训练样本集、训练样本的标记
    :return: None
    '''
    X,y=data
    pca=decomposition.PCA(n_components=2) # 目标维度为2维
    pca.fit(X)
    X_r=pca.transform(X) # 原始数据集转换到二维
    ###### 绘制二维数据 ########
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    colors=((1,0,0),(0,1,0),(0,0,1),(0.5,0.5,0),(0,0.5,0.5),(0.5,0,0.5),
        (0.4,0.6,0),(0.6,0.4,0),(0,0.6,0.4),(0.5,0.3,0.2),) # 颜色集合,不同标记的样本染不同的颜色
    for label ,color in zip( np.unique(y),colors):
        position=y==label
        ax.scatter(X_r[position,0],X_r[position,1],label="target= %d"%label,color=color)
    ax.set_xlabel("X[0]")
    ax.set_ylabel("Y[0]")
    ax.legend(loc="best")
    ax.set_title("PCA")
    plt.show()
if __name__=='__main__':
    X,y=load_data() # 产生用于降维的数据集
    plot_PCA(X,y)   # 调用 plot_PCA

输出结果:

猜你喜欢

转载自blog.csdn.net/zqzq19950725/article/details/88684204
今日推荐