1. 程式人生 > >深入學習主成分分析(PCA)演算法原理及其Python實現

深入學習主成分分析(PCA)演算法原理及其Python實現

一:引入問題

  首先看一個表格,下表是某些學生的語文,數學,物理,化學成績統計:

  首先,假設這些科目成績不相關,也就是說某一科目考多少分與其他科目沒有關係,那麼如何判斷三個學生的優秀程度呢?首先我們一眼就能看出來,數學,物理,化學這三門課的成績構成了這組資料的主成分(很顯然,數學作為第一主成分,因為資料成績拉的最開)。

  那麼為什麼我們能一眼看出來呢?

  當然是我們的座標軸選對了!!

  下面,我們繼續看一個表格,下標是一組學生的數學,物理,化學,語文,歷史,英語成績統計:

  那麼這個表我們能一眼看出來嗎?

  資料太多了,以至於看起來有些凌亂,無法直接看出這組資料的主成分,因為在座標系下這組資料分佈的很散亂。究其原因,是因為無法撥開遮住肉眼的迷霧,如果把這些資料在相應的空間中表示出來,也許你就能換一個觀察角度找出主成分,如下圖所示:

  簡單的二維或者三維我們可以想象出來其分佈狀態,那麼對於更高維的資料,能想象出來其分佈嗎?還有,就算能描述分佈,如何精確地找到這些主成分的軸?如何衡量你提取的主成分到底佔了整個資料的多少資訊?所以,我們就要用到主成分分析的處理方法。

  為了說明什麼是資料的主成分,我們首先得了解資料降維,資料降維時怎麼回事?

二,資料降維

  假設三維空間中有一系列點,這些點分佈在一個過原點的斜面上,如果你用自然座標x,y,z這三個軸來表示這組資料的話,需要使用三個維度,而事實上,這些點的分佈僅僅是在一個二維的平面上,那麼問題出在哪裡?如果你仔細想想,能不能把x,y,z座標系旋轉一下,使資料所在平面與x,y平面重合?這就對了!如果把旋轉後的座標記為x',y',z',那麼這組資料的表示只用x'和y'兩個維度表示即可!

  當然了,如果想恢復原來的表示方式,那就得把這兩個座標之間的變換矩陣存下來。這樣就能把資料維度降下來了!但是,我們要看到這個過程的本質,如果把這些資料按行或者按類排成一個矩陣,那麼這個矩陣的秩就是2!這些資料之間是有相關性的,這些資料構成的過原點的向量的最大線性無關組包含2個向量,這就是為什麼一開始就假設平面過原點的原因!

  那麼如果不過原點呢?這就是資料中心化的緣故!將座標原點平移到資料中心,這樣原本不相關的資料在這個新座標系中就有相關性了!有趣的是,三點一定共面,也就是三維空間中任意三點中心化後都是線性相關的,一般來講n維空間中n個點一定能在一個n-1維子空間中分析!

  總結一下這個例子,資料降維後並沒有丟棄任何東西,因為這些資料在平面以外的第三個維度的分量都為0。現在,假設這些資料在z'軸有一個很小的抖動,那麼我們仍然用上述的二維表示這些資料,理由是我們可以認為這兩個軸的資訊是資料的主成分,而這些資訊對於我們的分析已經足夠了,z'軸上的抖動很有可能是噪音,也就是說本來這組資料是有相關性的,噪聲的引入,導致了資料不完全相關,但是,這些資料在z'軸上的分佈與原點構成的夾角非常小,也就是說在z'軸上有很大的相關性,綜合考慮,就可以認為資料在x',y'軸上的投影構成了資料的主成分!

  所以說,降維肯定意味著資訊的丟失,不過鑑於實際資料本身常常存在的相關性,我們可以想辦法在降維的同時將資訊的損失儘量降低。

  下面在說一個極端的情況,也許在現實中不會出現,但是 類似的情況還是很常見的。

  假設某學籍資料有兩列M和F,其中M列的取值是如果此學生為男性,則取值為1,為女性則取0;而F列是學生為女性,則取值為0,男性則為1.此時如果我們統計全部學籍資料,會發現對於任何一條記錄來說,當M為1時F必定為0,反之當M為0時F必定為1,在這種情況下,我們將M或者F去掉實際上沒有任何資訊的損失,因為只要保留一列就可以完全還原另一列。

  那麼降維我們差不多說清楚了,現在我們將自己面對的資料抽象為一組向量,那麼下面我們有必要研究一些向量的數學性質,而這些數學性質將成為後續推匯出PCA的理論基礎。

 三,PCA基本數學原理

3.1 內積與投影

  下面先看一個向量運算:內積。

  兩個維數相同的向量的內積被定義為:

  內積運算將兩個向量對映為一個實數,其計算方式非常容易理解,但是其意義並不明顯,下面我們分析內積的幾何意義。假設A和B是兩個n維向量,我們知道n維向量可以等價表示為n維空間中的一條從原點發射的有向線段,為了簡單期間,我們假設A和B均為二維向量,則

  那麼在二維平面上A和B可以用兩條發自原點的有向線段表示,如下圖:

  現在我們從A點向B所在直線引入一條垂線,我們知道垂線與B的交點叫做A在B上的投影,再假設A與B的夾角為a,則投影的向量長度為

  其中是向量A的模,也就是A線段的標量長度。

  注意這裡區分了向量長度和標量長度,標量長度總是大於等於0,值就是線段的長度;而向量長度可能為負,其絕對值是線性長度,而符號取決於其方向與標準方向相同或者相反。

  可能大家還沒明白內積和這個東西有什麼關係,不過我們將內積表示為另一種我們熟悉的方式:

  現在明白了點吧,A與B的內積等於A到B的投影長度乘以B的模,在進一步,如果我們假設B的模為1,即讓,那麼就變成了下面公式(也就是上面我們說的投影的向量長度):

  也就是說,設向量B的模為1,則A與B的內積值等於A向B所在直線投影的向量長度!這就是內積的一種幾何解釋,也就是我們得到的第一個重要結論。

