数学建模之主成分分析(PCA)

  • 主成分分析(PCA)

1.1 概述

主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们就可以达到数据降维的目的。

PCA从原始变量出发,通过旋转变化(原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。

PCA算法流程

1、按列计算数据集X的均值 和对数据进行去中心化处理,然后令

2、求解矩阵 的协方差矩阵,并将其记为

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

4、将特征值按照从大到小的排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵 

5、计算 ,即将数据集 投影到选取的特征向量上,这样就得到了我们需要的已经降维的k维数据集

PCA优缺点

优点

1、它是无监督学习,完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。

2、用PCA技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。

3、各主成分之间正交,可消除原始数据成分间的相互影响

缺点

1、用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。

2、贡献率小的主成分往往可能含有对样本差异的重要信息。

3、特征值矩阵的正交向量空间是否唯一有待讨论。

4、特征值分解有一些局限性,比如变换的矩阵必须是方阵。

5、在非高斯分布的情况下,PCA方法得出的主元可能并不是最优的,此时在寻找主元时不能将方差作为衡量重要性的标准。

Python中鸢尾花数据(PCA)

1.	import pandas as pd  
2.	import numpy as np  
3.	import matplotlib.pyplot as plt  
4.	from sklearn.decomposition import PCA  
5.	from sklearn.preprocessing import StandardScaler  
6.	from sklearn.datasets import load_iris  
7.	%matplotlib inline  
8.	  
9.	data = load_iris()  
10.	df1 = pd.DataFrame(data.data,columns=['sepal length', 'sepal width', 'petal length', 'petal width'])  
11.	df2 = pd.DataFrame(data.target,columns=["target"])  
12.	data = pd.concat([df1,df2],axis=1)  
13.	df = data.loc[:,'target'].to_frame()  
14.	data["target"] = df.replace({"target":{0:"Iris-setosa",1:"Iris-versicolor",2:"Iris-virginica"}})  
15.	  
16.	features = ['sepal length', 'sepal width', 'petal length', 'petal width']  
17.	# Separating out the features  
18.	x = data.loc[:, features].values  
19.	# Separating out the target  
20.	y = data.loc[:,['target']].values  
21.	# Standardizing the features  
22.	x = StandardScaler().fit_transform(x)  
23.	  
24.	# 查看标准化之后的数据  
25.	pd.DataFrame(data = x, columns = features)  
26.	#选择降维后的维数  
27.	pca = PCA(n_components=4)  
28.	principalComponents = pca.fit_transform(x)  
29.	pca.explained_variance_ratio_  
30.	  
31.	# 进行可视化  
32.	importance = pca.explained_variance_ratio_  
33.	plt.scatter(range(1,5),importance)  
34.	plt.plot(range(1,5),importance)  
35.	plt.title('Scree Plot')  
36.	plt.xlabel('Factors')  
37.	plt.ylabel('Eigenvalue')  
38.	plt.grid()  
39.	plt.show()  
40.	  
41.	# 进行降维  
42.	pca = PCA(n_components=2)  
43.	principalComponents = pca.fit_transform(x)  
44.	# 查看降维后的数据  
45.	principalDf = pd.DataFrame(data=principalComponents, columns=['principal component 1', 'principal component 2'])  
46.	finalDf = pd.concat([principalDf, data[['target']]], axis = 1)  
47.	finalDf  
48.	  
49.	# 对系数进行可视化  
50.	import seaborn as sns  
51.	df_cm = pd.DataFrame(np.abs(pca.components_), columns=data.columns[:-1])  
52.	plt.figure(figsize = (12,6))  
53.	ax = sns.heatmap(df_cm, annot=True, cmap="BuPu")  
54.	# 设置y轴的字体的大小  
55.	ax.yaxis.set_tick_params(labelsize=15)  
56.	ax.xaxis.set_tick_params(labelsize=15)  
57.	plt.title('PCA', fontsize='xx-large')  
58.	# Set y-axis label  
59.	#plt.savefig('factorAnalysis.png', dpi=200)  
60.	  
61.	fig = plt.figure(figsize = (8,8))  
62.	ax = fig.add_subplot(1,1,1)   
63.	ax.set_xlabel('Principal Component 1', fontsize = 15)  
64.	ax.set_ylabel('Principal Component 2', fontsize = 15)  
65.	ax.set_title('2 Component PCA', fontsize = 20)  
66.	  
67.	  
68.	targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']  
69.	colors = ['r', 'g', 'b']  
70.	for target, color in zip(targets,colors):  
71.	    indicesToKeep = finalDf['target'] == target  
72.	    # 选择某个label下的数据进行绘制  
73.	    ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']  
74.	               , finalDf.loc[indicesToKeep, 'principal component 2']  
75.	               , c = color  
76.	               , s = 50)  
77.	ax.legend(targets)  
78.	ax.grid()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王的傲骨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值