1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python 主成分分析法 PCA

Python 主成分分析法 PCA

时间:2019-12-06 05:05:03

相关推荐

Python 主成分分析法 PCA

主成分分析法是一种利用相关系数对数据进行降维的方法,可用于处理维数过多、指标意义不明确的数据。求相关系数的方法有很多种,下面只以协方差法为例

相关系数

输入是 shape 为 [sample, feature] 的原始数据,先对数据进行标准化,再求其协方差,即为各个维度之间的相关系数

import numpy as npdef standardize(data, axis=None):''' 标准化'''data = np.array(data)mean = np.mean(data, axis=axis, keepdims=True)std = np.std(data, axis=axis, keepdims=True)return (data - mean) / stddef association(data):''' 相关系数矩阵 (协方差矩阵)data: 形如 [n_sample, n_features] 的 array'''return np.cov(standardize(data, axis=0).T)

旋转降维矩阵

输入是上文中得到的相关系数矩阵 (行列数相同的方阵),求解特征方程之后按照每个特征向量的绝对值的最大值进行变号 (纯属强迫症),将特征值按降序排序 (对应的特征向量同步)。特征值之比即为贡献率之比,按照给定的累积贡献度阈值对主成分进行选定

def principal(asso, thresh=0.80):''' 主成分分析asso: 形如 [n_features, n_features] 的 arraythresh: 累积贡献率阈值return: 旋转降维矩阵'''cha_value, rota = np.linalg.eig(asso)max_idx = np.abs(rota).argmax(axis=0)sign = np.sign([c[i] for i, c in zip(max_idx, rota.T)])# 得到绝对值最大数的符号rota *= signindex = np.argsort(cha_value)[::-1]cha_value, rota = cha_value[index], rota[:, index]# 降序排序: 特征值、特征向量sum_contribute = np.cumsum(cha_value) / cha_value.sum()# 累计贡献率for idx, sum_con in enumerate(sum_contribute):if sum_con >= thresh:info_contribute = cha_value[:idx + 1] / cha_value.sum()# 取前 m 个主成分, 计算信息贡献率print(f'主成分贡献率: {info_contribute}\n')rota = rota[:, :idx + 1]return rota

实战:数据降维

import pandas as pddata = pd.read_excel("居民家庭人均全年消费性支出.xlsx")# 支出数据cost = data[data.columns[1:]]# 相关系数asso = association(cost)print(asso.shape)# 降维旋转矩阵: 城市发达程度rota = principal(asso)print(pd.DataFrame(rota, index=data.columns[1:]))# 对数据进行降维cost = np.array(cost @ rota)print(cost)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。