1. 程式人生 > >PCA降維原理以及舉例

PCA降維原理以及舉例

將影象讀取之後,如若將每一個畫素點看做特徵,資料過於龐大和冗餘,同時為了速度和視覺化效果應先對讀取進來的資料進行降維處理。

1.1

消減維度的理由:

(1)大多數的模型在維度較小的情況下比較安全,多餘的特徵會影響或誤導學習器;

(2)更多的特徵需要調整更多的引數,容易產生過擬合;

(3)較少的維度資料集訓練速度快;

(4)實現資料視覺化時,大多限制在兩、三個維度上,更加體現降維的必要。

無法使用選擇方法刪減特徵,可以採用統計方法(PCA、LDA、MDS)降維。

1.2降維步驟:

(1)選擇特徵:刪除有明顯依賴關係的特徵。

(2)用篩選器檢測冗餘特徵:相關性(只針對線性關係),互資訊(針對非線性關係)。

具體判斷:

使用相關性進行篩選時,從資料序列出發,使用scipy.stats.pearsonr()函式進行相關係數計算,返回值為[相關性係數,P值],P值越大,越不可以相信所計算出的相關性係數。

互資訊從資料的分佈出發,引入資訊熵的概念。具有較高互資訊量的特徵對,刪掉其中一個特徵,計算量大。

(3)用封裝器讓模型選擇特徵:

篩選器扔掉看似沒有用處的特徵,但有時可能包含他效果更好,引進封裝器,在Sklearn.feature_selection包中RFE比較常用。

(4)其他特徵選擇方法---特徵抽取PCA,LDA,MDS

2PCA

線性方法,適用於分類和迴歸問題。在sklearn.decomposition中有PCA類。事先初始化PCA時無法指定n_components引數個數,將資料進行完全轉換,對資料擬合,呼叫explained_variance_ratio_,返回[最大方差方向的基向量的比例,次最大方差方向的比例],畫出此陣列圖(稱為Scree圖),在影象拐點處即為成分n_components個數—得出需要的成分數。引入非線性變換kernel pca解決非線性資料。

使用的函式:Numpy中linalg.eig()方法求解特徵值和特徵向量

2.2.2sklearn.decomposition.PCA介紹

(1)引數

n_components:降維後的特徵維度數

whiten :是否對降維後的資料的特徵歸一化(方差=1),預設false

svd_solver:即指定奇異值分解SVD的方法,‘auto’, ‘full’, ‘arpack’, ‘randomized’

(2)成員

explained_variance_:降維後的各主成分的方差值。方差值越大越重要 ;
explained_variance_ratio_:降維後各主成分的方差值佔總方差值的比例,比例越大越重要; 
components_ :返回具有最大方差的成分;
n_components_:返回所保留的成分個數n;

(3)物件方法

①Fit(X,y=None)

代表學習訓練(適用於無監督模型y標籤為none),函式返回值:呼叫fit方法的物件本身。比如pca.fit(X),表示用X對pca這個物件進行訓練。

④transform(X) 
將資料X轉換成降維後的資料(資料還原:x= (x_new *降維使用的U矩陣))

舉個例子:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from sklearn.datasets.samples_generator import make_blobs

from sklearn.decomposition import PCA

# X為樣本特徵,Y為樣本簇類別, 共1000個樣本,每個樣本3個特徵,共4個簇

X, y = make_blobs(n_samples=10000, n_features=3, centers=[[8,3, 3],         

      [0,0,0], [1,6,8], [2,2,2]], cluster_std=[0.4, 0.1, 0.2, 0.2],

      random_state =9)

fig = plt.figure()

ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)

plt.scatter(X[:, 0], X[:, 1], X[:, 2])

pca = PCA()

pca.fit(X)

print(pca.explained_variance_)

不喜勿噴,本人正在努力學習,哈哈