3.2 基

  下面我們繼續在二維空間討論向量,上文說過,一個二維向量可以對應二維笛卡爾直角座標系中從原點出發的一條有向線段,例如下面這個向量:

   在代數表示方面,我們經常使用線段終點的點的座標表示向量,例如上面的向量可以表示為(3,2),這裡我們再熟悉不過的向量表示。

  不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的,我們仔細看一下,這裡的座標(3,2)實際上表示的是向量在x軸上的投影值3,在y軸上的投影值為2。也就是說我們使其隱式引入一個定義:以x軸和y軸上正方向長度為1的向量為標準,那麼一個向量(3,2)實際上是說在x軸投影為3而y軸投影為2.注意投影是一個向量,所以可以為負。

  更正式的說,向量(x,y)實際上表示線性組合:

  不難證明所有二維向量都可以表示為這樣的線性組合,此處(1,0)和(0,1)叫做二維空間的一組基。

  所以,要準確描述向量,首先要確定一組基,然後給出基所在的各個直線上的投影值,就可以了,只不過我們經常省略第一步,而預設以(1,0)和(0,1)為基。

  我們之所以預設選擇(1,0)和(0,1)為基,當然是比較方便,因為他們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點座標和向量一一對應,非常方便。但實際上任何兩個線性無關的二維向量都可以成為一組基,所謂線性無關在二維平面內可以直觀認為是兩個不再一條直線上的向量。

  例如,(1,1)和(1,-1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內積的意義可以看到,如果基的模式1,那麼就可以方便的用向量點乘基而直接獲得其在新基上的座標了!實際上,對應於任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了,例如上面的基就可以變為:

  現在我們想獲得(3,2)在新基上的座標,即在兩個方向上的投影向量值,那麼根據內積的幾何意義,我們只要分別計算(3,2)和兩個基的內積,不難得到新的座標為

  下圖給出了新的基以及(3,2)在新基上座標值的示意圖:

  另外這裡要注意的是,我們列舉的例子中基是正交的(即內積為0,或者說相互垂直),但是可以成為一組基的唯一要求就是線性無關,非正交的基也是可以的,不過因為正交基有較好的性質,所以一般使用的基都是正交的。

3.3 基變換的矩陣表示

  下面我們找一種簡單的方式來表示基變換,還是拿上面的例子,想一下,將(3,2)變換為新基上的座標,就是用(3,2)與第一個基做內積運算,作為第一個新的座標分量,然後用(3,2)與第二個基做內積運算,作為第二個新座標的分量。實際上,我們可以用矩陣想成的形式簡潔的表示這個變換:

  那麼其中矩陣的兩行分別為兩個基,乘以原向量,其結果剛好為新基的座標,可以稍微擴充套件一下,如果我們有m個二維向量,只要將二維向量按照列排成一個兩行m列的矩陣,然後用“基矩陣”乘以這個矩陣,就得到了所有這些向量在新基下的值,例如(1,1),(2,2),(3,3)想變換到剛才那組基上,則可以變為這樣:

  於是一組向量的基變換被表示為矩陣的相乘。

  一般地,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那麼首先將R個基按照行組成矩陣A,,然後將向量按照列組成矩陣B,那麼兩個矩陣的乘積AB就是變換結果,其中AB的第m列為A中的第M列變換後的結果。

  數學表示為:

  其中Pi是一個行向量,表示第i個基,aj是一個列向量,表示第j個原始資料記錄。

  特別要注意的是,這裡R可以小於N,而R決定了變換後資料的維數,也就是說,我們可以將一個N維資料變換到更低維度的空間中去,變換後的維度取決於基的數量,因此這種矩陣相乘的表示也可以表示為降維變換。 

   最後,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說:一個矩陣可以表示為一種線性變換。

3.4 協方差矩陣及優化目標

  上面我們討論了選擇不同的基可以對同樣一組資料給出不同的表示,而且如果基的數量少於向量的本身的維數,則可以達到降維的效果,但是我們還沒有回答最關鍵的一個問題:如何選擇基才是最優的,或者說,如果我們有一組N維向量,現在要將其降到K維(K小於N),那麼我們應該如何選擇K個基才能最大程度保留原有的資訊?

  要完全數學化這個問題非常繁雜,這裡我們用一個非形式化的直觀方法來看這個問題。

  為了避免過於抽象的討論,我們仍然以一個具體的例子展開,假設我們的資料由五條記錄組成,將它們表示為矩陣形式:

  其中每一列為一條資料記錄,而一行為一個欄位,為了後續處理方便,我們首先將每個欄位內所有值都減去欄位均值,其結果是將每個欄位都變為均值為0(這樣做的好處後面可以看到)。

  我們看上面的資料,第一個欄位的均值為2,第二個欄位的均值為3,所以變換後:

  我們可以看到五條資料在平面直角座標系內的樣子:

  現在問題來了:如果我們必須使用一維來表示這些資料,又希望儘量保留原始的資訊,你要如何選擇?

  通過上一節對及變換的討論我們知道,這個問題實際上是要在二維平面中選擇一個方向,將所有資料都投影到這個方向所在的直線上,用投影值表示原始記錄,這是一個實際的二維降到一維的問題。

  那麼如何選擇這個方向(或者說是基)才能儘量保留最多的原始資訊呢?一種直觀的看法是:希望投影后的投影值儘可能分散。

  以上圖為例,可以看出如果向x軸投影,那麼最左邊的兩個點會重疊在一起,中間的兩個點也會重疊在一起,於是本身四個各不相同的二維點投影后只剩下兩個不同的值了,這是一種嚴重的資訊丟失,同理,如果向y軸投影最上面的兩個點和分佈在x軸上的兩個點也會重疊,所以看來x和y軸都不是最好的投影選擇。我們直觀目測,如果向通過第一象限和第三象限的斜線投影,則五個點在投影后還是可以區分的。

  下面我們用數學方法表述這個問題。

3.5 方差

  上文說道,我們希望投影后投影值儘可能分散,而這種分散程度,可以用數學上的方差來表述,此處,一個欄位的方差可以看做事每個元素與欄位均值的差的平方和的均值,即:

  由於上面我們已經將每個欄位的均值都化0 了,因此方差可以直接用每個元素的平方和除以元素個數表示:

  於是上面的問題被形式化表示為:尋找一個一維基,使得所有資料變換為這個基上的座標表示後,方差值最大。

3.6 協方差

  對於上面二維降成一維的問題來說,找到那個使得方差最大的方向就可以了,不過對於更高維,還有一個問題需要解決,考慮三維降到二維問題,與之前相同,首先我們希望找到一個方向使得投影后方差最大,這樣就完成了第一個方向的選擇,繼而我們選擇第二個投影方向。

  如果我們還是單純的只選擇方差最大的方向,很顯然,這個方向與第一個方向應該是“幾乎重合在一起”,顯然這樣的維度是沒有用的,因此應該有其他約束條件。從直觀上講,讓兩個欄位儘可能表示更多的原始資訊,我們是不希望他們之間存線上性相關性,因為相關性意味著兩個欄位不是完全獨立,必然存在重複表示的資訊。

   數字上可以用兩個欄位的協方差表示其相關性,由於已經讓每個欄位均值為0,則:

  可以看出,在欄位均值為0的情況下,兩個欄位的協方差簡潔的表示為其內積除以元素數m。

  當協方差為0時,表示兩個欄位完全獨立,為了讓協方差為0,我們選擇第二個即時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。

  至此,我們得到了降維問題的優化目標:將一組N維向量降維k維(K大於0,小於N),其目標是選擇K個單位(模為1)正交基,使得原始資料變換到這組基上後,各欄位兩兩間協方差為0,而欄位的方差則儘可能大(在正交的約束下,取最大的k個方差)。

  然後我們用X乘以X的轉置,並乘上係數1/m:

  這時候我們會發現,這個矩陣對角線上的兩個元素分別是兩個欄位的方差,而其他元素是a和b的協方差,兩者被統一到了一個矩陣的。

  根據矩陣相乘的運演算法則,這個結論很容易被推廣到一般情況:

  設我們有m個n維資料記錄,將其按列排成n乘m的矩陣X,設,則C是一個對稱矩陣,其對角線分別是各個欄位的方差,而第l行j列和j行i列元素相同,表示i和j兩個欄位的協方差。

3.7 協方差矩陣

  上面我們匯出了優化目標,但是這個目標似乎不能直接作為操作指南(或者說演算法),因為它只說要什麼,但是根本沒有說怎麼做,所以我們要在數學上繼續研究計算方案。

  我們看到,最終要達到的目標與欄位內方差及欄位間協方差有密切關係。因此我們希望能將兩者統一表示,仔細觀察發現,兩者均可以表示為內積的形式,而內積又與矩陣相乘密切相關。於是,我們來了靈感:

  假設我們只有a和b 兩個欄位,那麼我們將他們按行組成矩陣X:

 

3.8 協方差矩陣對角化

  根據上述推導,我們發現要達到優化目前等價於將協方差矩陣對角化:即除對角線外的其他元素化為0,並且在對角線上將元素按照大小從上到下排列,這樣我們就達到了優化目的,這樣說可能還不清晰,我們進一步看下原矩陣與基變換後矩陣協方差矩陣的關係:

  設原始資料矩陣X對於的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則Y為X對P做基變換後的資料,設Y的協方差矩陣為D,我們推導一下D與C的關係:

  現在事情很明白,我們要找的P不是別的,而是能讓原始協方差矩陣對角化的P,換句話說,優化目標變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,並且對角元素按照從大到小依次排列,那麼P的前K行就是要尋找的基,用P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維並滿足上述優化條件。

  至此,我們離“發明”PCA還有一步之遙!

  現在所有的焦點都聚集在了協方差矩陣對角化問題上,有時,我們真應該感謝數學家的先行,因為矩陣對角化線上性代數領域已經屬於被玩爛的東西,所以這在數學上根本不是問題。

  由上文知道,協方差矩陣C是一個對稱矩陣,線上性代數上,實對稱矩陣有一系列非常好的性質:

  1)實對稱矩陣不同特徵值對應的特徵向量必然正交。

  2)設特徵向量重數為r,則必然存在r個線性無關的特徵向量對應於,因此可以將這r個特徵向量單位正交化。

  有上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特徵向量,設這n個特徵向量為,我們將其按照列組成矩陣:

  則對協方差矩陣C有如下結論:

  其中為對稱矩陣,其對角元素為各特徵向量對應的特徵值(可能有重複)。

  到這裡,我們發現我們已經找到了需要的矩陣P:

  P是協方差矩陣的特徵向量單位化後按照行排列出的矩陣,其中每一行都是C的一個特徵向量,如果設P按照中特徵值從大到小,將特徵向量從上到下排列,則用P的前K行組成的矩陣乘以原始資料矩陣X,就可以得到我們需要的降維後的資料矩陣Y。

  至此,我們完成了整個PCA的數學原理討論。

