日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PCA降维简介

發(fā)布時間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCA降维简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

PCA全稱為principal component analysis,即主成成分分析,用于降維。對數(shù)據(jù)進行降維有很多原因。比如:

?????? 1:使得數(shù)據(jù)更易顯示,更易懂

?????? 2:降低很多算法的計算開銷

?????? 3:去除噪聲

一:基本數(shù)學概念

1:方差

均值太簡單了,不說了。方差是各個數(shù)據(jù)分別與其和的平均數(shù)之差的平方的和的平均數(shù),用字母D表示。計算公式如下:

? (少了個平方)

?其中x-為均值,也可以表示為EX,則方差計算又可寫成:


2:協(xié)方差及協(xié)方差矩陣

協(xié)方差用于衡量兩個變量的總體誤差情況,可以說方差是協(xié)方差的一種特殊情況,即當兩個變量是相同的情況

計算公式:


而協(xié)方差矩陣是一個矩陣,其每個元素是各個向量元素之間的協(xié)方差。是從標量隨機變量到高維度隨機變量的自然推廣。

計算公式:


二:PCA的概念簡介

主成分分析?(?Principal ComponentAnalysis,?PCA)或者主元分析。是一種掌握事物主要矛盾的統(tǒng)計分析方法,它可以從多元事物中解析出主要影響因素,揭示事物的本質(zhì),簡化復雜的問題。計算主成分的目的是將高維數(shù)據(jù)投影到較低維空間。給定n個變量的?m?個觀察值,形成一個m*n的數(shù)據(jù)矩陣,?n通常比較大。對于一個由多個變量描述的復雜事物,人們難以認識,那么是否可以抓住事物主要方面進行重點分析呢?如果事物的主要方面剛好體現(xiàn)在幾個主要變量上,我們只需要將這幾個變量分離出來,進行詳細分析。但是,在一般情況下,并不能直接找出這樣的關(guān)鍵變量。這時我們可以用原有變量的線性組合來表示事物的主要方面,?PCA就是這樣一種分析方法。

PCA?主要用于數(shù)據(jù)降維,對于一系列例子的特征組成的多維向量,多維向量里的某些元素本身沒有區(qū)分性,比如某個元素在所有的例子中都為1,或者與1差距不大,那么這個元素本身就沒有區(qū)分性,用它做特征來區(qū)分,貢獻會非常小。所以我們的目的是找那些變化大的元素,即方差大的那些維,而去除掉那些變化不大的維,從而使特征留下的都是“精品”,而且計算量也變小了。

一個簡單的例子:

??????對于一個訓練集,100個對象模板,特征是10維,那么它可以建立一個100*10的矩陣,作為樣本。求這個樣本的協(xié)方差矩陣,得到一個10*10的協(xié)方差矩陣,然后求出這個協(xié)方差矩陣的特征值和特征向量,應該有10個特征值和特征向量,我們根據(jù)特征值的大小,取前四個特征值所對應的特征向量,構(gòu)成一個10*4的矩陣,這個矩陣就是我們要求的特征矩陣,100*10的樣本矩陣乘以這個10*4的特征矩陣,就得到了一個100*4的新的降維之后的樣本矩陣,每個特征的維數(shù)下降了。

??????當給定一個測試的特征集之后,比如1*10維的特征,乘以上面得到的10*4的特征矩陣,便可以得到一個1*4的特征,用這個特征去分類。

??????以上概念均來自于百度百科—解釋的非常清楚。

三:PCA在matlab中的計算

??????這部分主要如何在matlab中對數(shù)據(jù)進行降維,主要包括兩種方法,傳統(tǒng)步驟為先求該矩陣(m*n)的協(xié)方差矩陣,然后求出協(xié)方差矩陣的特征值和特征向量,此時用原數(shù)據(jù)乘以特征向量就可以實現(xiàn)降維了。另外一種方法就是通過奇異值分解進行求解,這也是Andrew Ng的教學視頻求解方法。這兩種方法本質(zhì)上是一樣的。

