[筆記]主成分分析(PCA) - iT 邦幫忙
文章推薦指數: 80 %
這次介紹,主成分分析英文名為Principal components analysis,簡稱為PCA,而這次一樣自己的觀點簡單的敘述,但還是會介紹一些數學公式,但其根本也能 ...
1
[筆記]主成分分析(PCA)
python3
machinelearning
Kevin
2019-05-2420:52:46‧13841瀏覽
前言
這次介紹,主成分分析英文名為Principalcomponentsanalysis,簡稱為PCA,而這次一樣自己的觀點簡單的敘述,但還是會介紹一些數學公式,但其根本也能用最後結果簡單的說明。
投影向量
參考[1]介紹主要有兩種向量定義,一為代數定義,二為幾何定義。
代數定義
使用點對點相乘後加總,而這裡用矩陣的方式如下圖,A的反轉矩陣乘上B(原始數據為垂直列向量,所以將A做轉置),結果與向量點對點相同。
幾何定義
在歐幾里得定義點積[1]的公式為,(來源:[1]),與上列代數定義兩者相等,而代數除上向量a*b長度後則可以得到角度。
純量投影
在歐幾里得當中垂直投影如下圖,向量a長度乘上costheta,即可得到鄰邊,而鄰邊就是a投影在b的長度。
投影,來源:[1]。
PCA公式
假設矩陣資料為A,投影矩陣為B,第一步先將每個垂直列零均值化(也能水平行,只是計算要反轉矩陣),此步驟能將計算變異數的偏移值歸零,在二維意旨通過原點(能用直線公式理解為,y=ax+b,b為0)。
這裡介紹兩種推導方式。
方法一
[2]的推導方式,沒有方法二較詳細推導,也簡單容易理解。
變異數
1.投影做內積公式。
在AdaBoost已經有介紹倒變異數這裡就跳過公式。
在二維當中PCA降維利用了垂直投影到B向量並計算距離的方式(計算距離從二維變一維),來代替目前的(x,y)表示方式,如下圖。
紅色線為零均值化。
投影。
使用變異數來計算投影後差異,之後再找出向量B的最大極值(投影損失最少),計算變異數的公式如下,(偏移量為0因做過零均值化)。
這裡使用矩陣所以公式如下圖,B轉置乘上A轉為水平行,所以右邊轉置,轉置後使用特性,(B轉置A)轉置=A轉置B詳細請看[4]。
由上述可得知,公式最後為B零均值化的共變異數矩陣B轉置,共變異數矩陣在影像風格轉換也有介紹過(協方差矩陣)。
拉格朗日乘數
2.求投影到B時變異數最大公式(投影越大LOSS也相對較少)。
求最大化的條件為B^2為1(因條件模長=1),如下圖。
投影,來源:[2]。
求最大化可使用拉格朗日乘數來取得最佳解,可先看[5]的例子了解公式使用,有興趣也可以看推導。
求最大值所以扣掉特徵如下方公式。
求微分,即可得到極值,可以看到這裡的極值就是共變異數矩陣的特徵值。
帶入原式,這裡可能特徵值為常量所以矩陣可交換,如下圖。
方法二
方法二是來自於[3],這裡用更簡單的方式解釋,讓讀者能更加理解,而[3]是使用樣本標準差下去計算所以平均的分母都會-1。
樣本平均數向量
下面是證明樣本平均數公式(x-a),a=m(樣本的平均)。
如下圖所式。
將原先公式x加上m,a減掉m(因為要證明所以將m代數方式帶入,並不會影響結果)。
展開,當作矩陣所以有的乘法可轉為轉置矩陣。
整理公式。
因假設a=m,所以後項都是0,最終解果(x-a)^2=(x-m)^2,也就是所謂的離差[2],離差AdaBoost有介紹過。
樣本平均數向量,來源:[3]。
均方誤差(方法一計算變異量方式)
此方法為了計算誤差,所以進行投射到一直線上面,而條件為,意指映射到模長=1。
一開始都先將資料零均值化使得資料總和=0,而原先x可由映射後的權重來還原,公式為,,w為向量,c為純量,m和x的距離為|c|,這公式能理解出映射的簡易過程(能用直線公式來看待會更加容易理解)。
既然知道大概映射的過程,接著就是要求出c這個值,計算出誤差總和最小的即是我們要找的c,這時候就可以使用偏微分=0(變化等於0,在人工智慧章節有解釋過),公式如下圖。
將上述投影反推x公式扣掉原先x,使用均方誤差計算。
整理公式,使得x-m再一起方便後續處理。
展開公式。
來源[3]。
對c求偏微分(極小值,最小變化)。
1.求偏微分。
2.得出相等式子。
來源[3]。
將最小化相等公式帶入原先公式(取代x-m)。
整理公式,並將c改為(x-m)。
展開左邊sigma,並將w轉置*(x-m)位置互換,互換則兩者都要轉置。
整理公式,使得中間為x零均值化的共變異數矩陣(對稱半正定性質,詳細說明可上維基)。
來源[3]。
這裡的S即是共變異數矩陣,左邊sigma為扣掉均值總和=0。
而[3]解釋數據集的總變異量(即離差平方和)是一常數,所以最小化E(w)等價於最大化w轉置SW。
而這裡簡單解釋為,因E(w)=-w轉置SW,所以w轉置SW最大化等於最小化E(w)。
來源[3]。
求最大即帶入方法一所講到的拉格朗日乘數,求偏微分,即可得到S的對應公式。
來源[3]。
解到這一步就可以得知w為特徵向量,所以只要求出共變異數矩陣的特徵向量和特徵值即可。
PCA降維
以上介紹的公式只需要將特徵值大小排序,再取出指定維度n的前n個特徵向量來做相乘。
而最終所損失的量為,指定n維的特徵值和/全部特徵值和,如下圖。
來源[3]。
PCA實作
映射向量圖
首先來可視化映射向量,這裡有兩個紅色向量如下圖,可以想像為較長的是x映射,短的為y映射,因為x的值分散較大所以特徵值會較大,而y則較小。
如下圖。
建立資料。
計算共變異數矩陣。
得取特徵量和特徵向量(可以自己實作,但用原本作法會較慢,numpy有使用效率較高的公式,有點忘記使用那些了,有興趣可上網查詢)。
畫出結果。
importnumpyasnp
importmatplotlib.pyplotasplt
size=100
data_x=np.random.uniform(-10.0,10.0,size=(size,1))
data_y=data_x-np.random.uniform(-2.0,2.0,size=(size,1))
data=np.hstack((data_x,data_y))
cov_matrix=np.cov(data,rowvar=0)
eig_val,eig_vec=np.linalg.eig(cov_matrix)
plt.plot([eig_vec[0,0]*12,0],[eig_vec[0,1]*12,0],color='red')
plt.plot([eig_vec[1,0]*2,0],[eig_vec[1,1]*2,0],color='orange')
plt.plot(data[:,0],data[:,1],'o',color='blue')
plt.xlim(-12,12)
plt.ylim(-12,12)
plt.show()
PCA
接著實作PCA,使用上述的公式,最後並帶回計算是否會是原始資料。
結果如下圖。
黑點為映射資料。
創建資料。
零均質化。
計算共變異矩陣。
計算特徵值和特徵向量。
依照特徵值排序特徵向量。
這裡選擇維度為2,所以eig_val_sort_indexs[:2]取出前兩個特徵向量做乘法(降一維改1),結果即是映射後資料。
依照上述公式,乘上反轉矩陣(推導時先乘矩陣再乘上原始矩陣,主要看資料是行還是列),m+cw,c=w轉置*(資料零均值),即是原先數據。
importnumpyasnp
importmatplotlib.pyplotasplt
defzero_mean(data):
mean=np.mean(data,axis=0)
zero_data=data-mean
returnzero_data
size=100
data_x=np.random.uniform(-10.0,10.0,size=(size,1))
data_y=data_x-np.random.uniform(-2.0,2.0,size=(size,1))
data=np.hstack((data_x,data_y))
zero_data=zero_mean(data)
cov_data=np.cov(zero_data,rowvar=0)
eig_val,eig_vec=np.linalg.eig(cov_data)
eig_val_sort_indexs=np.argsort(-eig_val)
eig_vec_sort=eig_vec[:,eig_val_sort_indexs[:2]]
mapping_data=np.dot(zero_data,eig_vec_sort)
print(zero_data)
print(np.dot(mapping_data,eig_vec_sort.T))
plt.plot([eig_vec[0,0]*12,0],[eig_vec[0,1]*12,0],color='red')
plt.plot([eig_vec[1,0]*2,0],[eig_vec[1,1]*2,0],color='orange')
plt.plot(zero_data[:,0],zero_data[:,1],'o',color='blue')
plt.plot(mapping_data[:,0],mapping_data[:,1],'o',color='black')
plt.xlim(-12,12)
plt.ylim(-12,12)
plt.show()
總結
方法二的方法很詳細,最後推導得知w為特徵向量,最後總結出簡單的解釋。
(解釋只是換個想法,實際上都要用以上數學來解釋,若上述推導能理解,這裡能跳過)。
將資料零均質化,解釋為在二維中為了將特徵線通過原點,意旨任何資料都是通過原點,類似正規化。
共變異數矩陣,解釋為在二維中計算x和y之間的離散數值。
計算出離散數值特徵,解釋為在二維中x和y兩者的影響哪個較大,並可得到兩者的獨立特徵向量。
資料乘上特徵向量,解釋為在二維中在獨立的向量當中是如何表示。
結語
在很久之前就聽過PCA,但每次都是看看,這次終於有機會將它完成,接著有時間還會繼續介紹各種算法,可能有的解釋並不是很好,但這主要是自己往後回來看原理能快速理解,請多包涵。
有問題或錯誤歡迎糾正討論。
參考文獻
[1]維基百科(2019)內積from:https://zh.wikipedia.org/wiki/%E7%82%B9%E7%A7%AF(2019.05.20)
[2]TommyHuang(2018)機器/統計學習:主成分分析(PrincipalComponentAnalysis,PCA)from:https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E7%B5%B1%E8%A8%88%E5%AD%B8%E7%BF%92-%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90-principle-component-analysis-pca-58229cd26e71
[3]ccjou(2013)主成分分析|線代啟示錄form:https://ccjou.wordpress.com/2013/04/15/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90/
[4]ccjou(2013)主成分分析|轉置矩陣的意義form:https://ccjou.wordpress.com/2010/05/20/%E8%BD%89%E7%BD%AE%E7%9F%A9%E9%99%A3%E7%9A%84%E6%84%8F%E7%BE%A9/
[5]維基百科(2019)拉格朗日乘數from:https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0#%E8%AF%81%E6%98%8E
[6]https://upmath.me/
留言
追蹤
檢舉
尚未有邦友留言
立即登入留言
相關文章
DAY[6]-數據前處理(1)資料類型與資料操作
DAY[7]-數據前處理(2)補值與EDA(1)
DAY[8]-數據前處理(2)補值與EDA(2)
DAY[9]-數據前處理(3)特徵新增與調整
DAY[10]-監督式機器學習
DAY[11]-機器學習(2)非監督式機器學習
DAY[12]-機器學習(3)整體學習
DAY[13]-機器學習(4)競賽常勝軍(xgboost&lightgbm)
DAY[20]-Kaggle實戰-資料前處理與EDA
DAY[30]-機器學習介紹與實戰-心得
iT邦幫忙鐵人賽
參賽組數
1087組
團體組數
52組
累計文章數
20481篇
完賽人數
572人
鐵人賽最新文章
【Day31】新加坡工作後續的時程
重構原本的內容(golang)(Day22)
Laravel-jQueryAJAX範例
2022/1/2更新
.NetCoreWebApi_筆記21_Swagger及OpenAPI介紹與配置使用方式_API管理與測試探討
.NetCoreWebApi_筆記20_api結合ADO.NET資料庫操作part8_新聞文章查詢
.NetCoreWebApi_筆記19_api結合ADO.NET資料庫操作part7_新聞文章的編輯更新與刪除
.NetCoreWebApi_筆記18_api結合ADO.NET資料庫操作part6_新聞文章表格陳列查詢
.NetCoreWebApi_筆記17_api結合ADO.NET資料庫操作part5_新聞文章新增_新聞類別元素透過API綁定方式
[Bonus系列]-使用useCallback&useMemo的正確時機是什麼?
前往鐵人賽
技術推廣專區
[Day2]抓取每日收盤價
[Day1]基本工具安裝
利用python取得永豐銀行API的Nonce
[Day03]tinyML開發板介紹
永豐金融API測試員
[Day01]在享受tinyML這道美食之前
[Day3]使用ta-lib製作指標
[Day4]函數打包與買進持有報酬率試算
計算API所需要的參數:HashID
計算API所需要的參數:IV
前往鐵人賽
熱門問題
怎麼樣將系統遷移到SSD
我好像不小心把windows系統刪掉了…
伺服器HA軟體
Exchange2016&2019無法正常收信(無錯誤訊息)(已解決)(MicrosoftExchangeyear2022bug)
新手想當AI工程師請益?
想問如何讓筆電顯示出畫面
BIOS抓不到電腦有1長音2短音叫聲
共用印表機無法連線
yahoo搜尋引擎跳過php登入後的session機制,直接讀取用session保護的頁面資料
關於for迴圈取得form裡面POST的資料(更*找到錯誤了,謝謝)
IT邦幫忙
站方公告
【2021iThome鐵人賽】登登登!究竟獎落誰家,2021iThome鐵人賽得獎名單正式揭曉
熱門tag
看更多
13th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
2018鐵人賽
javascript
2017鐵人賽
windows
php
python
windowsserver
linux
c#
程式設計
資訊安全
css
vue.js
sql
分享
熱門回答
怎麼樣將系統遷移到SSD
關於團隊合作
共用印表機無法連線
BIOS抓不到電腦有1長音2短音叫聲
yahoo搜尋引擎跳過php登入後的session機制,直接讀取用session保護的頁面資料
伺服器HA軟體
升級Windows11
MQTT伺服器連不上
python爬蟲書籍推薦
[已解決]急!!!csv匯入MySQLWorkbench出現錯誤訊息請問如何解決
熱門文章
2022/1/2更新
30天程式語言研究
[DAY3]SQL新手的懶人筆記
Laravel-jQueryAJAX範例
[詢問]網路分析儀
django新手村12-----黑名單
【Day31】新加坡工作後續的時程
Java學習之路08---方法
django新手村14-----添加資料
30天程式語言研究
一週點數排行
更多點數排行
海綿寶寶(antijava)
Gary(mosbbs)
raytracy(raytracy)
純真的人(jer5173)
㊣浩瀚星空㊣(yoching)
ccenjor(ccenjor)
Samuel(kuanyu)
juck30808(juck30808)
居然解出來了(partyyaya)
huahualiu(ffang55tw)
×
At
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{result.label}}
{{result.account}}
關閉
延伸文章資訊
- 1PCA 主成分分析(Principal Component Analysis) - HackMD
PCA 主成分分析(Principal Component Analysis) · O&M和environmental survey方向完全相反,代表兩個變數負相關 · cabel和enviro...
- 2主成份分析(Principal Component Analysis, PCA)
主成份分析(Principal. Component Analysis, PCA). 它是對多個變數決定各變數權重而成. 加權平均,依此訂出總指標. 經由線性組合而得的主成份,能保有原.
- 3第81 章主成分分析Principal Component Analysis | 醫學統計學
第81 章 主成分分析Principal Component Analysis. A big computer, a complex algorithm and a long time does...
- 4主成分分析- 維基百科,自由的百科全書
使用統計方法計算PCA
- 5[筆記]主成分分析(PCA) - iT 邦幫忙
這次介紹,主成分分析英文名為Principal components analysis,簡稱為PCA,而這次一樣自己的觀點簡單的敘述,但還是會介紹一些數學公式,但其根本也能 ...