机器学习-主成分析PCA-2020-5-1

特征提取:

主成分分析(Principal Component Analysis)

许多变量之间可能存在相关性,从而增加了问题分析的复杂性,因此需要找到一个合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失。

 

例如:样本中有n维特征,特征之间可能存在相关性。如何去掉冗余特征!

如线性代数的中的: 向量组是线性相关的,其中一些向量可由这个向量组的极大无关组线性表示。主成分分析就属于这类降维(特征压缩)的方法

图像展示

 

具体步骤:

  1. 找出第一个主成分的方向,也就是数据方差最大的方向。(特征值最大)

  2. 找出第二个主成分的方向,也就是数据方差次大的方向,并且该方向与第一个主成分方向正交(orthogonal 如果是二维空间就叫垂直)。(第二大特征值)

  3. 通过这种方式计算出所有的主成分方向。

  4. 通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。

  5. 一旦得到了协方差矩阵的特征值和特征向量,我们就可以保留最大的 N 个特征。这些特征向量也给出了 N 个最重要特征的真实结构,我们就可以通过将数据乘上这 N 个特征向量 从而将它转换到新的空间上。

 PCA的应用范围:

1:数据压缩

2:数据可视化 (高维将低纬)

3:机器学习处理数据

PCA 优缺点

优点:降低数据的复杂性,识别最重要的多个特征。
        缺点:不一定需要,且可能损失有用信息。
        适用数据类型:数值型数据

实例:

1: 人工制造一个3维数据集,降维到2维平面上。

import numpy as npfrom sklearn.datasets import make_gaussian_quantilesimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = fig.add_subplot(111, projection='3d')# 产生一个 3维数据集x,y =make_gaussian_quantiles(n_samples=10,n_features=3,n_classes=3,random_state=None)#原始数据可视化ax.scatter(x[...,0],x[...,1],x[...,2],c=y)def meanX(data):    return np.mean(data,axis=0) #按列求均值def PCA(X,k):    """    X : 原始数据     k : 降到k维     return  : 降维的数据,和返回处理后的原始数据    """    average =maenX(X) #1:求均值    m,n = np.shape(X)     data_adjust = []    avgs =np.tile(average,(m,1))    data_adjust = avgs-X   # (X -maen)    covX = np.cov(data_adjust.T)  #协方差  (X-maen)(X-maen).T    feature,featureVector =np.linalg.eig(covX)  # 求特征值和特征向量    index = np.argsort(-feature)   # 特征值按从大到小顺序排序  排序下标    finalData = []    if k>n :        print('k must lower than feature number')        return     else:        selectVec = np.matrix(featureVector.T[index[:k]]) # 特征向量        finalData =  data_adjust*selectVec.T  # 降维        reconData =(finalData *selectVec)+average # 还原数据    return finalData ,reconDatadef plotData(data1):    dataArr1 = np.array(data1)    m = np.shape(dataArr1)[0]    axis_x1 = []    axis_y1 = []    for i in range(m):        axis_x1.append(dataArr1[i,0])        axis_y1.append(dataArr1[i,1])    fig = plt.figure()    ax = fig.add_subplot(111)    ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')    plt.xlabel('x1'); plt.ylabel('x2');    plt.show()    x1,x2 =PCA(x,2)plotData(x1)

2:IRIS数据集可视化

import pandas as pdfrom sklearn.datasets import load_iris #导入IRIS数据集 from sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import  PCAimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Diris = load_iris()  #特征矩阵data = iris.datax = StandardScaler().fit_transform(data) # 标准化数据target = iris.target  # 标签column_names =['sepal length', 'sepal width', 'petal length', 'petal width']# 原始数据集 特征是4维不能可视化df  =pd.DataFrame(x)df.columns =column_namesdf['species'] =target#pca 将数据降到3维,可视化pca3 = PCA(n_components=3)x_pca3 = pca3.fit_transform(x)fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(x_pca3[...,0],x_pca3[...,1],x_pca3[...,2],c=target)ax.grid()print('输出各个主成分所占比例')print(pca3.explained_variance_ratio_)#pca 处理后的数据集到2维,可以可视化pca = PCA(n_components=2) # pca 降维到2维x_pca= pca.fit_transform(x)  #pca降维处理print(pca.explained_variance_ratio_)df_pca = pd.DataFrame(data=x_pca,columns=['primary component1','primary compoment2'])df_pca['species'] =targetfig = plt.figure(figsize = (8,8))ax = fig.add_subplot(1,1,1) ax.set_xlabel('Principal Component 1', fontsize = 15)ax.set_ylabel('Principal Component 2', fontsize = 15)ax.set_title('2 component PCA', fontsize = 20)targets = [0,1,2]colors = ['r', 'g', 'b']for label,color in zip(targets,colors):    indices = df_pca['species'] ==label    ax.scatter(df_pca.loc[indices,'primary component1'],df_pca.loc[indices,'primary compoment2'],c=color,s=60)ax.legend(target)ax.grid()plt.show()

 

b站上浙江大学机器学习课程笔记:

 

Reference:

[1] https://zhuanlan.zhihu.com/p/55297233

[2] https://www.cnblogs.com/xingshansi/p/6445625.html

[3] https://blog.csdn.net/daaizjh/article/details/81065054

[4]https://www.bilibili.com/video/BV1dJ411B7ghfrom=search&seid=590519869570777855浙江大学-研究生机器学习课程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值