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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

pca主成分分析用matlab实现,PCA (主成分分析)详解 (写给初学者) 结合matlab

發(fā)布時(shí)間:2024/9/27 循环神经网络 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pca主成分分析用matlab实现,PCA (主成分分析)详解 (写给初学者) 结合matlab 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、簡介

PCA(Principal Components Analysis)即主成分分析,是圖像處理中經(jīng)常用到的降維方法,大家知道,我們在處理有關(guān)數(shù)字圖像處理方面的問題時(shí),比如經(jīng)常用的圖像的查詢問題,在一個(gè)幾萬或者幾百萬甚至更大的數(shù)據(jù)庫中查詢一幅相近的圖像。這時(shí),我們通常的方法是對圖像庫中的圖片提取響應(yīng)的特征,如顏色,紋理,sift,surf,vlad等等特征,然后將其保存,建立響應(yīng)的數(shù)據(jù)索引,然后對要查詢的圖像提取相應(yīng)的特征,與數(shù)據(jù)庫中的圖像特征對比,找出與之最近的圖片。這里,如果我們?yōu)榱颂岣卟樵兊臏?zhǔn)確率,通常會提取一些較為復(fù)雜的特征,如sift,surf等,一幅圖像有很多個(gè)這種特征點(diǎn),每個(gè)特征點(diǎn)又有一個(gè)相應(yīng)的描述該特征點(diǎn)的128維的向量,設(shè)想如果一幅圖像有300個(gè)這種特征點(diǎn),那么該幅圖像就有300*vector(128維)個(gè),如果我們數(shù)據(jù)庫中有一百萬張圖片,這個(gè)存儲量是相當(dāng)大的,建立索引也很耗時(shí),如果我們對每個(gè)向量進(jìn)行PCA處理,將其降維為64維,是不是很節(jié)約存儲空間啊?對于學(xué)習(xí)圖像處理的人來說,都知道PCA是降維的,但是,很多人不知道具體的原理,為此,我寫這篇文章,來詳細(xì)闡述一下PCA及其具體計(jì)算過程:

二、PCA詳解

1、原始數(shù)據(jù):

為了方便,我們假定數(shù)據(jù)是二維的,借助網(wǎng)絡(luò)上的一組數(shù)據(jù),如下:

x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]T

y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T

2、計(jì)算協(xié)方差矩陣

什么是協(xié)方差矩陣?相信看這篇文章的人都學(xué)過數(shù)理統(tǒng)計(jì),一些基本的常識都知道,但是,也許你很長時(shí)間不看了,都忘差不多了,為了方便大家更好的理解,這里先簡單的回顧一下數(shù)理統(tǒng)計(jì)的相關(guān)知識,當(dāng)然如果你知道協(xié)方差矩陣的求法你可以跳過這里。

(1)協(xié)方差矩陣:

首先我們給你一個(gè)含有n個(gè)樣本的集合,依次給出數(shù)理統(tǒng)計(jì)中的一些相關(guān)概念:

均值:

標(biāo)準(zhǔn)差:

方差:

既然我們都有這么多描述數(shù)據(jù)之間關(guān)系的統(tǒng)計(jì)量,為什么我們還要用協(xié)方差呢?我們應(yīng)該注意到,標(biāo)準(zhǔn)差和方差一般是用來描述一維數(shù)據(jù)的,但現(xiàn)實(shí)生活我們常常遇到含有多維數(shù)據(jù)的數(shù)據(jù)集,最簡單的大家上學(xué)時(shí)免不了要統(tǒng)計(jì)多個(gè)學(xué)科的考試成績。面對這樣的數(shù)據(jù)集,我們當(dāng)然可以按照每一維獨(dú)立的計(jì)算其方差,但是通常我們還想了解這幾科成績之間的關(guān)系,這時(shí),我們就要用協(xié)方差,協(xié)方差就是一種用來度量兩個(gè)隨機(jī)變量關(guān)系的統(tǒng)計(jì)量,其定義為:

從協(xié)方差的定義上我們也可以看出一些顯而易見的性質(zhì),如:

(X的方差)

需要注意的是,協(xié)方差也只能處理二維問題,那維數(shù)多了自然就需要計(jì)算多個(gè)協(xié)方差,比如n維的數(shù)據(jù)集就需要計(jì)算

個(gè)協(xié)方差,那自然而然的我們會想到使用矩陣來組織這些數(shù)據(jù)。給出協(xié)方差矩陣的定義:

這個(gè)定義還是很容易理解的,我們可以舉一個(gè)簡單的三維的例子,假設(shè)數(shù)據(jù)集有

三個(gè)維度,則協(xié)方差矩陣為

可見,協(xié)方差矩陣是一個(gè)對稱的矩陣,而且對角線是各個(gè)維度上的方差。

(2)協(xié)方差矩陣的求法:

協(xié)方差矩陣計(jì)算的是不同維度之間的協(xié)方差,而不是不同樣本之間的。下面我們將在matlab中用一個(gè)例子進(jìn)行詳細(xì)說明:

首先,隨機(jī)產(chǎn)生一個(gè)10*3維的整數(shù)矩陣作為樣本集,10為樣本的個(gè)數(shù),3為樣本的維數(shù)。

MySample = fix(rand(10,3)*50)

根據(jù)公式,計(jì)算協(xié)方差需要計(jì)算均值,那是按行計(jì)算均值還是按列呢,我一開始就老是困擾這個(gè)問題。前面我們也特別強(qiáng)調(diào)了,協(xié)方差矩陣是計(jì)算不同維度間的協(xié)方差,要時(shí)刻牢記這一點(diǎn)。樣本矩陣的每行是一個(gè)樣本,每列為一個(gè)維度,所以我們要按列計(jì)算均值。為了描述方便,我們先將三個(gè)維度的數(shù)據(jù)分別賦值:

dim1 = MySample(:,1);

dim2 = MySample(:,2);

dim3 = MySample(:,3);

計(jì)算dim1與dim2,dim1與dim3,dim2與dim3的協(xié)方差:

sum( (dim1-mean(dim1)) .* (dim2-mean(dim2)) ) / ( size(MySample,1)-1 ) % 得到? 74.5333

sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 )?% 得到? -10.0889

sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 )?% 得到? -10***000

搞清楚了這個(gè)后面就容易多了,協(xié)方差矩陣的對角線就是各個(gè)維度上的方差,下面我們依次計(jì)算:

std(dim1)^2 % 得到 ? 108.3222

std(dim2)^2?% 得到 ? 260.6222

std(dim3)^2?% 得到? 94.1778

這樣,我們就得到了計(jì)算協(xié)方差矩陣所需要的所有數(shù)據(jù),調(diào)用Matlab自帶的cov函數(shù)進(jìn)行驗(yàn)證:

cov(MySample)

可以看到跟我們計(jì)算的結(jié)果是一樣的,說明我們的計(jì)算是正確的。但是通常我們不用這種方法,而是用下面簡化的方法進(jìn)行計(jì)算:

先讓樣本矩陣中心化,即每一維度減去該維度的均值,然后直接用新的到的樣本矩陣乘上它的轉(zhuǎn)置,然后除以(N-1)即可。其實(shí)這種方法也是由前面的公式通道而來,只不過理解起來不是很直觀而已。大家可以自己寫個(gè)小的矩陣看一下就明白了。其Matlab代碼實(shí)現(xiàn)如下:

X = MySample – repmat(mean(MySample),10,1);??? % 中心化樣本矩陣

C = (X’*X)./(size(X,1)-1)

