机器学习(一)——降维 PCA(主成分分析)的理解

对数据进行简化的原因:

1.降维可以缓解维度灾难问题

2.降维可以降低很多算法的计算开销

3.降维可以使得结果易懂

4.理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解

PCA简介:

       在特征提取与处理时,涉及高维特征向量的问题往往容易陷入维度灾难。随着数据集维度的增加,算法学习需要的样本数量呈现指数级增加。有些应用中,遇到这样的大数据时非常不利的,而且从大数据集中学习需要更多的内存和处理能力。另外,随着维度的增加,数据的稀疏性会越来越高,在高维向量空间中探索数据集比在同样稀疏的数据集中探索更加困难。

       主成分分析(PCA)是一种用于探索高维数据结构的技术。PCA可以把具有相关性的高维变量合成线性无关的低维变量。新的低维数据集尽可能保留原始数据的变量。 

当数据集不同维度上的方差分布不均匀的时候,PCA最有用。(如果是一个球壳型数据集,PCA不能有效的发挥作用,因为各个方向上的方差基本相等。若一个维度没有丢失大量的信息的话,该维度一定不能忽略。)

在numpy中实现PCA:

将数据转换成前N个主成分的伪代码大致如下:

去除平均值

计算协方差矩阵

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

将特征值从大到小排序

保留最上面的N个特征向量

将数据转换到上述N个特征向量构建的新空间中

 

def pca(data,topNfeat):
    meanVals = np.mean(data,axis=0)  #求每一列(维度)得平均值
    meanRemoved = data - meanVals  
    covMat = np.cov(meanRemoved)  #计算协方差
    eigVals,eigVects = np.linalg.eig(mat(covMat))  #计算协方差得特征值、特征向量,返回的是元祖
    eigValInd = np.argsort(eigVals)  #从小到大对特征值进行排序,得到序列的下标
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #倒序索引出前topNfeat的特征值的序列的下标
    redEigVects = eigVects[:,eigValInd]  #得到前topNfeat特征值对应的特征向量
    lowDDataMat = meanRemoved * redEigVects  #相乘得到降维后的数据
    return lowDDataMat

sklearn中pca的实现: 

class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

PCA基本不需要调参,一般我们只需要指定降维到维度就可以,或者我们希望降维后的主成分方差占原始维度所有特征的方差的比例阈值就可以。

1. 参数说明

(1)n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。当然,我们还可以将参数设置为"mle", 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。

(2)copy:类型:bool,True或者False,缺省时默认为True。

意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。

2. 返回对象的属性

(1)components_ :返回具有最大方差的成分

(2)n_components_:返回所保留的成分个数n

(3)explained_variance_:返回所保留的n个成分各自的方差值

(4)explained_variance_ratio_:返回所保留的n个成分各自的方差百分比

3. pca对象的方法

(1)fit(X,y=None):因为pca是无监督学习算法,此处y自然等于None。fit(X)表示用数据X来训练pca模型

(2)fit_transform(X):用X来训练pca模型,同时返回降维后的数据。newX=pca.fit_transform(X),newX就是降维后的数据

(3)inverse_transform(newX):将降维后的数据抓换成原始数据,X=pca.inverse_transform(newX)

(4)transform(X):将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以使用transform方法降维

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

data = load_iris()
x = data.data
y = data.target
pca = PCA(n_components=2)
reduced_X = pca.fit_transform(x)

red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
for i in range(len(reduced_X)):
    if y[i] == 0:
        red_x.append(reduced_X[i][0])
        red_y.append(reduced_X[i][1])
    elif y[i] == 1:
        blue_x.append(reduced_X[i][0])
        blue_y.append(reduced_X[i][1])
    else:
        green_x.append(reduced_X[i][0])
        green_y.append(reduced_X[i][1])
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

                                        

降维的数据如上图所示,每个数据集中三个类都用不同的符号标记,从这个二维数据图中可以明显看出,有一个类与其他两个重叠的类完全分离,这个结果可以帮助选择分类模型。 

 

 

 

 

 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值