python pca降維_機器學習的降維打擊

f5f1d57fc4c3199715ffe7d10a9de10d.png
6f817faab5a87726afae5fd0862b3c88.gif
326ea35a681fe47e1e907114e14acc73.png

文章發布于公號【數智物語】 (ID:decision_engine),關注公號不錯過每一篇干貨。

來源 | SAMshare(id:SAMshare)

作者 | samshare

93ef0359b34384920c52bf7b9045049d.png

"本次主要講解的內容就是特征降維,主要涉及PCA以及一些常見分析方法。"

01

Index

一,PCA降維算法

 1. 內積與投影

 2. 基與基變換

 3. 方差

 4. 協方差

 5. 協方差矩陣

 6. 協方差矩陣對角化

 7. PCA算法步驟

 8. PCA實例

 9. PCA的Python操作

二,LDA降維算法

 1. LDA介紹

 2. LDA的優缺點

 3. LDA的Python操作

在機器學習中,我們有的時候會遇到維度災難,當模型的訓練入參有很多的時候,往往是需要很多的時間和資源去訓練的,而這不是我們想要看到的結果。一般情況下,我們都是會對源數據進行特征處理,提取對預測更加有效的特征。

有的時候,我們會得到比較高維的特征向量,而這里面往往包含很多的噪聲與冗余數據,所以我們需要通過降維的方式去獲取特征更加有效的信息,一來提高特征表達能力,二來提高模型訓練的效率。

02

PCA降維算法

PCA(Principal Components Analysis),即主成分分析,是降維操作中最經典的方法,它是一種線性的、無監督、全局性的降維算法,旨在找到數據中的"主要成分",提取主成分從而達到降維的目的。PCA是一種無監督算法,也就是我們不需要標簽也能對數據做降維,這就使得其應用范圍更加廣泛了,但是PCA也有一個問題,原來的數據中比如包括了年齡,性別,身高等指標降維后的數據既然維度變小了,那么每一維都是什么含義呢?這個就很難解釋了,所以PCA本質來說是無法解釋降維后的數據的物理含義。

在了解PCA之前,有一些基礎的名詞需要溫習一下:

01

內積與投影

內積運算將兩個向量映射為一個實數,下面是兩個維數相同的向量的內積:

584702f5eb5be991defb82354e4cf395.png

假設存在兩個點A,B,其在坐標軸的位置如下圖:

ec75d45442e18af66dd7fd4ee8afa5ce.png

我們從A向B引一條垂線,也就是A在B上的投影,其夾角為a,則投影的矢量長度為|A|cos(a),其中

94218c7456aca1f13ba9798eec9656ae.png

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

而內積的另一種表現形式為:

7206701275a887bf6a80657ed293373d.png

也就是說,當B的模為1的時候,也就是單位向量的時候,內積可以表示為:

fc9308a333077fc97a47a0fe88982f34.png

也就是A與B的內積值等于A向B所在直線投影的矢量長度。

02

基與基變換

基可以理解為單位向量,基都是正交的(即內積為0,直觀來說就是相互垂直),并且是線性無關的。

基變換指的是當前向量和一個基進行內積運算,得到的結果作為新的坐標分量。

假設存在一個點(3,2),一般我們都會取(1,0)和(0,1)為基,也就是我們的X和Y軸方向。如果我們取(1,1)和(-1,1)為我們的基,但我們希望基的模為1,這樣子會方便計算,所以可以除以當前的模長,所以上面的基就變成了:

1e55e30d7104e5e1b3a041cef3570189.png

如下圖所示:

e281f5b77adb4090de214e568e85aaf1.png

所以,進行基變換,只需要進行一次內積運算:

e430ee4b10bb35ac75f26f2c00c54b82.png

03

方差

一個字段的方差可以看做是每個元素與字段均值的差的平方和的均值,即:

c801d24b666942652f0f4caf5b8b61e5.png

一般我們都會把均值為化為0,即進行一次變換,所以方差可以表示為:

cd17ee3bf94dae2cf2ade20ab045f7fc.png

04

協方差

如果單純地選擇方差最大的方向,則無法保證兩個字段之間相互獨立,因為我們需要的是盡可能多地保留原始信息,但又是相互獨立,這里我們引入一下概念,協方差,用來表示兩個字段的相關性,公式為:

5c84e445499e961b0e5b93a1c2083cb2.png

協方差:度量各個維度偏離其均值的程度。協方差的值如果為正值,則說明兩者是正相關的(從協方差可以引出“相關系數”的定義),結果為負值就說明負相關的,如果為0,也是就是統計上說的“相互獨立”。

