通俗解釋如何理解主成分分析PCA,Python實現PCA主成分分析2維降到1維

知道IEEE這個世界最大電子電氣學術組織禁止華爲資助和中國某些一流大學教授參與審稿這個消息我是憤怒的。我也是無奈的,學校考覈必須發論文到這兒,不得不發。IEEE上面的論文中國人幾乎佔了三成(美國人搞學術的很少的基本是做金融法律醫生這種行業)。中國在校的就要三千多萬大學生,一旦國家宣佈IEEE期刊不參與學術考覈,都不投IEEE這是何其壯觀。從這個貿易戰看:強權即是真理,沒有所謂的自由貿易和平等。中國之大已容不下一個安靜的鍵盤。不過是又一次鴉片戰爭。除了憤怒還是憤怒,除了一心圖強外還是一心圖強中華文明三四千年的歷史都是世界頂級,美國人區區100多年第一就想再佔100年這不是無知麼中國人有13億人,是美國人的4倍還要多,4個抵1個也是必然會超過美國
2019年5月29日 IEEE宣佈禁止任何受華爲資助的教授或學生參與IEEE審稿。聽到這個消息我是憤怒的,說好的科學無國界呢?
梳理下這個過程:
2018.12.1,華爲CFO(任正非之女)被美國下令逮捕
2018.12.1 對芯片重大貢獻的華人張首晟在美國身亡,就在2年前獲得中國國家科學技術獎(中國科技最高獎,最高領導人親自頒獎,獎金200萬美金)
2019年5月 美國撕毀兩國元首已經基本確定的協議,對中國徵收25%關稅。
2019年5月中旬 美國禁止全世界任何企業與華爲接觸或者提供設備,也禁止購買華爲手機或通訊設備。理由:“國家安全”(距離美國棱鏡門用思科通訊設備和Google監聽全世界這個事件不過幾年美國人就忘了自己幹了什麼事。)同時禁止歐洲其他國家使用華爲提供的5G服務。
2019年5月中下旬,Microsoft,ARM,Google紛紛宣佈停止和華爲任何商業來往,同時Google禁止華爲手機使用Google服務
2019年5月底, IEEE(世界上最大電子電氣學術機構禁止任何受華爲資助的教授參與審稿禁止其他高校或企業與中國的一些高校合作


PCA用來可以降維。降低數據維度既可以減少計算量,也可以降低噪聲。最後本文使用了Python對PCA進行實現。

1. 直觀理解PCA主成分分析是什麼?

Principal Component Analysis(PCA)主成分分析它本質是把數據視作一個橢球。二維的話就是一個橢圓。我們知道橢球它有長軸和短軸。如果3維的橢球某個短軸非常短,那麼我們是不是可以把這個短軸視作沒有?這樣一個橢球就降維成了一個2維的橢圓。這就是PCA的原理。爲了方便計算。首先需要對數據進行歸一化,讓橢圓的圓心在原點**。那麼我們怎麼知道哪個短軸非常短呢?看這個軸方向數據的方差。方差越小軸越短。也就是說方差越大證明這個維度的數據越重要即是主成分。**方差越小這個維度越不重要(對應橢圓軸越短),那麼這個維度可以捨棄。方差最大的那個數據投影到第一個座標(也叫做第一主成分),第二大投影到第二個維度的座標,以此類推看下面這張圖,粉紅色那條線就是第一主成分。可以看到當座標軸轉到與粉紅色重合時,各點在第一座標軸上投影點分佈式最分散的(方差越大波動越大)。注意:第二主成分必須要和第一主成分垂直(第二主成分是原先的點在第二座標軸上投影后的點),而且它要佔用下一個最大方差。當然下面這個圖是二維的,將它降維當然只有一維。所以只有第一主成分,沒有其他主成分。

2. 逐步理解PCA的執行過程

2.1 歸一化(讓橢圓圓心移動到原點)

在這裏插入圖片描述

2.2 計算協方差矩陣

如果是一維的話協方差就是方差(不是矩陣)。多維的話就是協方差矩陣了。如果是一維的話協方差就是方差。協方差就是用來分析兩個維度之間的相關性。協方差大於0則兩個維度正相關,小於0則是負相關。等於0則是不相干。下面是三維的情況下協方差矩陣。注意Cov(a,b)= Cov(b,a),所以下面這個協方差矩陣是一個對稱矩陣。大致理解方差是協方差矩陣在一維情況下的特殊情況就可以了。然後可以看後面的了
在這裏插入圖片描述
在這裏插入圖片描述

2.3 計算協方差矩陣的特徵值,將特徵值從高到低排序,然後每個特徵值對應一個特徵向量。第k個特徵向量與原先數據內積就是對應的第k個主成分

假如原數據一共有10維,如果我想降到4維。那麼就取前4大的特徵值對應的特徵向量。這4個特徵向量每個特徵向量都是10維的。然後用這個4個特徵向量與原先數據點內積,得到4個數。所有的原數據點都這樣計算後就得到了第一第二第三第四主成分。這樣就把10維降低到4維。(當然前面這個過程一般是用矩陣批量運算)

那麼怎麼計算我保留了多少信息,扔掉了多少信息?答:“計算保留的那4個特徵值,佔10個總特徵值的比例即是保留了百分之幾的信息”

3. Python編程實踐,2維降到1維

在這裏插入圖片描述
在這裏插入圖片描述
代碼如下所示:

# -*- coding: utf-8 -*-
"""
Created on Wed May 29 20:50:26 2019

@author: @Ai醬
"""
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,200) + np.random.rand(200)/5
y = 0.233 * x + np.random.rand(200)/3
# 歸一化
x = (x - np.mean(x))/np.std(x)
y = (y - np.mean(y))/np.std(y)
#plt.scatter(x,y)

    

# 1. 計算協方差矩陣
cov_mat = np.cov(x,y)

# 2. 計算協方差矩陣的特徵值
eigenvalues,eigenvectors = np.linalg.eig(cov_mat)
k = 1 # 降維後的目標維度
# 對特徵值進行排序,取前k個
topk = np.argsort(eigenvalues)[0:k]
# 前k個最大的特徵值對應的特徵向量與原矩陣相乘
data = np.stack((x,y),axis=-1)
result = np.matmul(data,eigenvectors[topk].T)

plt.plot(result[:,0],result[:,0].shape[0]*[1],'.')#繪製一維圖

歡迎關注知乎專欄:《適合初學者的神經網絡機器學習理論與實踐
參考文獻:
[1] A step by step explanation of Principal Component Analysis

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章