PCA演算法(主成分分析)

2021-07-10 22:38:57 字數 3186 閱讀 4063

principle component analysis 顧名思義,是通過分析向量空間的主成分,將主成分提取出來,不重要的成分略去,從而達到降維壓縮資訊的目的。

那什麼才是主成分呢?大家應該知道,乙個空間會有自己的一組基向量,空間中的任何乙個向量都可以通過基向量的組合來表示。

舉個栗子,假如我們有一組2維的點,那麼我們可以找到2個基向量,讓這一組點對著這2個基向量進行投影。每個基向量上,投影後的點越分散,這個基向量就越重要。也就是主成分。不明白的看下圖。(原諒我的靈魂畫作)

紅色的點就是已有的一組2維點,黃色和藍色的線代表兩個基向量的方向。如果我們要把紅色的點從2維降到1維,向哪個方向投影才能儲存更多的資訊呢?直觀上看,當然是黃向量比較好,紅點在黃線上的投影很分散,而在藍線上的投影很多會重疊在一起。黃向量就是比藍向量更主要的成分。

好了,我們現在知道什麼是主成分了,那怎麼才能把它提取出來呢?一般是通過對紅點各維的協方差矩陣進行特徵分解,選取最大的幾個特徵值對應的特徵向量,組成低維空間的一組基向量。再將原始的紅點投影到這組低維基向量上,就得到了紅點降維後的座標。這中間涉及到一些數學的計算和解釋,就放在下面了。

向量的內積相當於投影,

a * b = |a||b|cos(a)
|b|=1時,

a * b= |a|cos(a)
此時,a和b的內積相當於a向b方向投影的長度。

另外,當新基的原點與原基的原點不同時,要先進行變換使原點重合。

在我們常用的笛卡爾座標系中,一點(x,y)可以分解為

x = r * cos(θ)   y = r * sin(θ)
相當於把向量(x,y)投影到兩個基向量上,

(1,0) 和 (0,1)
x和y相當於投影後的長度。

乙個向量的準確描述需要給出一組基,以及向量在各個基方向上的投影長度。

注意:不管變換什麼樣的基向量,向量相對於原點的位置是不變的。

例:將基本基上的座標(3,2)變換為基(1/√2,1/√2)、(-1/√2,(1/√2))的座標。

(注意,新基的座標是在基本基上確定的) ⎛⎝

⎜⎜⎜1

2√−1

2√12

√12√

⎞⎠⎟⎟

⎟∗(3

2)=⎛

⎝⎜⎜⎜

52√1

2√⎞⎠

⎟⎟⎟

(52√

,12√

) 即為變換後的座標。

m個n維向量(組成矩陣a),將其變到r個n維基(組成矩陣b)表示的新空間中

矩陣ab中第m列為a中第m列的變換結果。

兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。

為實現降維,就要使降維後的結果盡量的分散(重疊太多就不能很好地復原回去),也就是降維後的方差盡量大。兩個欄位的協方差表示其相關性,

理解協方差矩陣的關鍵就在於牢記它計算的是不同維度之間的協方差,而不是不同樣本之間,拿到乙個樣本矩陣,我們最先要明確的就是一行是乙個樣本還是乙個維度。

a,b兩個字段組成x,

(相當於m個點的x和y值)

對角線上的為每個字段各自的方差,其它元素為協方差。

我們要使最後各個方向(字段)的差距大,如果各個方向相似,這個投影是沒有太大作用的。也就是說協方差盡可能的為0。

x:原始矩陣

c : x對應的協方差矩陣

p : 新基的矩陣

y = px

y : x對p做基變換後的矩陣

d : y的協方差矩陣

只要找到一組基的矩陣p,使得d為對角矩陣(y的協方差為0),並且對角元素按從大到小依次排列,那麼p的前k行就是要尋找的基(從n維降到k維)。

又因為c是對稱矩陣,滿足,

(e為正交矩陣)

可得,p=e

t 所以,我們可以通過對x的協方差矩陣c的特徵分解,來得到e。取e中特徵值最大的幾個特徵值對應的基向量組成p,從而得到降維後的矩陣y。

在網上看到了乙個pca演算法步驟,覺得挺清楚就貼上過來了。

注:k的選擇。一般選擇佔所有能量99%的特徵值。

自己寫了乙個簡單的python函式實現pca,具體的解釋可以看函式前面的注釋~

"""

author: totodum

program: linear_pca.py

description: linear principle component analysis

"""from numpy import *

from numpy.linalg import *

'''pca takes an array of points, each row is a single point. and reduce the dimension

of the points to k-d.

return points of k-d.

'''def

pca(x, k):

m = x.shape[0]

c = dot(transpose(x), x) / m # coefficient

[u, s, v] = svd(c)

p = u[:, 0:k]

y = dot(x, p)

return y

這個是做作業的效果圖(3維降到2維)

參考:

pca主成分分析 PCA主成分分析(中)

矩陣 matrix,很容易讓人們想到那部著名的科幻電影 駭客帝國 事實上,我們又何嘗不是真的生活在matrix中。機器學習處理的大多數資料,都是以 矩陣 形式儲存的。矩陣是向量的組合,而乙個向量代表一組資料,資料又是多維度的。比如每個人的都具有身高 體重 長相 性情等多個維度的資訊資料,而這些多維度...

PCA 主成分分析 演算法

因為對pca演算法的好奇,所以就寫一篇筆記記錄一下自己學習的過程。三 小結 在現實生活中,我們人類總會存在一種這樣的習慣 關注自己所關心的,與此同時會忽略掉自己所不關心的事情。就像看一場足球比賽一樣,我們面對的顯示螢幕包含了幾十萬個畫素,那麼這其中的人或者球只佔了其中的一部分,那麼我們自然而然的會對...

PCA(主成分分析)演算法

pca演算法,從名字看也知道是用於降維的,通過提取主特徵和主特徵向量,丟掉次要的特徵和特徵向量,實現降維。pca演算法流程 python 實現流程 1 零均值化 假如原始資料集為矩陣datamat,datamat中每一行代表乙個樣本,每一列代表乙個特徵。零均值化就是求每一列的平均值,然後該列上的所有...