标签:pow port nal ase 矩阵 注意 维度 sum form
00 个人总结
PCA(主成分分析法)目的:
1.降低特征间个数,减少的计算量
2.降低特征之间的相关性,使特征之间更加的独立
3.减少噪声对数据的影响,使模型更加的稳定
4.方便数据的可视化
简单步骤:
1.对数据进行零均值化处理
2.计算协方差矩阵
3.计算特征值和特征向量
4.找到n个特征值和对应的特征向量
5.将数据映射到n个特征向量的空间中实现降维
注意:
降维后的2维不是从原来的4维中选择了2维,而是在原来的4维中映射到了2维空间n中,数据会有一定的误差,至于丢多少这个以后在讨论吧
01numpy实现方法
import numpy as np from sklearn.datasets import load_iris # 加载数据集 iris = load_iris() data = iris.data #将数据0标准化 print(data[:5,:]) mean_val = np.mean(data,axis=0) print(mean_val) meaned_data = data - mean_val # 几乎都是0 十分的近似于0 print(‘Feature mean:‘,np.mean(meaned_data,axis=0)) print(‘\n‘,meaned_data[:5,:]) # [[4.1 3.5 1.4 0.2] # [4.9 3. 1.4 0.2] # [4.7 3.2 1.3 0.2] # [4.6 3.1 1.5 0.2] # [5. 3.6 1.4 0.2]] # [5.84333333 3.05733333 3.758 1.19933333] # Feature mean: [-1.12502600e-15 -7.60872846e-16 -2.55203266e-15 -4.48530102e-16] # 0,0,0,0, # [[-0.74333333 0.44266667 -2.358 -0.99933333] # [-0.94333333 -0.05733333 -2.358 -0.99933333] # [-1.14333333 0.14266667 -2.458 -0.99933333] # [-1.24333333 0.04266667 -2.258 -0.99933333] # [-0.84333333 0.54266667 -2.358 -0.99933333]]
# 计算协方差矩阵 cov_mat = np.cov(meaned_data,rowvar=False) print(‘Shape:‘,cov_mat.shape) print(cov_mat) #Shape: (4, 4) #[[ 0.68569351 -0.042434 1.27431544 0.51627069] # [-0.042434 0.18997942 -0.32965638 -0.12163937] # [ 1.27431544 -0.32965638 3.11627785 1.2956094 ] # [ 0.51627069 -0.12163937 1.2956094 0.58100626]]
# 计算特征值和特征向量 eig_vals,eig_vects = np.linalg.eig(np.mat(cov_mat)) print(‘特征值‘,eig_vals) print(‘特征向量‘,eig_vects) sorted_index = np.argsort(-eig_vals) # 对特征值从大到小排序 print(‘排序的索引‘,sorted_index) # 取最大的2个特征索引 topn_index = sorted_index[:2] print(‘最大的2个特征索引‘,topn_index) topn_vects = eig_vects[:,topn_index] # 最大的n个特征值对应的特征向量 print(‘最大的2个特征,对应的维特征向量\n‘,topn_vects) # 特征值 [4.22824171 0.24267075 0.0782095 0.02383509] # 特征向量 [[ 0.36138659 -0.65658877 -0.58202985 0.31548719] # [-0.08452251 -0.73016143 0.59791083 -0.3197231 ] # [ 0.85667061 0.17337266 0.07623608 -0.47983899] # [ 0.3582892 0.07548102 0.54583143 0.75365743]] # 排序的索引 [0 1 2 3] # 最大的2个特征索引 [0 1] # 最大的2个特征,对应的维特征向量 # [[ 0.36138659 -0.65658877] # [-0.08452251 -0.73016143] # [ 0.85667061 0.17337266] # [ 0.3582892 0.07548102]]
# 将数据映射降维 pca_data = meaned_data * topn_vects # 投影到低维空间 print(‘降低维度后的数据\n‘,pca_data[:5,:]) recon_data = (pca_data * topn_vects.T)+mean_val # 重构数据 print(‘还原后的数据\n‘,recon_data)
02 sklean 实现
# 使用sklean实现 from sklearn.decomposition import PCA # 压缩为2维数据 pca = PCA(n_components=2) print(‘模型:‘,pca) feature2 =pca.fit_transform(data) print(‘特征值的比例:‘,pca.explained_variance_ratio_) print(‘降维后的占比:‘,sum(pca.explained_variance_ratio_)) print(‘降维后的数据:\n‘,feature2[:5,:]) # 模型: PCA(copy=True, iterated_power=‘auto‘, n_components=2, random_state=None, # svd_solver=‘auto‘, tol=0.0, whiten=False) # 特征值的比例: [0.92461872 0.05306648] # 降维后的占比: 0.9776852063187949 # 降维后的数据: # [[-2.68412563 0.31939725] # [-2.71414169 -0.17700123] # [-2.88899057 -0.14494943] # [-2.74534286 -0.31829898] # [-2.72871654 0.32675451]]
标签:pow port nal ase 矩阵 注意 维度 sum form
原文地址:https://www.cnblogs.com/liu247/p/10993154.html