所以,我們的目標就是讓兩個字段的協方差為0,為了協方差為0,選擇第二個基的時候,必須要在第一個基的正交方向上選擇。

我們說的PCA降維,就是把N維的特征,降到K維(0 < K < N),也就是說要選擇k個單位正交基,并且盡可能讓方差最大化。

05

協方差矩陣

在統計學與概率論中,協方差矩陣的每個元素是各個向量元素之間的協方差,是從標量隨機變量到高維度隨機向量的自然推廣。

假設存在矩陣X:

c8ad5de8944531a5abb6b8357c64fd4c.png

其協方差矩陣為:

2af98c86f2c45fbe7d3f2cf5ebaec946.png

可以看出,協方差矩陣的對角線元素為兩個字段的方差,而其他元素為矩陣的協方差,按照我們之前的說法,我們需要得到協方差為0,并且方差最大的轉換。

06

協方差矩陣對角化

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

設原始數據矩陣X對應的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則Y為X對P做基變換后的數據。設Y的協方差矩陣為D,我們推導一下D與C的關系:

72d63047b6057fc5ba53629780671619.png

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

07

PCA算法步驟

設有mXn維數據。

1)將原始數據按列組成n行m列矩陣X

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

3)求出協方差矩陣C=1mXXT

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

5)將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P

6)Y=PX即為降維到k維后的數據

08

PCA實例

假設存在2維數據

64730874a4210bf6897d6a12bcc623f0.png

:,需要將其降至1維。

1)均值歸0:目前每個維度的均值均為0,無需變換。

2)求協方差矩陣

de7809cbe40b30b7f7edd5561289fe3c.png

3)求解特征值以及特征向量

75099f0663427e84d229536ecce21d5a.png
13e48a7fb80d6969b98e4bc781c977e0.png

可以參考:https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html

4)標準化特征向量

4c1fdaaeb7d44017fb014165c6452d37.png

5)得到對角矩陣P并驗證對角化

778e4c5e43328abb48a729a790e7a9b1.png
553fac17aba9ae9130c7aba8124734d7.png

6)因為需要得到1維矩陣,因此用P的第一行乘以原矩陣即可:

84228675054ae27b9ecb416f9bb67856.png

降維投影如下圖所示:

87fe841cfad20162e0fa33f1f0fda6f9.png

09

Python操作

# 使用sklearn進行PCA降維import numpy as npfrom sklearn.decomposition import PCAX = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]]) #導入數據,維度為4print('原矩陣X:', X)pca = PCA(n_components=2) #降到2維pca.fit(X) #訓練newX=pca.fit_transform(X) #降維后的數據print('貢獻率:', pca.explained_variance_ratio_)print('降維后矩陣:', newX)'''參數解釋:n_components: 我們可以利用此參數設置想要的特征維度數目,可以是int型的數字,也可以是閾值百分比,如95%,讓PCA類根據樣本特征方差來降到合適的維數,也可以指定為string類型,MLE。copy:bool類型,TRUE或者FALSE,是否將原始數據復制一份,這樣運行后原始數據值不會改變,默認為TRUE。whiten:bool類型,是否進行白化(就是對降維后的數據進行歸一化,使方差為1),默認為FALSE。如果需要后續處理可以改為TRUE。explained_variance_: 代表降為后各主成分的方差值,方差值越大,表明越重要。explained_variance_ratio_: 代表各主成分的貢獻率。inverse_transform(): 將降維后的數據轉換成原始數據,X=pca.inverse_transform(newX)。'''

output:

0629bd3fe71ea1ea97b6cf0c7cd55144.png

03

LDA降維算法

線性判別分析(Linear Discriminant Analysis,LDA)是一種有監督學習算法,也是經常被拿來降維,它和PCA的區別在于是否存在標簽,其中心思想就是—— 最大化類間距離和最小化類內距離。

b73032c7e7d617b4fe755a2433df7eb4.png

而PCA的不足在于不能很好地分開不同類別的數據,如下圖:

f3d327e039b4a39cdb2172c23c3029a5.png

LDA算法既可以用來降維,又可以用來分類,但是目前來說,主要還是用于降維。在我們進行圖像識別圖像識別相關的數據分析時,LDA是一個有力的工具。下面總結下LDA算法的優缺點:

01

優點:

1)在降維過程中可以使用類別的先驗知識經驗,而像PCA這樣的無監督學習則無法使用類別先驗知識。

2)LDA在樣本分類信息依賴均值而不是方差的時候,比PCA之類的算法較優。

02

缺點:

1)LDA不適合對非高斯分布樣本進行降維,PCA也有這個問題。

2)LDA降維最多降到類別數k-1的維數,如果我們降維的維度大于k-1,則不能使用LDA。當然目前有一些LDA的進化版算法可以繞過這個問題。