3.9 對上面例子整合

  1,原始資料集矩陣X:

  2,求均值後:

  3,再求協方差矩陣:

  4,特徵值:

  5,對應的特徵向量:

  6,標準化:

  7,選擇較大特徵值對應的特徵向量:

  8,執行PCA變換:Y=PX 得到的Y就是PCA降維後的值 資料集矩陣:

四,主成分分析(PCA)演算法步驟

  介紹一個PCA的教程:A tutorial on Principal Components Analysis ——Lindsay I Smith

 

  PCA(Principal Components Analysis)即主成分分析,是一種常用的資料分析手段,是影象處理中經常用到的降維方法。對於一組不同維度之間可能存線上性相關關係的資料,PCA能夠把這組資料通過正交變換變成各個維度之間線性無關的資料,經過PCA處理的資料中的各個樣本之間的關係往往更直觀,所以它是一種非常常用的資料分析和預處理工具。PCA處理之後的資料各個維度之間是線性無關的,通過剔除方差較小的那些維度上的資料,我們可以達到資料降維的目的。

  PCA從原始變量出發,通過旋轉變化(即原始變數的線性組合)構建出一組新的,互不相關的新變數,這些變數儘可能多的解釋原始資料之間的差異性(即資料內在的結構),他們就成為原始資料的主成分。由於這些變數不相關,因此他們無重疊的各自解釋一部分差異性。依照每個變數解釋時差異性大小排序,他們成為第一主成分,第二主成分,以此類推。

  主成分分析(PCA)是一種基於變數協方差矩陣對資料進行壓縮降維,去噪的有效方法,PCA的思想是將n維特徵對映到k維上(k<n),這k維特徵稱為主元(主成分),是舊特徵的線性組合,這些線性組合最大化樣本方差,儘量使用新的k個特徵互不相關。這k維是全新的正交特徵,是重新構造出來的k維特徵,而不是簡單地從n維特徵中取出其餘n-k維特徵。

  說了這麼多,下面說一下PCA降維的演算法步驟。

  設有m條n維資料:

1) 將原始資料按列組成n行m列矩陣X

2)將X的每一行(代表一個屬性欄位)進行零均值化(去平均值),即減去這一行的均值

3)求出協方差矩陣  

4)求出協方差矩陣的特徵值及對應的特徵向量

5)將特徵向量按對應特徵值大小從上到下按行排列成矩陣,取前k行組成矩陣P(保留最大的k各特徵向量)

6)Y=PX 即為降維到K維後的資料

 

五,例項PCA計算過程

  現在假設有一組資料如下:

  行代表了樣例,列代表了特徵,這裡有10個樣例,每個樣例兩個特徵,可以這樣認為,有10篇文件,x是10篇文件中“learn”出現的TF-IDF,y是10篇文件中“study”出現的IF_IDF。

  第一步,分別求x和y的平均值,然後對所有的樣例,都減去對應的均值。這裡x的均值為1.81,y的均值為1.91,那麼第一個一個樣例減去均值後為(0.69,0.49),以此類推得到:

程式碼:

x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]
y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
import numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in range(len(y))]
print(result_x)
print(result_y)

  

  第二步,計算特徵協方差矩陣,如果資料是三維的,那麼協方差矩陣為:

  這裡是2維的,只有x和y,求解得:

  

  對角線上分別是x和y的方差,非對角線上是協方差。協方差是衡量兩個變數同時變化的變化程度。協方差大於0表示x和y若一個增加,另一個也增加;協方差小於0寶石一個增加,則另一個減少。如果x和y是統計獨立的,那麼二者之間的協方差就是0;但是協方差是0 ,並不能說明x和y是獨立的。協方差絕對值越大,兩者對彼此的影響越大,反之越小。協方差是沒有單位的量,因此,如果同樣的兩個變數所採用的量綱發生變化,他們的協方差也會產生數值上的變化。

程式碼:

x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]
y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
import numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in range(len(y))]
print(result_x)
print(result_y)
z = np.vstack((result_x,result_y))
cov = np.cov(z)
print(cov)

  

  第三步,計算協方差矩陣的特徵向量和特徵值,選取特徵向量

 


     上面兩個特徵值,下面是對應的特徵向量,特徵值0.490833989對應的特徵向量是(-0.735178656, 0.677873399),這裡的特徵向量是正交的、歸一化的,即長度為1。

x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]
y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
import numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in range(len(y))]
print(result_x)
print(result_y)
z = np.vstack((result_x,result_y))
cov = np.cov(z)
print(cov)

# 特徵值 特徵向量
feature_result,feature_vector = np.linalg.eig(cov)
print(feature_result)
print(feature_vector)

  第四步,將特徵值按照從大到小的順序排序,選擇其中最大的k個,然後將其對應的k各特徵向量分別作為列向量組成特徵向量矩陣。

 

  如果資料中有n維,計算出n個特徵向量和特徵值,選擇前k個特徵向量,然後最終的資料集合只有k維,取的特徵向量命名為FeatureVector。 

     

  這裡的特徵值只有兩個,我們選擇其中最大的那個,這裡是1.28402771,對應的特徵向量是(-0.677873399, -0.735178656)T。 

  第五步,將樣本點投影到選取的特徵向量上,得到新的資料集

  假設樣例數為m,特徵數為n,減去均值後的樣本矩陣為DataAdjust(m*n),協方差矩陣是n*n,選取的k個特徵向量組成的矩陣為EigenVectors(n*k)。那麼投影后的資料FinalData為

clip_image011[4] 

  這裡是FinalData(10*1) = DataAdjust(10*2矩陣)×特徵向量clip_image009[7]

  得到結果為

  

  這樣,就將原始樣例的n維特徵變成了k維,這k維就是原始特徵在k維上的投影。

  上面的資料可以認為是learn和study特徵融合為一個新的特徵叫LS特徵,該特徵基本上代表了這兩個特徵,該過程如下圖所示:

  正號表示預處理後的樣本點,斜著的兩條線就分別是正交的特徵向量(由於協方差矩陣是對稱的,因此其特徵向量正交),最後一句矩陣乘法就是將原始樣本點分別往特徵向量對應的軸上做投影,下圖是FinalData根據最大特徵值對應的特徵向量轉化回去後的資料集形式,可看出是將DataAdjust樣本點分別往特徵向量對應的軸上做投影:

  

  如果取的k=2,那麼結果是

     clip_image014[4]

  可見,若使用了所有特徵向量得到的新的資料集,轉化回去之後,與原來的資料集完全一樣(只是座標軸旋轉)。

六,python實現主成分(PCA)降維

from numpy import *

def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float,line) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat=999999):
    meanVals = mean(dataMat, axis=0)
    DataAdjust = dataMat - meanVals           #減去平均值
    covMat = cov(DataAdjust, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat)) #計算特徵值和特徵向量
    #print eigVals
    eigValInd = argsort(eigVals)
    eigValInd = eigValInd[:-(topNfeat+1):-1]   #保留最大的前K個特徵值
    redEigVects = eigVects[:,eigValInd]        #對應的特徵向量
    lowDDataMat = DataAdjust * redEigVects     #將資料轉換到低維新空間
    reconMat = (lowDDataMat * redEigVects.T) + meanVals   #重構資料,用於除錯
    return lowDDataMat, reconMat

  測試資料testSet.txt由1000個數據點組成。下面對資料進行降維,並用matplotlib模組將降維後的資料和原始資料一起繪製出來。