??????一般情況下,對于給定的樣本數(shù)據(jù),我們需要對數(shù)據(jù)進行mean normalization and feature scaling.這里我們先利用matlab函數(shù)進行pca操作而不進行數(shù)據(jù)預處理,之后再介紹數(shù)據(jù)預處理方法和利用預處理后的數(shù)據(jù)進行降維處理。

1:Matlab中函數(shù)描述:<來自百度百科>

COEFF = princomp(X)performs principalcomponents analysis (PCA) on the n-by-p data matrix X, and returns theprincipal component coefficients, also known as loadings. Rows of X correspondto observations, columns to variables. COEFF is a p-by-p matrix, each columncontaining coefficients for one principal component. The columns are in orderof decreasing component variance.

在n行p列的數(shù)據(jù)集X上做主成分分析。返回主成分系數(shù)。X的每行表示一個樣本的觀測值,每一列表示特征變量。COEFF是一個p行p列的矩陣,每一列包含一個主成分的系數(shù),列是按主成分變量遞減順序排列。(按照這個翻譯很難理解,其實COEFF是X矩陣所對應的協(xié)方差陣V的所有特征向量組成的矩陣,即變換矩陣或稱投影矩陣,COEFF每列對應一個特征值的特征向量,列的排列順序是按特征值的大小遞減排序)

princomp centers X by subtracting off column means, but does notrescale the columns of X. To perform principal components analysis withstandardized variables, that is, based on correlations, useprincomp(zscore(X)). To perform principal components analysis directly on acovariance or correlation matrix, use pcacov.

計算PCA的時候,MATLAB自動對列進行了去均值的操作,但是并不對數(shù)據(jù)進行規(guī)格化,如果要規(guī)格化的話,用princomp(zscore(X))。另外,如果直接有現(xiàn)成的協(xié)方差陣,用函數(shù)pcacov來計算。<這里的規(guī)格化我們在后面介紹>

[COEFF,SCORE] = princomp(X)returnsSCORE, the principal component scores; that is, the representation of X in theprincipal component space. Rows of SCORE correspond to observations, columns tocomponents.

返回的SCORE是對主分的打分,也就是說原X矩陣在主成分空間的表示。SCORE每行對應樣本觀測值,每列對應一個主成份(變量),它的行和列的數(shù)目和X的行列數(shù)目相同。(SCORE就是原數(shù)據(jù)集減去均值然后再乘以特征向量后的結(jié)果,即我們需要的數(shù)據(jù))

[COEFF,SCORE,latent] = princomp(X)returnslatent, a vector containing the eigenvalues of the covariance matrix of X.

返回的latent是一個向量,它是X所對應的協(xié)方差矩陣的特征值向量。

[COEFF,SCORE,latent,tsquare] = princomp(X)returns tsquare, which contains Hotelling's T2 statistic foreach data point.

返回的tsquare,是表示對每個樣本點Hotelling的T方統(tǒng)計量(我也不很清楚是什么東東)。

The scores are the data formed by transforming the original datainto the space of the principal components. The values of the vector latent arethe variance of the columns of SCORE. Hotelling's T2 is a measure of themultivariate distance of each observation from the center of the data set.

所得的分(scores)表示由原數(shù)據(jù)X轉(zhuǎn)變到主成分空間所得到的數(shù)據(jù)。latent向量的值表示SCORE矩陣每列的方差。Hotelling的T方是用來衡量多變量間的距離,這個距離是指樣本觀測值到數(shù)據(jù)集中心的距離。

When n <= p, SCORE(:,n:p) and latent(n:p) are necessarilyzero, and the columns of COEFF(:,n:p) define directions that are orthogonal toX.

[...] = princomp(X,'econ')returnsonly the elements of latent that are not necessarily zero, and thecorresponding columns of COEFF and SCORE, that is, when n <= p, only thefirst n-1. This can be significantly faster when p is much larger than n.

當維數(shù)p超過樣本個數(shù)n的時候,用[...] = princomp(X,'econ')來計算,這樣會顯著提高計算速度(比如當樣本數(shù)為10,n為30000時,此時得到的協(xié)方差矩陣為30000*30000,計算速度會非常慢,用此函數(shù)會快很多)

(1):舉例