3)LDA在樣本分類信息依賴方差而不是均值的時候,降維效果不好。

4)LDA可能過度擬合數據。

03

Python操作

import numpy as npfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisX = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])y = np.array([1, 1, 1, 2, 2, 2])clf = LinearDiscriminantAnalysis()clf.fit(X, y) LinearDiscriminantAnalysis(n_components=None, priors=None, shrinkage=None, solver='svd', store_covariance=False, tol=0.0001)print(clf.predict([[-0.8, -1]]))

04

Reference

1)Reference十分鐘搞定PCA主成分分析

https://blog.csdn.net/tangyudi/article/details/80188302#comments

2)PCA的數學原理

http://blog.codinglabs.org/articles/pca-tutorial.html

85047e0c4b1d0ca2bc2e1db5da32c850.png
993d0b2da85ea8c03a1c8ba62c4b4677.png

星標我,每天多一點智慧

23cdc2984b9ef5d212d0006261704f28.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么樣的項目是成功的?

項目成功的標準是什么&#xff1f; 項目范圍控制住&#xff0c;成本沒超標&#xff0c;質量達標&#xff0c;進度按計劃&#xff0c;順利驗收。做到這些就是項目成功了嗎&#xff1f; 答案顯然是不一定&#xff01;&#xff01;! 有多少項目的成本、進度、目標都能夠嚴格按照…

ng-notadd 0.10.1,基于 Angular7 和 material2 的中后臺解決方案

更新內容修復 scss左側導航欄美化修復導航欄 2px 間隔問題技術棧TypescriptAngularMaterial2rxjsGraphql相關鏈接項目地址DEMOng-notadd-mock-serverQuick startgit clone https://github.com/notadd/ng-notadd.gitcd ng-notaddnpm installnpm start# or use ng cling serve復制…

python需要什么包裝_python學習之包裝與授權

實現授權的關鍵點就是覆蓋__getattr__()方法&#xff0c;在代碼中包含一個對getattr()內建函數的調用。 特別調用getattr()以得到默認對象屬性&#xff08;數據屬性或者方法&#xff09;并返回它以便訪問或調用。 特殊方法__getattr__()的工作方式是&#xff0c;當搜索一個屬性…

參加技術培訓前的輔導,選得對,學得好

最近幾年&#xff0c;每年都會有人問我培訓班的事情&#xff0c;我也有培訓班經歷&#xff0c;在軟件行業工作了十多年&#xff0c;每次解答培訓班的咨詢我都很認真&#xff0c;也很高興能幫到他人。 決定通過專欄的形式解答培訓班常見問題&#xff0c;我把專欄取名“技術培訓…

[算法]淺談求n范圍以內的質數(素數)

汗顏&#xff0c;數學符號表達今天才學會呀-_-# 下面是百度百科對質數的定義 質數&#xff08;prime number&#xff09;又稱素數&#xff0c;有無限個。質數定義為在大于1的自然數中&#xff0c;除了1和它本身以外不再有其他因數。求質數的方法自然不少&#xff0c;但主要還是…

進入IT行業,要不要參加培訓班?

IT行業介紹 考慮培訓班無非是要入行,那IT行業好不好?IT行業當然好,看看培訓班的數量就知道了。現在房產行業好賺錢,每個小區門口好幾家中介門店,相同品牌的可能不止1家。不用去看網上的軟文,也不用去問百度,看市場的反應,這是真實的反饋。培訓班越來越多,課程越來越多…

python commands_Windows環境下使用python的commands.getstatusoutput

windows調用系統或其他腳本的&#xff0c;常用的是os.popen&#xff0c;次命令本身并不返回執行后的狀態&#xff0c;無法用于后續的判斷&#xff0c;故嘗試Unix下的commands.getstatusoutput&#xff0c;發現在windows下并不能正常使用&#xff0c;如下&#xff1a; >>&…

Kubernetes在上汽集團云平臺及AI方面的應用

2019獨角獸企業重金招聘Python工程師標準>>> 帆一尚行成立于2015年&#xff0c;是上汽集團的全資子公司&#xff0c;建設有上海、南京、鄭州&#xff08;在建&#xff09;三個數據中心&#xff0c;擁有超過4000臺物理服務器&#xff0c;10PB的數據存儲&#xff0c;總…

我的Java培訓經歷

此文講述我的Java開發培訓經歷&#xff0c;來解答關心的培訓費、培訓節奏、就業等問題。 我在2010年參加達內Java培訓&#xff0c;如今再回首那段時光&#xff0c;雖然辛苦&#xff0c;但很值得&#xff01;&#xff08;后悔參加培訓班&#xff0c;大部分原因是沖動&#xff0…