(連結:https://pan.baidu.com/s/19k4ND3ISUjhfWZhj4Fhcbw 提取碼:r3n7 )

資料:(此資料直接複製可能無法使用,會報錯, could not convert string to float,建議最好下載)

10.235186	11.321997
10.122339	11.810993
9.190236	8.904943
9.306371	9.847394
8.330131	8.340352
10.152785	10.123532
10.408540	10.821986
9.003615	10.039206
9.534872	10.096991
9.498181	10.825446
9.875271	9.233426
10.362276	9.376892
10.191204	11.250851
7.720499	6.476300
9.334379	8.471268
7.963186	6.731333
8.244973	9.013785
9.569196	10.568949
8.854793	9.076536
9.382171	7.240862
8.179055	8.944502
8.267896	8.797017
9.047165	8.725068
8.741043	7.901385
7.190216	7.804587
8.081227	9.314431
8.047460	5.720780
7.917584	7.543254
8.676942	10.102220
9.210251	9.424717
7.732998	9.840202
7.681754	8.609897
7.925863	10.079159
8.261509	8.242080
8.514872	7.527561
10.324450	10.804481
7.856710	7.931543
7.858608	7.995340
9.196808	6.577598
9.644415	10.935081
9.579833	9.085021
7.888484	5.976428
9.072624	9.703344
8.914184	9.298515
7.822869	7.086663
10.538554	11.061464
8.280187	8.709012
8.884223	8.670105
9.359927	10.575055
9.078611	9.710833
7.935134	8.586173
8.805945	10.575145
9.584316	9.614076
11.269714	11.717254
9.120444	9.019774
7.977520	8.313923
8.104648	9.456128
8.617126	7.331723
9.033811	9.469706
8.327680	5.122092
8.532272	10.100909
9.295434	8.933824
9.905202	9.027559
10.585764	10.912733
10.427584	11.532578
9.072767	9.960144
9.164275	8.645121
9.746058	10.717080
9.286072	9.340024
8.188233	7.432415
7.948598	8.445419
7.563350	5.656178
8.972405	8.801869
9.980868	8.788996
7.753490	7.714248
7.431143	9.032819
8.943403	8.359354
10.481890	9.988969
9.150454	10.278760
8.123894	9.060351
8.626164	8.469342
7.354185	7.631252
11.323046	11.015032
8.190008	6.860792
8.412598	7.661358
9.258404	8.580382
11.007915	11.443881
8.279403	8.347003
8.931149	10.105221
10.239245	10.077473
8.129346	7.096877
8.485823	9.373561
10.703640	11.651618
9.500728	8.150228
9.712414	9.910445
9.333374	9.407557
8.787865	10.168021
9.238180	10.253478
9.577388	8.895150
10.447753	10.318227
9.303944	9.223136
9.883268	11.662945
9.471921	10.443792
10.007753	9.579912
8.110298	7.106263
6.964069	6.585040
10.413499	9.649309
8.032629	7.053254
8.015549	9.166753
10.462924	8.656612
9.530788	10.134130
9.202658	9.314222
10.103241	10.235159
7.849264	6.624856
9.059071	7.992555
10.172889	10.724789
9.528439	6.420990
7.190422	6.789792
9.085716	9.846328
9.452887	8.735386
7.417322	7.348594
8.468639	8.715086
8.303642	9.463231
9.939052	10.026771
8.701989	7.516978
9.737541	10.587281
8.280233	7.852444
10.648386	10.259203
9.173893	10.520372
9.135397	10.751406
7.594580	8.488833
8.587520	8.463406
8.581887	7.888644
9.448768	8.707422
7.882664	7.772030
10.050635	9.859720
9.012078	9.533899
8.770020	8.882996
9.428804	9.446306
8.504209	8.319693
9.800003	10.964667
8.069660	7.683099
10.012217	10.320644
8.704677	8.918146
8.198722	7.297786
9.868322	9.901657
9.426997	11.480353
9.228767	9.262976
8.952359	9.528471
8.186847	8.600587
9.026371	8.705143
9.483364	9.807079
7.826587	7.975401
11.197846	10.959298
7.632421	8.769745
8.761605	8.309365
9.353670	8.728758
6.466637	6.038996
8.370634	9.178830
10.337451	11.075600
8.917679	8.288367
9.076621	8.487626
7.278948	4.634097
10.153017	11.219183
7.132603	5.853118
9.338644	9.805940
9.878602	9.187000
10.009505	10.924505
9.384438	10.691860
7.535322	8.160481
6.808732	8.268469
8.302965	8.075009
8.345379	8.305356
9.517530	8.249839
9.267825	9.999109
10.291511	11.032664
8.605909	8.705207
8.331145	7.812295
8.632412	10.574287
8.766397	8.712107
9.407070	9.732756
9.709495	9.729569
10.422201	11.070360
6.831495	6.466763
8.187122	8.405929
8.523093	9.041844
7.952394	6.801220
10.490780	10.001468
10.813791	9.802494
7.861113	7.541475
8.800399	8.738974
7.542152	6.612838
9.446981	9.378659
8.281684	7.358572
8.473801	8.208343
11.736767	11.022029
8.379578	8.714348
8.313718	8.832381
9.342589	10.416659
7.560710	6.889648
9.295344	9.739040
9.176612	9.718781
8.614385	10.150521
9.079373	8.839794
10.333289	10.921255
9.453502	7.335134
10.174590	10.292500
9.693713	9.793636
7.474925	7.751391
10.107905	10.156997
9.257241	7.854266
10.209794	11.410157
7.248050	6.433676
10.150091	9.288597
10.077713	10.321500
8.191122	8.931519
8.791469	10.287216
9.229434	9.095193
8.682571	8.546005
7.524099	7.709751
8.442410	8.326037
9.364851	9.095989
9.061222	7.557899
7.989999	8.555363
8.801275	8.868732
10.351932	9.497796
10.230710	10.496151
9.783163	9.891408
10.651481	9.431617
8.387393	6.400507
9.003921	7.050003
8.483723	8.314886
9.020501	7.545771
9.329105	11.095661
9.583687	9.271929
8.908705	8.407529
8.835406	8.083517
9.736362	8.296735
10.030302	9.737178
8.287142	6.993460
9.173211	9.306335
9.026355	9.696531
9.128391	9.921247
11.486346	12.910777
11.519458	11.472111
9.027707	10.263974
9.351935	8.542200
9.421701	11.403201
9.005687	8.100969
7.015279	6.614278
8.213607	8.340948
8.226646	8.718997
8.144753	8.366877
10.133642	12.790169
10.763481	10.847016
10.003622	10.337716
9.007955	9.792482
8.670506	10.782931
10.386414	9.956162
10.104761	10.123044
8.079502	8.304075
9.945424	11.855409
8.642497	9.998066
9.349722	8.690328
9.034991	8.826490
8.738746	7.518464
8.919532	9.740312
9.464136	10.444588
10.710057	12.666857
10.042007	10.532091
8.447996	7.426363
9.509351	9.030516
11.946359	10.553075
9.981617	9.912651
9.853876	9.632967
10.560648	11.881714
8.370952	9.989491
8.323209	10.102529
9.828359	11.702462
8.515623	8.426754
9.004363	9.628036
10.529847	10.458031
10.028765	10.624880
9.448114	9.313227
8.332617	7.382295
8.323006	8.276608
7.740771	8.799750
8.379615	8.146192
8.340764	9.184458
9.863614	8.254694
9.969563	9.405134
9.164394	9.182127
10.622098	9.722592
9.592072	10.029446
8.212027	7.477366
9.080225	8.244448
8.555774	7.842325
9.958046	9.696221
8.972573	9.797128
9.213223	7.128437
8.737239	9.385138
10.333907	10.994856
8.797511	8.643075
11.044848	9.623160
8.539260	9.097113
11.582163	11.884333
7.863848	7.176199
6.218103	5.283562
9.120602	7.250190
9.001166	9.635203
8.081476	8.844224
9.369802	8.230911
8.768925	8.666987
9.841098	8.543896
10.451522	9.549511
9.755402	9.117522
7.988961	6.869854
8.872507	9.787118
10.363980	10.716608
6.315671	5.765953
9.638879	9.202355
8.588126	8.037966
8.947408	9.144386
9.051130	7.195132
9.321709	8.380668
10.146531	9.754745
9.843373	8.891437
9.213148	11.700632
7.630078	7.294753
8.093088	7.967590
7.488915	6.090652
8.126036	8.586472
8.760350	7.268987
10.201347	9.141013
7.838208	7.307700
6.155653	5.563997
7.767841	6.254528
8.425656	8.615832
10.362168	10.886815
10.180024	10.378934
9.794665	10.047812
9.970394	9.668279
7.030217	7.060471
9.275414	9.095738
10.314911	10.456539
9.259774	8.204851
10.023919	9.558307
8.887540	9.866704
9.851608	9.410989
8.710882	7.268012
9.017007	10.217673
7.976369	9.000979
8.738332	8.664734
8.344510	8.977600
8.959613	12.324240
9.169982	8.624635
7.487451	8.154859
8.706316	7.719455
9.564832	8.940403
8.327775	9.044509
9.734032	10.195255
8.021343	6.445092
9.081048	11.024397
7.626651	6.549263
10.725858	8.575374
8.731381	8.307788
10.394237	10.596874
7.029311	7.658832
9.517907	7.509904
10.394064	10.060898
10.752500	9.431601
9.692431	10.332130
9.651897	7.876862
8.592329	10.096837
10.212801	10.827496
9.045043	9.265524
8.901643	8.036115
10.794525	9.318830
11.040915	12.021746
8.390836	9.672469
9.840166	11.226568
10.806810	12.205633
8.924285	10.934056
8.411251	8.289672
7.808891	9.663290
9.733437	8.486958
8.300026	7.477374
8.221756	10.278308
9.096867	9.619677
9.410116	9.289188
10.097176	9.768470
9.387954	8.844855
9.376134	7.704630
8.231599	9.101203
9.910738	10.694855
8.645689	7.764589
8.090245	7.109596
9.253483	9.813672
9.331546	8.039386
9.843256	10.208792
9.713131	9.247665
9.259369	10.704622
10.243948	9.695883
6.396262	6.456390
8.936289	8.703871
8.750846	9.347273
6.497155	4.130251
9.516552	10.164848
9.125766	8.858775
8.374387	7.300114
8.132816	7.621107
10.099505	9.159134
9.356477	6.869999
8.112934	7.587547
7.265396	6.987031
11.950505	13.715109
10.745959	10.822171
8.893270	7.887332
6.003473	4.960219
7.498851	6.451334
10.162072	9.935954
8.732617	9.177679
9.300827	9.952360
11.908436	12.256801
9.371215	9.188645
9.943640	9.245037
7.386450	7.046819
8.410374	8.293218
7.830419	6.440253
8.263140	8.279446
11.448164	12.192363
8.216533	9.186628
9.316128	10.046697
8.156927	6.834792
9.951421	11.240598
9.059607	8.458446
10.476339	10.560461
7.548200	7.227127
9.432204	7.236705
9.402750	9.126413
11.188095	13.853426
9.520201	11.028131
8.884154	9.764071
8.961105	8.833117
8.549663	8.865765
10.111708	10.515462
9.024761	9.169368
7.904149	8.048756
9.240995	7.796142
8.126538	6.116125
7.442148	7.931335
9.486821	10.091359
9.834289	11.694720
9.009714	11.599170
9.761314	11.344083
6.993941	6.562988
8.659524	8.410107
7.685363	8.097297
7.793217	6.519109
8.883454	9.257347
8.781821	9.231980
7.946281	7.658978
8.523959	10.646480
9.031525	8.649648
8.317140	7.758978
9.192417	11.151218
8.408486	8.282182
10.327702	11.459048
8.389687	8.548727
8.642250	7.056870
8.833447	9.267638
8.805261	8.320281
9.726211	9.095997
8.477631	9.507530
9.738838	9.652110
8.272108	7.582696
9.258089	8.495931
8.334144	8.810766
8.150904	6.486032
7.259669	7.270156
11.034180	11.519954
10.705432	10.642527
8.388814	7.159137
8.559369	7.846284
7.187988	6.519313
8.811453	7.765900
8.492762	7.992941
8.739752	8.502909
10.150752	10.420295
7.062378	5.365289
8.448195	7.480000
10.224333	11.592750
9.533795	9.212845
9.519492	7.690501
9.661847	10.376189
7.963877	8.597193
10.184486	9.136709
8.505234	9.159210
8.187646	8.518690
9.167590	9.405917
8.612162	8.518755
10.970868	10.392229
9.603649	9.141095
9.704263	8.830178
9.657506	8.132449
9.337882	11.045306
9.521722	9.537764
8.954197	8.728179
8.635658	10.352662
8.910816	9.020317
9.900933	9.392002
10.247105	8.289649
9.571690	8.171237
7.388627	7.668071
8.354008	10.074590
9.775598	8.835696
8.768913	7.983604
8.330199	8.474098
8.169356	9.361172
10.346522	10.086434
7.976144	9.266702
8.429648	7.865824
11.261674	11.788587
10.051066	10.112425
8.954626	9.789343
8.382220	8.121012
9.820642	9.426441
8.125950	9.695087
8.646465	7.291808
8.190202	8.003737
8.773887	7.306175
8.731000	10.300436
9.163098	7.816769
9.456346	9.223922
9.645180	9.324053
8.835060	8.966915
9.325950	10.943248
9.941912	9.548535
9.282799	10.119488
9.567591	9.462164
8.529019	9.768001
9.314824	10.153727
8.264439	8.273860
8.307262	8.214036
9.122041	8.657861
8.404258	8.389365
7.828355	8.419433
9.803180	10.108286
8.662439	8.581953
8.883265	8.978377
8.012330	8.262451
9.420258	8.974878
7.015415	6.365940
9.888832	11.163036
9.677549	10.346431
8.410158	7.912899
9.464147	10.762900
7.067227	7.035717
9.320923	10.583089
9.056917	8.771241
8.110004	8.387789
10.310021	10.970014
8.211185	8.809627
8.942883	8.840746
9.479958	8.328700
8.973982	8.702291
8.519257	8.764855
9.424556	8.956911
7.222919	8.177787
8.257007	9.700619
9.778795	9.296134
8.028806	8.575974
9.886464	9.965076
9.090552	6.978930
9.605548	10.256751
9.959004	9.610229
8.308701	9.509124
7.748293	9.685933
8.311108	9.428114
9.697068	10.217956
9.582991	9.478773
9.167265	10.198412
10.329753	10.406602
8.908819	7.428789
10.072908	10.393294
7.992905	9.226629
8.907696	7.269366
8.421948	9.342968
7.481399	7.225033
10.358408	10.166130
8.786556	10.279943
9.658701	11.379367
10.167807	9.417552
8.653449	8.656681
8.020304	8.671270
8.364348	10.004068
9.119183	9.788199
8.405504	9.740580
11.020930	11.904350
9.755232	9.515713
10.059542	9.589748
8.727131	9.777998
7.666182	6.028642
8.870733	8.367501
9.340446	7.707269
9.919283	10.796813
7.905837	8.326034
10.181187	10.089865
8.797328	8.981988
8.466272	7.765032
10.335914	12.620539
9.365003	8.609115
8.011017	7.249489
10.923993	13.901513
7.074631	7.558720
9.824598	8.851297
8.861026	8.370857
10.127296	10.861535
10.548377	10.855695
8.880470	7.948761
8.901619	9.674705
7.813710	9.246912
10.128808	10.560668
11.096699	10.911644
8.551471	6.871514
8.907241	8.677815
10.571647	10.294838
8.815314	8.810725
8.453396	8.339296
9.594819	11.487580
10.714211	9.628908
7.428788	7.712869
10.892119	12.747752
9.024071	11.112692
7.803375	7.847038
8.521558	8.881848
9.742818	11.520203
9.832836	9.180396
8.703132	10.028498
9.905029	11.347606
10.037536	8.882688
8.629995	8.392863
9.583497	9.219663
8.781687	9.650598
9.344119	9.537024
10.407510	9.223929
7.244488	6.559021
10.643616	10.288383
8.757557	6.947901
10.784590	11.233350
10.028427	11.330033
7.968361	6.830308
8.925954	8.539113
7.738692	7.114987
8.192398	8.352016
10.412017	12.431122
8.208801	5.777678
7.820077	7.790720
9.542754	11.542541
6.817938	7.429229
7.365218	7.956797
9.274391	7.932700
9.546475	8.803412
7.471734	6.797870
8.016969	7.848070
8.852701	8.458114
8.215012	8.468330
6.975507	6.846980
9.435134	10.609700
9.228075	9.342622
8.388410	7.637856
7.111456	9.289163
9.403508	8.482654
9.133894	8.343575
10.670801	9.750821
9.983542	10.074537
10.012865	8.537017
8.929895	8.951909
7.666951	7.473615
9.493839	7.821783
8.894081	7.059413
9.593382	9.859732
9.126847	8.395700
9.532945	9.850696
9.459384	9.384213
8.982743	8.217062
10.107798	8.790772
10.563574	9.044890
8.278963	9.518790
8.734960	10.494129
9.597940	9.530895
10.025478	9.508270
10.335922	10.974063
8.404390	8.146748
7.108699	6.038469
8.873951	7.474227
8.731459	8.154455
8.795146	7.534687
6.407165	6.810352
9.979312	10.287430
8.786715	8.396736
10.753339	10.360567
10.508031	10.321976
10.636925	10.193797
10.614322	11.215420
8.916411	8.965286
8.112756	8.304769
10.833109	10.497542
8.319758	9.727691
9.945336	11.820097
10.150461	9.914715
10.185024	10.388722
9.793569	9.079955
10.590128	11.811596
8.505584	6.884282
10.461428	10.745439
8.755781	9.418427
7.488249	7.172072
10.238905	10.428659
9.887827	10.427821
8.529971	8.838217
8.375208	10.242837
8.901724	8.398304
8.607694	9.173198
8.691369	9.964261
9.584578	9.641546
10.265792	11.405078
7.592968	6.683355
8.692791	9.389031
7.589852	6.005793
10.550386	11.736584
8.578351	7.227055
7.526931	6.875134
8.577081	9.877115
9.272136	11.050928
10.300809	10.653059
8.642013	9.006681
9.720491	10.265202
9.029005	9.646928
8.736201	7.975603
8.672886	9.070759
8.370633	8.412170
9.483776	9.183341
6.790842	7.594992
9.842146	10.156810
9.563336	7.962532
8.724669	9.870732
9.012145	9.171326
9.116948	9.791167
6.219094	7.988420
9.468422	8.359975
8.825231	8.475208
9.572224	9.696428
9.609128	8.488175
9.428590	10.468998
8.293266	8.617701
9.423584	10.355688
9.240796	9.517228
10.915423	13.026252
10.854684	11.130866
9.226816	9.391796
9.580264	10.359235
7.289907	6.898208
9.338857	10.374025
9.523176	11.332190
10.162233	10.357396
8.873930	9.207398
8.607259	7.794804
8.852325	8.215797
8.077272	6.501042
8.169273	8.269613
6.806421	7.544423
8.793151	9.691549
11.640981	11.365702
9.544082	11.576545
9.009266	9.605596
9.726552	9.426719
9.495888	10.626624
8.683982	9.337864
8.322105	8.631099
8.887895	8.644931
8.662659	11.373025
9.263321	7.536016
7.802624	7.171625
8.773183	8.561565
8.730443	10.197596
8.942915	7.758383
8.057618	8.774996
8.112081	8.202349
10.378884	12.103755
9.248876	8.637249
9.739599	9.708576
8.126345	8.278487
8.894788	7.966117
9.683165	9.019221
10.886957	12.053843
9.668852	10.902132
7.486692	6.471138
8.794850	9.173609
8.835915	8.296727
9.443984	11.375344
8.696621	6.434580
9.645560	9.233722
9.623857	7.915590
10.840632	12.620268
7.298135	7.356141
9.639644	8.902389
9.849802	7.682624
10.609964	10.259615
9.768229	11.382811
7.646351	7.571849
10.230300	9.470859
8.224402	8.496866
6.879671	8.393648
7.976247	8.667221
9.183268	8.694550
11.471853	12.786280
10.428349	10.615726
8.090828	5.902504
9.738627	8.485792
8.139709	8.396333
9.508055	8.990529
8.857260	8.497732
8.902558	7.014433
9.660607	11.040833
8.772221	10.512150
11.020038	9.354134
7.918527	7.742062
7.630835	7.756260
11.043272	11.041613
9.299376	8.674157
9.795087	8.431837
9.415683	8.312101
7.942037	6.942913
9.724790	11.766496
10.222032	11.550876
8.894163	8.306020
8.394309	8.070420
9.012776	6.880548
9.661093	10.138921
9.896472	9.762372
9.135628	8.759928
8.762656	10.306028
8.602473	8.861956
10.085297	10.464774
10.644983	10.945767
9.034571	8.391668
8.602920	8.501944
8.224766	7.402758
8.755050	9.431085
9.669937	8.641049
10.693530	10.287124
9.462806	7.611153
9.287707	10.082363
10.941260	10.783728
9.263080	7.913328
10.167111	10.225338
8.783830	9.465345
8.958624	8.662136
9.841649	9.926781
7.205691	6.790638
8.629089	9.135461
7.469440	8.450442
8.179133	7.790434
8.083984	7.875520
9.271300	8.135359
8.652349	8.254397
7.983920	6.609684
7.836860	9.785238
7.418535	7.011256
8.458288	10.095364
9.387605	9.726911
8.663951	8.206705
10.146507	11.698577
8.937103	10.990924
11.218687	11.141945
8.363142	9.106936
7.877643	7.122922
9.620978	9.905689
9.509649	10.773209
6.748743	6.705385
9.300919	8.085029
9.332257	9.818791
7.898610	8.366643
9.841914	9.480675
6.920484	8.959501
8.544713	9.563136
8.162266	6.715277
8.659552	9.282008
10.673398	13.174824
9.024000	10.379238
8.183292	6.647572
10.544919	10.649602
7.201266	6.529605
9.557407	11.096821
8.304605	6.940929
9.742855	9.920897
10.024587	9.645222
10.002296	9.998940
8.965876	8.665419
7.823136	6.949572
8.125088	7.654065
6.569589	6.046863
10.195497	8.689129
11.730011	10.374221
8.739105	7.457571
9.820059	10.278526
9.547456	10.398198
8.375072	8.416302
8.889533	8.308929
8.861201	9.290408
12.677687	12.788463
9.100735	8.620537
7.728350	6.328219
7.955373	8.355028
8.733352	8.645414
10.257527	11.191813
9.246413	9.497014
9.745302	9.642035
7.785652	8.147621
7.431673	8.566399
8.654384	8.466701
8.475392	6.744677
9.968440	10.765192
10.163616	10.806963
10.238135	10.036636
9.902889	10.746730
9.523850	8.749708
9.214363	9.149178
9.266040	10.841502
8.494292	7.770942
10.821158	10.410192
8.645888	7.970308
9.885204	10.098080
9.084990	10.886349
9.277874	8.871449
8.135131	7.137064
7.917379	9.080522
9.685586	8.822850
8.558141	7.848112
9.502917	10.061255
6.409004	5.164774
10.149235	10.579951
7.847304	8.411351
8.846930	6.819939
8.675153	9.411147
9.476276	9.061508
11.099184	10.644263
8.792411	10.379405
8.400418	7.072706
8.555713	7.923805
8.024763	8.426993
8.642696	10.453412
7.906117	7.920408
8.793393	9.722878
8.280364	7.669854
9.387766	9.706245
9.626853	10.762499
10.163631	10.919007
9.375543	11.513524
9.309440	8.575699
10.055329	10.297255
8.706241	9.097172
10.032934	11.951897
10.812974	11.311435
10.352603	10.819865
8.276870	9.055403
8.397389	7.944434
9.371741	10.395790
10.825710	10.144099
9.158483	11.385382
10.658639	11.389856
8.091762	6.631039
10.734892	10.054598
11.535880	11.604912
9.799077	11.371677
8.478725	9.078455
9.399902	8.947744
7.305377	8.144973
7.613377	6.668798
10.681308	10.830845
9.973855	10.004133
9.369918	7.855433
8.838223	7.429033
9.521831	10.623930
9.724419	10.447452
8.890224	9.275923
9.932763	11.589953
10.839337	9.051250
8.497708	7.521701
8.440236	8.705670
9.063566	9.755744
8.449647	8.929485
8.554576	8.063231
10.348606	10.550718
5.985254	5.186844
9.931937	10.175582
9.854922	9.201393
9.114580	9.134215
10.334899	8.543604

  

import matplotlib
import matplotlib.pyplot as plt

dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()

  

結果如下圖:

 

 參考文獻:

http://www.360doc.com/content/13/1124/02/9482_331688889.shtml

 http://www.docin.com/p-160874280.html

https://www.zhihu.com/question/54100505/answer/432025686