[plain]?view plaincopyprint?
  • load?hald;?%其中ingredients?為matlab自帶??
  • [pc,?score,?latent,tsquare]=princomp(ingredients);?%?調(diào)用pca分析函數(shù)??
  • ingredients,?pc,score,?latent???%顯示其結(jié)果??pc為特征向量?latent為特征值?score為最終結(jié)果??


  • [plain]?view plaincopyprint?
  • %驗證latent?pca確實為ingredients的特征值和特征向量??
  • %?計算ingredients協(xié)方差矩陣??
  • cov_ingredients?=?cov(ingredients);??%?計算協(xié)方差??
  • [V,D]=eig(cov_ingredients);????%?得到特征向量V和特征值D??

  • [plain]?view plaincopyprint?
  • %驗證score確實為原數(shù)據(jù)集減去均值后乘以特征向量的結(jié)果,即我們最終需要的結(jié)果??
  • x0=bsxfun(@minus,?ingredients,?mean(ingredients,1));?%計算去除平均之后的結(jié)果??
  • score_validation?=?x0*pc;??

  • (2):降維數(shù)目k的確定

    我們一般需要計算特征向量的貢獻率來確定最終降維的數(shù)目k,貢獻率即最前面的k個特征值所占的比重大于90%(不是定值)以上即可。Matlab中使用以下函數(shù)

    [plain]?view plaincopyprint?
  • %求貢獻率?降維數(shù)目k??
  • cumsum(latent)./sum(latent)??
  • ?

    2:數(shù)據(jù)預處理

    一般的樣本數(shù)據(jù)差異都很大,因此對結(jié)果的影響很大。因此一般都需要對數(shù)據(jù)進行meannormalization and feature scaling.以下為數(shù)據(jù)預處理的兩種常用方法

    ?

    (1)min-max標準化(Min-Max Normalization)

    也稱為離差標準化,是對原始數(shù)據(jù)的線性變換,使結(jié)果值映射到[0 - 1]之間。轉(zhuǎn)換函數(shù)如下:

    其中max為樣本數(shù)據(jù)的最大值,min為樣本數(shù)據(jù)的最小值。這種方法有個缺陷就是當有新數(shù)據(jù)加入時,可能導致max和min的變化,需要重新定義。

    ?

    (2)Z-score標準化方法

    這種方法給予原始數(shù)據(jù)的均值(mean)和標準差(standard deviation)進行數(shù)據(jù)的標準化。經(jīng)過處理的數(shù)據(jù)符合標準正態(tài)分布,即均值為0,標準差為1,轉(zhuǎn)化函數(shù)為:

    其中mu為所有樣本數(shù)據(jù)的均值,sigm為所有樣本數(shù)據(jù)的標準差。

    對于Z-score標準化方法,matlab中直接使用zscore(X)就可以返回X-score預處理的結(jié)果。min-max歸一化:mapminmax(X,0, 1);?這樣就可以了。(mapminmax是版本的一個bug,建議自己寫代碼)。

    如:

    [plain]?view plaincopyprint?
  • %歸一化代碼(0,1)??
  • A?=?[1,2,3,4;5,6,7,8];??
  • min_A?=?min(A);??
  • A_norm?=?bsxfun(@minus,?A,?min_A);??
  • max_A?=?max(A);??
  • min_A?=?min(A);??
  • A_result?=?bsxfun(@rdivide,?A_norm,?max_A-min_A);??
  • 3:pca的計算方法——針對Z-score標準化的結(jié)果

    這里特地針對的是Z-score歸一化的結(jié)果,因為Z-score歸一化后數(shù)據(jù)的均值為0,此時我們發(fā)現(xiàn)用princomp和svd得到的結(jié)果是一樣的。

    (1).直接將上面改為[pc,score, latent, tsquare]princomp(zscore(ingredients));注意這里的score為直接使用zscore(ingredients)*pc得到的結(jié)果,沒有減去均值了。(不適合mapminmax歸一化)


    (2)奇異值分解(svd)

    奇異值分解,也是先求數(shù)據(jù)集的協(xié)方差,然后用svd對協(xié)方差進行分解,其中S即為特征向量,V即為特征值。

    [plain]?view plaincopyprint?
  • %奇異值分解??
  • X?=?zscore(ingredients);????
  • cov_ingredients_svd?=?(X'*X)./12;???%??這里得到結(jié)果和cov(zscore(ingredients))得到的結(jié)果是一樣的。??
  • [S,V,D]?=?svd(cov_ingredients_svd);??
  • 上面求得的結(jié)果是一樣的。

    按照奇異值分解的定義,S是cov_ingredients_svd*cov_ingredients_svd‘的特征向量,但我們也會發(fā)現(xiàn)其是X'*X的特征向量(怎么證明見下面鏈接),D是S的轉(zhuǎn)置。。。。

    當然我們可以直接[s,v,d]=svd(X) 得到的d就是X’*X的特征向量。你還會發(fā)現(xiàn)其實現(xiàn)在的V就是主方向上的向量表示Xrot = X*S所對應的協(xié)方差矩陣,且是對角矩陣

    詳細見:http://blog.csdn.net/lu597203933/article/details/46423711

    注意:這里svd針對的z-score歸一化的結(jié)果,其實不歸一化,得到特征值、特征向量與用princomp(ingredients)得到的結(jié)果也是一樣的。這里采用z-score只是仿造了Andrew Ng的結(jié)果。

    當數(shù)據(jù)滿足Z-score歸一化時:

    用得到的結(jié)果就是協(xié)方差。

    4:降維結(jié)果

    對于數(shù)據(jù)源X為m*n的矩陣,其中m為樣本數(shù),n為特征數(shù),此時我們保留特征向量pc或者S的前k列,然后使用X乘以它就將X變?yōu)榱薽*k列了。即Ureduce=U(:,1:k);Z = X*Ureduce

    5:重構(gòu)

    由于U是正定矩陣,即ATA=E,所以Xapprox=Z*UreduceT(UreduceT為Ureduce的轉(zhuǎn)置)

    ?

    注意:(1)一般來說,PCA降維后的每個樣本的特征的維數(shù),不會超過訓練樣本的個數(shù),因為超出的特征是沒有意義的。

    因為降維其實就是轉(zhuǎn)換到其他的樣本空間重新表示特征, 對于30個樣本, 29個維度已經(jīng)足以表示所有的30個樣本, 這樣的話用29個維度和80個維度, 理論上來說沒有區(qū)別,因為后邊的超過30的維度都是浪費的。

    (2)如果你需要對測試樣本降維,一般情況下,使用matlab自帶的方式,肯定需要對測試樣本減去一個訓練樣本均值,因為你在給訓練樣本降維的時候減去了均值,所以測試樣本也要減去均值,然后乘以coeff這個矩陣,就獲得了測試樣本降維后的數(shù)據(jù)。比如說你的測試樣本是1*1000000,那么乘上一個1000000*29的降維矩陣,就獲得了1*29的降維后的測試樣本的降維數(shù)據(jù)。

    此外:PCA的變換矩陣是協(xié)方差矩陣,K-L變換的變換矩陣可以有很多種(二階矩陣、協(xié)方差矩陣、總類內(nèi) ...),所以PCA變換是一種特殊的K-L變換

    參考文獻:

    1:百度百科:方差:http://baike.baidu.com/view/172036.htm?

    協(xié)方差:http://baike.baidu.com/view/121095.htm?fr=aladdin

    協(xié)方差矩陣:http://baike.baidu.com/view/1304423.htm?fr=aladdin

    pca:http://baike.baidu.com/view/852194.htm

    2:數(shù)據(jù)歸一化:

    (1)http://www.cnblogs.com/chaosimple/archive/2013/07/31/3227271.html

    (2)http://blog.csdn.net/memray/article/details/9023737

    3:http://blog.csdn.net/watkinsong/article/details/8234766?PCA降維算法總結(jié)以及matlab實現(xiàn)PCA(個人的一點理解)

    4:http://blog.csdn.net/watkinsong/article/details/38536463?PCA降維算法詳解以及代碼示例

    總結(jié)

    以上是生活随笔為你收集整理的PCA降维简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。