PCA,也就是主成分分析方法,是一种使用最为广泛的数据降维算法。鉴于它的广泛适用性,值得写一篇文章来探讨PCA的应用。主要内容有:
(1)使用PCA对数据的要求
(2)Sklearn中PCA的关键参数设置
(3)Sklearn中PCA的几个重要属性
(4)如何利用PCA数据绘制CCA图
本次实例使用的数据为云南省各市16个指标数据,此数据已经经过标准化。
1
PCA对数据的要求
一般来说,在机器学习范畴(PCA也是属于无监督学习算法一种),数据要求符合高斯分布(正态分布)且高信噪比。在笔者日常使用中,一般只关注将数据变换成正态分布即可。
如何对数据进行转换使之符合正态分布?常用的解决方案是z标准化,在python中实现的代码如下:
from sklearn import preprocessing #导入所需的方法
scaler = preprocessing.StandardScaler() #构建缩放对象
standarded = scaler.fit_transform(放入要转换的数据) #对数据进行转换
需要注意的是:利用StandardScaler进行数据变换是在列方向上。所以如果我们要对某个变量进行标准化,需要保持正确的方向,而不是在横向。
数据经过标准化会使得每一个变量平均值为0,方差为1,且大致符合正态分布。
import pandas as pd
import numpy as np
file = r"D:\公众号\standard.csv"
df = pd.read_csv(file, index_col = 0)
df = df.iloc[:, 2:] #读取第2列(含第2列)之后的所有列
arr = df.values #转为arr数组
#查看每一列的平均值和标准差
print('每一列的平均值为:{}'.format(np.mean(arr, axis = 0).round(3)))
print('每一列的标准差为为:{}'.format(np.std(arr, axis = 0)))
--结果--
每一列的平均值为:[ 0. 0. 0. 0. 0. -0. 0. 0. 0. -0. -0. 0. -0. -0. 0. -0. 0.]
每一列的标准差为为:[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
从输出结果可以看出,标准化后各变量均值为0,标准差为1。
上图是根据标准化后的数据对各变量绘制的密度曲线,可以发现经过标准化后大部分变量几乎符合正态分布,满足PCA的要求。(注:如何绘制密度曲线,可参考之前发布的文章:绘图合集链接中查询。)
2
sklearn的PCA关键参数设置
上一篇文章我们最后初步使用了PCA,在这里讨论一下它的语法:
from sklearn.decomposition import PCA
pca = PCA(n_components=None, copy=True, whiten=False, svd_solver="randomized")
pca_data = pca.fit_transform(要PCA的数据)
一般而言,我们只需要调整n_components参数即可。
n_components:具有两种含义,由参数值决定。如果值>1,则返回与n_components相同数量的特征。例如上一篇文章的n_components=2,则pca返回2个特征。如果值<1,意味着保留一定的信息量。例如n_components=0.8,表示保留80%的信息量。
copy:在运行算法时,是否复制一份数据,默认为True。
whiten:白化,使得每个特征具有相同的方差。
svd_solver:代表使用随机方法找到第一个主成分(这种方法通常较快)
再强调一下:一般我们只需要调节第一个参数即可,只调节第一个参数!!
3
PCA的几个重要属性
根据笔者的实际应用,常用的属性有:
(1)n_components_:保留主成分的个数
(2)explained_variance_ratio_:返回保留每个主成分的解释率
示例如下:
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
total_arr = df.values #将数据转为数组
pca_2 = PCA(n_components=0.85, whiten = True).fit(total_arr) #训练PCA模型
print('Components size: {}'.format(pca_2.n_components_)) #输出保留了多少主成分
print('Explained_variance_ratio_: {}'.format(pca_2.explained_variance_ratio_)) #查看保留主成分的解释率
--结果--
Components size: 3
Explained_variance_ratio_: [0.59176171 0.18274655 0.09456279]
可以看出,经过训练保留了3个主成分,第一主成分占比59.18%,第二主成分占比18.27%,第三主成分占比9.46%,累计信息解释率超过85%。
如何返回降维后的数据呢?解决方法是使用fit_transform即可。
pca = PCA(n_components = 0.85, whiten = True)
features_pca = pca.fit_transform(total_arr)
--结果--
[[ 3.45457931, 0.5442247 , 0.75115899],
[ 0.52741184, -1.06323932, -0.83949476],
[ 0.48032499, 0.61875184, -1.78683713],
[-0.34143744, -0.7429887 , -0.76538019],
[-0.16168941, -1.32179826, -0.3011803 ],
...
可以看出结果返回了降维后的变量,维数从原来的17维降到了3维。
4
利用PCA制作CCA图
什么是CCA图?
CCA广泛应用于微生物群落,用以表示微生物群落变化是受到什么环境因素影响。根据这句描述,我们可以认为它是一个描述因变量易受到哪些因素影响的可视化图。下图是一个CCA的例子:
CCA概念图(来源:CSDN)
我们可以看出,CCA图有着更为丰富和漂亮的展现效果。一般情况下,我们说明因变量的影响因素是通过多元分析来说明,而CCA图更直观展现了这点。
CCA图的组成元素与解读
坐标轴:代表主成分,x是第一主成分,y轴是第二主成分,以此类推
矢量箭头:代表环境要素,长度越长表示越重要。在x轴上投影代表对第一主成分的贡献;在y轴上投影代表对第二主成分的贡献
矢量夹角:夹角越小,环境要素之间的相关性越强。其中夹角的cos值是两个环境要素的相关系数。
样本点:降维后每一个点都有对应主成分的值,因此可以在图上绘制出。点之间的距离代表了它们之间的的相似性;矢量箭头在点与原点之间的连线投影越长,表示受该环境要素影响越大。
制作CCA图
制作CCA图需要有以下步骤:
(1)确定主成分个数:如果是2个主成分,采用二维平面坐标系;3个主成分,采用3维空间坐标系。
(2)样本降维后的数据:降维后的数据可以一对一地展现在2维或3维图上。通过点之间的距离可以判断它们的相似性。
(3)各变量对主成分的贡献量/权重:这一步是关键,每一个主成分可以看成是所有变量的线性组合,每个变量对主成分的贡献。
(4)矢量箭头绘制:例如两个主成分,每一个变量对这两个主成分都有一个贡献率,就可以确定变量在坐标图上的位置。确定位置后我们使用箭头命令进行绘制,即可得到矢量箭头。
pca_2 = PCA(n_components=0.85, whiten = True).fit(total_arr)
k1_spss = pca_2.components_ / np.sqrt(pca_2.explained_variance_.reshape(pca_2.n_components_, 1))
第(1)(2)的数据我们已经提及,上面两行代码是获取每一个变量对主成分的贡献率,有了它,我们就得到了(3)里的数据。(4)里的箭头绘制,可以参考matplotlib基础。
第一幅图左边的展示了前两个主成分在二维坐标的矢量箭头,右边的展示了样本点在主成分的位置。第二幅图对不同的变量扩大倍数和设色,并将样本点合并至一个图中,可以分析出不同成分主要受哪些因素影响,也可以看出城市的相似性等信息。同时也可以看出不同变量对主成分轴的贡献大小与它们之间的相关性。
THE END
本节主要介绍了PCA分析需要注意的参数设置和重要属性,并介绍了CCA的解读方法以及利用PCA实现CCA的步骤,为大家进行影响因素分析提供一定的思路。下一节继续介绍高维数据的可视化方法。
本文分享自 python数据可视化之美 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!