目录
关注我【生物海洋计算机支线】,获得更多生物海洋学,数据处理,作图等相关知识
主成分分析是一种降维方法
把多指标转化为几个综合指标
其目的在于通过较少的变量解释大部分的信息
首先啊
先进行简单的介绍
不求甚解 理解就好
之后
以鸢尾花数据为例观察主成分分布
并指出如何使用sklearn进行主成分分析
最后
来点数学
(该部分来自于司守奎老师的《python数学实验及建模》)
简单介绍
假如我们遇到一组数据,其中的数据仅有0和1两种
由于数据过于集中,方差则很小
说明数据离散程度低,携带有效信息少
PCA使用方差衡量信息量,实际的应用协方差矩阵进行判别
如何进行降维
假设有如下a、b两组数据,我们希望用一组数据来进行描述
a | b |
1 | 3 |
2 | 4 |
3 | 5 |
a的S²(方差)为 1 | b的S²(方差)也为 1 方差和为2
选择一组方差为2的数据进行描述
从图像的角度上来讲
原始的a、b数据表示为二维图像
将坐标轴进行旋转之后,就可以用一条线段来进行表示
数据描述:
现使用sklearn中自带的鸢尾花数据进行描述:
三个品种的鸢尾花在两两维度上的分布情况如图所示:
import plotly.express as px
df = px.data.iris()
# 数据中包含的特征向量
features = ["sepal_width", "sepal_length", "petal_width", "petal_length"]
fig = px.scatter_matrix(
df,
dimensions=features, #选择特征向量进行多维可视化
color="species" #选择需要进行分类的数据
)
fig.update_traces(diagonal_visible=False) #设置对角线不可见,有兴趣的可删掉后观察
fig.show()
进行PCA操作之后追踪结果,按照各个主成分查看区分类群结果
import plotly.express as px
from sklearn.decomposition import PCA
df = px.data.iris()
features = ["sepal_width", "sepal_length", "petal_width", "petal_length"]
pca = PCA() #实例化一个PCA方法
components = pca.fit_transform(df[features]) #对特征向量数据进行PCA操作
labels = {
str(i): f"PC {i+1} ({var:.1f}%)" #输出字符串第i个主成分的贡献率
for i, var in enumerate(pca.explained_variance_ratio_ * 100)
}
fig = px.scatter_matrix(
components,
labels=labels, #将贡献率设置为行列的标签
dimensions=range(4),
color=df["species"]
)
fig.update_traces(diagonal_visible=False) #设置对角线不显示,有兴趣可删除查看
fig.show()
可以发现PC1可以较好的区分物种,其他的均不能明显的进行分类
于是能得出PC1主成分可以很好的描述整组数据的结论
import plotly.express as px
from sklearn.decomposition import PCA
# 获取数据
df = px.data.iris()
features = ["sepal_width", "sepal_length", "petal_width", "petal_length"]
pca = PCA() #实例化一个PCA方法
md = pca.fit(df[features]) #对特征向量数据进行建模
print("查看各个主成分的贡献率",md.explained_variance_ratio_)
print("查看各个主成分的特征值",md.explained_variance_)
print("各个主成分的系数",md.components_)
------------------------------------------------------------------------------
查看各个主成分的贡献率 [0.92461621 0.05301557 0.01718514 0.00518309]
查看各个主成分的特征值 [4.22484077 0.24224357 0.07852391 0.02368303]
各个主成分的系数 [[-0.08226889 0.36158968 0.35884393 0.85657211]
[ 0.72971237 0.65653988 -0.07470647 -0.1757674 ]
[ 0.59641809 -0.58099728 0.54906091 0.07252408]
[-0.32409435 0.31725455 0.75112056 -0.47971899]]
通过查看主成分的系数
可以发现第2-4组数据起到了关键的作用
基本原理和步骤:
(来自于司守奎老师《python数学实验与建模》ppt课件)
或者简单的说,通过计算数据的协方差/相关系数矩阵的特征值和特征向量就可以得出前文结论
其中特征值的比值即是各主成分的贡献率
特征向量是各主成分的系数