(為方便對matlab不太明白的人,小小說明一下各個(gè)函數(shù),同樣,對matlab有一定基礎(chǔ)的人直接跳過:

B = repmat(A,m,n )?%%將矩陣 A 復(fù)制 m×n 塊,即把 A 作為 B 的元素,B 由 m×n 個(gè) A 平鋪而成。B 的維數(shù)是 [size(A,1)*m, (size(A,2)*n]B = mean(A)的說明:

如果你有這樣一個(gè)矩陣:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];

用mean(A)(默認(rèn)dim=1)就會求每一列的均值

ans =

3.0000??? 4.5000??? 6.0000

用mean(A,2)就會求每一行的均值

ans =

2.0000

4.0000

6.0000

6.0000

size(A,n)%%如果在size函數(shù)的輸入?yún)?shù)中再添加一項(xiàng)n,并用1或2為n賦值,則 size將返回矩陣的行數(shù)或列數(shù)。其中r=size(A,1)該語句返回的是矩陣A的行數(shù), c=size(A,2) 該語句返回的是矩陣A的列數(shù))

上面我們簡單說了一下協(xié)方差矩陣及其求法,言歸正傳,我們用上面簡化求法,求出樣本的協(xié)方差矩陣為:

3、計(jì)算協(xié)方差矩陣的特征向量和特征值

因?yàn)閰f(xié)方差矩陣為方陣,我們可以計(jì)算它的特征向量和特征值,如下:

[eigenvectors,eigenvalues] = eig(cov)

我們可以看到這些矢量都是單位矢量,也就是它們的長度為1,這對PCA來說是很重要的。

4、選擇成分組成模式矢量

求出協(xié)方差矩陣的特征值及特征向量之后,按照特征值由大到小進(jìn)行排列,這將給出成分的重要性級別。現(xiàn)在,如果你喜歡,可以忽略那些重要性很小的成分,當(dāng)然這會丟失一些信息,但是如果對應(yīng)的特征值很小,你不會丟失很多信息。如果你已經(jīng)忽略了一些成分,那么最后的數(shù)據(jù)集將有更少的維數(shù),精確地說,如果你的原始數(shù)據(jù)是n維的,你選擇了前p個(gè)主要成分,那么你現(xiàn)在的數(shù)據(jù)將僅有p維。現(xiàn)在我們要做的是組成一個(gè)模式矢量,這只是幾個(gè)矢量組成的矩陣的一個(gè)有意思的名字而已,它由你保持的所有特征矢量構(gòu)成,每一個(gè)特征矢量是這個(gè)矩陣的一列。

對于我們的數(shù)據(jù)集,因?yàn)橛袃蓚€(gè)特征矢量,因此我們有兩個(gè)選擇。我們可以用兩個(gè)特征矢量組成模式矢量:

我們也可以忽略其中較小特征值的一個(gè)特征矢量,從而得到如下模式矢量:

5、得到降維后的數(shù)據(jù)

其中rowFeatureVector是由模式矢量作為列組成的矩陣的轉(zhuǎn)置,因此它的行就是原來的模式矢量,而且對應(yīng)最大特征值的特征矢量在該矩陣的最上一行。rowdataAdjust是每一維數(shù)據(jù)減去均值后,所組成矩陣的轉(zhuǎn)置,即數(shù)據(jù)項(xiàng)目在每一列中,每一行是一維,對我們的樣本來說即是,第一行為x維上數(shù)據(jù),第二行為y維上的數(shù)據(jù)。FinalData是最后得到的數(shù)據(jù),數(shù)據(jù)項(xiàng)目在它的列中,維數(shù)沿著行。

這將給我們什么結(jié)果呢?這將僅僅給出我們選擇的數(shù)據(jù)。我們的原始數(shù)據(jù)有兩個(gè)軸(x和y),所以我們的原始數(shù)據(jù)按這兩個(gè)軸分布。我們可以按任何兩個(gè)我們喜歡的軸表示我們的數(shù)據(jù)。如果這些軸是正交的,這種表達(dá)將是最有效的,這就是特征矢量總是正交的重要性。我們已經(jīng)將我們的數(shù)據(jù)從原來的xy軸表達(dá)變換為現(xiàn)在的單個(gè)特征矢量表達(dá)。

(說明:如果要恢復(fù)原始數(shù)據(jù),只需逆過程計(jì)算即可,即:

)

到此為止,相信你已經(jīng)掌握了PCA及其原理了。

總結(jié)

以上是生活随笔為你收集整理的pca主成分分析用matlab实现,PCA (主成分分析)详解 (写给初学者) 结合matlab的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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