特征向量、特征值以及降維方法(PCA、SVD、LDA)


一、特征向量/特征值

  Av = λv

  如果把矩陣看作是一個運動,運動的方向叫做特征向量,運動的速度叫做特征值。對於上式,v為A矩陣的特征向量,λ為A矩陣的特征值。

  假設:v不是A的速度(方向)

  結果如上,不能滿足上式的。

二、協方差矩陣

  方差(Variance)是度量一組數據分散的程度。方差是各個樣本與樣本均值的差的平方和的均值。

  協方差(Covariance)是度量兩個變量的變動的同步程度,也就是度量兩個變量線性相關性程度。如果兩個變量的協方差為0,則統計學上認為二者線性無關。而方差是協方差的一種特殊情況,即當兩個變量是相同的情況。

 

三、主成分分析法(PCA)

  特征降維一般有兩類方法:特征選擇和特征抽取。特征選擇即從高緯度的特征中選擇其中的一個子集來作為新的特征;而特征抽取是指將高緯度的特征經過某個函數映射至低緯度作為新的特征。常用的特征抽取方法就是PCA。主成分分析法(PCA)是常用的一種降維方法。對於正交屬性空間中的樣本點,如何用一個超平面對所有的樣本進行恰當的表達?

    1、最近重構性,樣本到這個超平面的距離都足夠近

    2、最大可分性,樣本點到這個超平面上的投影能盡可能分開

  首先:假設數據樣本進行了中心化(對所有樣本進行中心化,對每個維度減去這個維度的數據均值),假設投影變換得到的新坐標系為{w1,w2,...,wi},W為標准正交向量基,||wi||2=1,wiTwj=0(i!=j),對於樣本點xi到超頻面的投影為WTxi,若所有樣本點的投影盡可能分開,則投影后的樣本點方差應該最大。

  投影后的方差:∑WTxixiTW,於是目標函數為:

  max  WTXXTW       s.t. WTW=I

  等價 min (-max)

  采用拉格朗日乘子法:

  F = -WTXXTW +λ(I-WTW)

  ∂F/∂W = 0  推導出:

  XXTwi = λiwi

  此時,只要對協方差XXT 進行特征值分解,求得特征值以及特征向量的排序,λ1 ≥λ2  ....  λi,對應的W的排序就為主成分分析的解。

  實際上,PCA主成分分析的求解或者說解釋是通過拉格朗日乘子法進行推到的,只不過求解結果可以通過求解特征值的形式進行求解。而從特征值的角度來看,特征值和特征向量反映了協方差的變化規律。

 四、PCA流程

  • 對數據去中心化
  • 計算XXT,注:這里除或不除樣本數量MM1其實對求出的特征向量沒影響
  • XXT進行特征分解
  • 選取特征值最大的幾個維度進行數據映射。(去掉較小的維度)

  下面,可以通過代碼看PCA降維如何操作的:

import numpy as np
from sklearn.decomposition import PCA
#零均值化
def zeroMean(dataMat):      
    meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各個特征的均值
    newData=dataMat-meanVal
    return newData,meanVal
 
def pca(dataMat,n):
    newData,meanVal=zeroMean(dataMat)
    covMat=np.cov(newData,rowvar=0)    #求協方差矩陣,return ndarray;若rowvar非0,一列代表一個樣本,為0,一行代表一個樣本
    
    eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一個特征向量
    #print(eigVals)
    #argsort將x中的元素從小到大排列,提取其對應的index(索引)
    eigValIndice=np.argsort(eigVals)            #對特征值從小到大排序
    #print(eigValIndice)
    n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n個特征值的下標
    n_eigVect=eigVects[:,n_eigValIndice]        #最大的n個特征值對應的特征向量
    lowDDataMat=newData*n_eigVect               #低維特征空間的數據
    reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重構數據
    return lowDDataMat,reconMat

dataMat = np.array([i for i in range(100)]).reshape(10,10)

data ,mat = pca(dataMat,2)
print(data)
p = PCA(n_components=2)
main_vector = p.fit_transform(dataMat)
print(main_vector)

  如上,可以看到PCA的實現過程,但是我們自己實現的PCA的結果和sklearn實現的結果不一樣,是因為sklearn中的PCA實際上是通過SVD實現的。

五、奇異值分解(SVD)

  奇異值分解是一種重要的矩陣分解方法。

  假設A是一個mxn的矩陣,則存在一個分解使得

  Amn = UmmmnVnnT

  與特征值、特征向量概念相對應,則:

  ∑對角線上的元素成為矩陣A的奇異值,U和V稱為A的左右奇異向量矩陣。

  左奇異向量用於壓縮行,右奇異向量壓縮列。壓縮方法均是取奇異值較大的左奇異向量或者右奇異向量與原數據C相乘。

 

  PCA是從特征方向去降維,而SVD從特征和實例兩個方向降維。

  SVD計算過程:假設原數據為X,一行代表一個樣本,列代表特征。

    1)計算X'X,XX';

    2)對XX'進行特征值分解,得到的特征向量組成u,lambda_u;

    3)對X'X進行特征值分解,得到的特征向量組成v,lambda_v;

    4)lambda_u,lambda_v的重復元素開方組成對角矩陣sigma主對角線上的元素;

六、LDA降維方法

  LDA(線性判別分析)是一種基於分類模型進行特征屬性合並的操作,是一種有監督的降維方法。 在sklearn中本質就是SVD分解的左奇異矩陣乘以原來的矩陣,達到降實例的目的。該過程可以通過k-means同樣實現。

   LDA用於分類問題:

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
y = np.array([1, 1, 1, 2, 2, 2])
clf = LinearDiscriminantAnalysis()
clf.fit(X, y)
print(clf.predict([[-0.8, -1]]))

  

  LDA用於降維:

lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,y)
X_new = lda.transform(X)

  

七、PCA與LDA對比以及應用場景

  PCA與LDA效果對比可以參考:http://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_lda.html#sphx-glr-auto-examples-decomposition-plot-pca-vs-lda-py

  

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_classification
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# X1為樣本特征,Y1為樣本類別輸出, 共400個樣本,每個樣本3個特征,輸出有3個類別,沒有冗余特征,每個類別一個簇
X, Y = make_classification(n_samples=400, n_features=3, n_redundant=0,
                             n_clusters_per_class=1, n_classes=3,random_state = 7)
fig = plt.figure()
ax = Axes3D(fig)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],linewidths=5,marker='o',c=Y)
plt.show()

# PCA降維
pca = PCA(n_components=2)
pca.fit(X)
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=Y)
plt.show()

#LDA降維
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,Y)
X_new = lda.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=Y)
plt.show()

 

  

PCA

LDA

 

 

  PCA映射是一種將高維數據合並到低維的過程,樣本具有更大的發散性;LDA考慮了樣本的標注,即希望投影后,不同類別之間的距離最大,可以用於降維和分類

  •   一般情況下,有類別信息時,可以采用LDA
  •   無類別信息,不知道樣本屬於哪個類,用PCA

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM