分享

0x25 numpy实战,PCA降维

 印度阿三17 2019-06-09

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]]

 

来源:http://www./content-4-233501.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多