python跨函數調用變量_對python中不同模塊(函數、類、變量)的調用詳解

首先&#xff0c;先介紹兩種引入模塊的方法。 法一&#xff1a;將整個文件引入 import 文件名 文件名.函數名( ) / 文件名.類名 通過這個方法可以運行另外一個文件里的函數 法二&#xff1a;只引入某個文件中一個類/函數/變量 需要從某個文件中引入多個函數或變量時&#xff0c…

軟件培訓技術選哪個?

要培訓了,培訓技術怎么選? 技術需慎重選 女怕嫁錯郎,男怕入錯行。后悔參加培訓班,因為技術沒選好的占比很高。 技術沒選好會有什么影響? 近的影響是就業!遠的影響是發展! 對于程序員來說,技術就是立身之本,需要慎重選擇! 我在《要不要參加培訓班?》文章中介紹…

django安裝_技術大牛詳解:Django框架之環境安裝

黑馬程序員視頻庫播妞微信號&#xff1a;boniu236傳智播客旗下互聯網資訊、學習資源免費分享平臺虛擬環境安裝:開發中問題&#xff1a;如何在同一臺主機中&#xff0c;要開發多個不同的項目&#xff0c;而且需要用到同一個包的不同版本&#xff1f;嘗試分析&#xff1a;在開發過…

安裝 Alibaba Cloud Toolkit

IntelliJ IDEA版 JetBrains 插件市場下載 Eclipse 版 Eclipse 插件市場倉庫下載 (推薦)URL 地址在線安裝Maven 版 在 POM 文件中依賴 PyCharm、PhpStorm、RubyMine 和 WebStorm 版 公測中官網https://toolkit.aliyun.com 交流群&#xff08;釘釘&#xff09; 交流群&#xff08…

軟件Java前端大數據培訓機構怎么選?

先看這篇文章《要不要參加培訓班》。 選技術就像選另一半,那選培訓機構就是選另一半的家庭。另一半家庭好與不好,與婚后幸福生活息息相關。 選培訓機構的幾個維度: 1.成立時間 2.專業性 3.市場普及率 成立時間 成立久的不一定好,比如北大某鳥 成立不足3年的,不要選…

高效管理論壇廣告貼的小竅門

歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。這里提供一個關于如何管理論壇廣告貼的深度視角。一般的論壇在發展初期&#xff0c;用戶自發產生的內容不多&#xff0c;每一條數據都彌足珍貴&#xff0c;因此幾乎不會考慮到反垃圾需求。隨著產品規模的擴大&…

Chrome瀏覽器多開,親測有效

原理 指定不同的用戶目錄&#xff0c;就可以實現多開。即&#xff1a;"--user-data-dir" 指定不同的目錄。 操作 新建用戶目錄文件夾 要開幾個&#xff0c;就新建幾個&#xff0c;文件夾名隨意。 復制chrome快捷方式 修改目標路徑 每個快捷方式&#xff0c;修改…

計算機技術與軟件專業技術資格(水平)考試 全國各省市成績查詢

大家好&#xff0c;我是51CTO學院的文慧&#xff0c;目前收到很多參加軟考考試的學生針對考試成績查詢的問題&#xff0c;無法一一幫助到大家&#xff0c;故開此博客&#xff0c;希望可以幫助到大家。 2018年下半年軟考合格標準是多少&#xff1f;根據近幾年軟考合格標準來看&a…

培訓時常犯的學習誤區與應對方法

和在學校里上課一樣,同一位老師教,同班同學成績不同。同學之間的資質都是差不多的,因學習方法不同,學習心態不同,課后努力程度不同導致的成績差異。 本文介紹下培訓時容易犯的學習誤區和誤區的應對方法。 誤區1 不懂不明白的地方,非要打破鐵鍋問到底。 應對方法 培訓…

julia有沒有希望超越python_未來5-10年,Julia會替代Python成為量化投資熱門語言嗎?...

今年上過一個quantative programming的課程&#xff0c;去年教學用的語言還是python&#xff0c;加速的方法用的是jit即時編譯來提高編程效率&#xff0c;今年課程的設計就改成Julia了。 因為自己從2016年起數據研究用的都是python&#xff0c;所以最開始使用Julia的時候并不習…

常見的三種撞庫方法

歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。 在安全領域向來是先知道如何攻&#xff0c;其次才是防。在介紹如何防范網站被黑客掃描撞庫之前&#xff0c;先簡單介紹一下什么是撞庫&#xff1a;撞庫是黑客通過收集互聯網已泄露的用戶和密碼信息&#xff0c;生…