主成分分析
主成分分析的原理
主成分分析是将众多的变量转换为少数几个不相关的综合变量,同时不影响原来变量反映的信息,实现数学降维。
如何获取综合变量?
通过指标加权来定义和计算综合指标:
其中 \(X_1, X_2 ... X_n\) 是原来的指标, \(Y_1\) 是综合指标。\(a_{11}, a_{12} ... a_{1n}\) 是加权系数。\(a_{1j}\)反应了 \(X_j\) 随机变量对于 \(Y_1\) 随机变量的重要程度。
如何确定反应信息不受影响?
我们用方差来反应转换前后的随机变量所包含的信息。所以,如果要使 $ Y_1 $ 包含原变量的所有信息,则需要满足等式:
如果 \(Y_1\) 不能满足原变量所表示的信息,就构造一个 \(Y_2\) :
然后满足等式:
如果还不满足所i傲视的信息,就构造 \(Y_3\) ,依次类推,最多构造到 \(Y_n\) 一定会满足。
原因:若 $ X_i $ 都线性无关,则需要构造到 \(Y_n\) 才能满足,如果 $ X_i $ 线性相关,则构造 $ Y $ 的个数一定小于n。
一般的,我们并不需要完全满足,只需要满足85%以上即可(特殊需求除外)。假若构造k个变量能满足条件,则只需要:
变量之间的相关性可以从相关系数矩阵来考察。以上的工作就是将原变量的相关系数矩阵通过变化,使得变换后的变量的相关系数矩阵非对角线上的元素变为0。同时,原变量相关系数矩阵的特征值等于变换后的变量的相关系数矩阵对角线之和。
个人理解
非对角线上元素变为0表示变换后 $ Y_i $ 与 $ Y_j $ 元素互不相关( i 不等于 j )。
原变量相关系数矩阵的特征值等于变换后的变量的相关系数矩阵对角线之和表示方差之和等于原方差。
主成分分析的数学模型
设 $ p $ 维随机变量 $ X=(x_1, x_2, ... , x_p)^T $ ,其协方差矩阵为:
变量 $ x_1,x_2,...,x_p $ 经过线性变换后得到新的综合变量 $ Y_1,Y_2,...,Y_p $ ,即:
其中系数 $ l_i=(l_{i1},l_{i2},...,l_{ip})(i=1,2,...,p) $ 为常数向量。要满足以下条件:
则称 \(Y_1\) 为第一主成分, \(Y_2\) 为第二主成分,以此类推, \(Y_p\) 为第 \(p\) 个主成分。这里 \(l_{ij}\) 称为成分系数。
个人理解
(1) 中等于1的目的是为了让 \(X\) 变换到 \(Y\) 的过程中不会增加或者缺少信息,相当于乘以了一个单位向量。
(2) 中不同 \(Y\) 的协方差等于0表示转换后的向量之间两两相关性无关。
(3) 中将主成分从大到小排列是为了找到表示原来信息量最多的主成分。
主成分分析的性质与定理
个人理解
这个定理就是再用这组数据的协方差矩阵的特征向量和特征值求主成分和主成分的方差。
主成分:每一个单位正交特征向量就是x前面的系数。
方差:每一个单位特征向量对应的特征值就是它的方差。方差越大,贡献率越大。
定理 设 \(p\) 维随机变量 \(X\) 的协方差矩阵 \(\Sigma\) 的特征值满足 \(\lambda_1 \ge \lambda_2 \ge ... \ge \lambda_p\) ,响应的单位正交向量为 \(e_1, e_2, ... , e_p\) ,则 \(X\) 的第 \(i\) 个主成分为:
其中 \(e_i=(e_{i1},e_{i2},...e_{ip})^T\) ,且:
推论 若记 \(Y=(Y_1,Y_2,...,Y_p)^T\) 为主成分向量,矩阵 \(P=(e_1,e_2,...,e_p)\) ,则 \(Y=P^TX\) ,且 \(Y\) 的协方差矩阵为:
主成分的总方差为:
所以计算贡献率:
Python代码实现
代码如下:(别忘了使用前要归一化)
from sklearn.decompostition import PCA
pca = PCA(n_components=0.95) # 贡献率
pca.fit(data) # data 表示训练的数据
Y = pca.transform(data) # Y:表示主成分值的矩阵
tzxl = pca.components_ # 特征向量
tz = pca.explained_variance_ # 特征值
gxl = pca.explained_variance_ratio_ # 贡献率
根据主成分分析计算综合排名,综合排名公式如下:
其中 \(g_i\) 表示贡献率, \(Y_i\) 表示主成分。计算代码如下:
F = np.matmul(Y, gxl.T)
Rs = pd.Series(F, tag_list).sort_values(asending=False)
# tag_lis t表示对应的标签字符串矩阵 eg: [北京,上海,天津 ... ]