0x25 numpy實戰,PCA降維

00 我的總結dom

  PCA(主成分分析法)目的:spa

     1.下降特徵間個數,減小的計算量code

     2.下降特徵之間的相關性,使特徵之間更加的獨立component

     3.減小噪聲對數據的影響,使模型更加的穩定blog

     4.方便數據的可視化排序

  簡單步驟:索引

    1.對數據進行零均值化處理it

    2.計算協方差矩陣io

    3.計算特徵值和特徵向量class

    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)  # 初始化PCA模型
print('模型:',pca) pca.fit(data) # 訓練模型 feature2 = pca.transfrom(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]] 
相關文章
相關標籤/搜索