數據集怎么導出_PCA算法 | 數據集特征數量太多怎么辦?用這個算法對它降維打擊...

今天是機器學習專題的第27文章,我們一起來聊聊數據處理領域的降維(dimensionality reduction)算法。

我們都知道,圖片格式當中有一種叫做svg,這種格式的圖片無論我們將它放大多少倍,也不會失真更不會出現邊緣模糊的情況。原因也很簡單,因為這種圖片是矢量圖,一般的圖片存儲的是每一個像素點的顏色值,而在矢量圖當中,我們存儲的是矢量,也就是起點終點以及顏色。由于矢量圖只記錄起點終點,所以無論我們如何放大,圖片都不會失真,而傳統的圖片就做不到這一點。

其實svg就相當于圖片的降維,我們將上百萬的像素點簡化成了若干個矢量完成了圖片的存儲,大大減少了數據的規模。機器學習領域中的降維算法其實也是差不多的原理。

背景與原理

現在降維算法這個詞已經越來越少聽到了,在面試當中也很少被提及,這是有時代因素的。因為現在的計算資源以及存儲資源越來越廉價了,在以前很難承擔的計算量,現在變得越來越輕松。所以相對而言,降維算法沒有之前熱門了,也越來越少在面試當中出現。

從現狀倒推回從前,我們大概可以猜到,在若干年以前,當我們面臨海量無法承擔的數據的時候,降維算法是多么的重要。因為,我們都知道,機器學習訓練的速度和它使用的數據量有這非常密切的關系,使用10維特征和使用100維特征的模型的收斂速度至少是10倍以上的差距。那么,自然而然地我們就會想到,如果有某種方法可以將100維的數據”壓縮“成10維,該有多好?

但問題來了,數據不是實體,我們真的可以隨意壓縮嗎,這其中的原理是什么呢?

最根本的原理是既然特征可以用來訓練模型,那么特征的分布和label的分布必然是有一定的內在聯系的。也就是說數據并不是隨意分散的,而是彼此之間有聯系的。我們各種各樣的壓縮算法,本質上都是利用了數據之間的關聯。

舉個不是非常恰當,但是很直觀的例子。假設說我們現在有三個特征,分別是一個人的考試成績、智商以及努力程度。我們會很明顯地發現,考試成績和智商以及努力程度這兩個特征高度相關。如果我們能夠找到它們之間的關聯,我們完全可以去掉考試成績這個特征,而通過智商、努力程度和它的這種關聯來推算出這個值來。當然既然是推算出來的,顯然會和原本的值有一定的誤差,這也是不可避免的。

從這個例子當中,我們可以明確兩點,首先,壓縮數據是利用的數據分布的關聯或者是特性,如果是完全隨機的數據是無法降維壓縮的。其次,降維壓縮必然會帶來信息損失,也就是誤差,這是不可避免的。

降維算法

降維壓縮的算法有好幾種,常見的有PCA、ICA和FA,下面我們來簡單介紹一下。

首先是PCA,PCA的英文全稱是Principal Component Analysis即主成分分析。這種方法的主要原理是對數據進行坐標變換,即將數據從原來的坐標系更換到新的坐標系。新的坐標軸是通過最大方差理論推導得到的,即新的坐標軸包含了原始數據中大部分的方差,這里的方差可以理解成信息。

ICA的英文是Independent Component Analysis即獨立成分分析,在這個算法當中它假設數據是通過N個數據源生成的。假設數據是這N個數據源數據混合觀察的結果。這些數據源在統計上是互相獨立的,如果數據源的數目少于原始特征的數目,也可以完成降維。

最后是FA即Factor Analysis即因子分析。在因子分析當中,我們假設樣本當中存在一些隱變量,我們假設樣本是這些隱變量和一些噪音的線性組合。那么只要這些隱變量的數量少于原始特征的數量,我們就可以用這些隱變量來作為新的數據從而實現降維。

這三種降維算法雖然各不相同,但是核心的思路都是一致的。都是假設數據的分布滿足某一種特性,通過利用這一種特性來對數據進行壓縮。這其中使用范圍最廣的是PCA,所以我們著重來了解一下PCA的原理以及實現。

理論推導

關于PCA算法有兩種通俗的解釋,一種是最大方差理論,另外一種是最小化降維損失,這兩個思路推導出的結果是一樣的。相比之下,最大方差理論更加容易理解一些,所以我們就選擇最大方差理論來做個簡單的解釋。

在信號系統當中,我們普遍認為信號具有較大的方差,而噪音擁有較小的方差。信噪比就是信號與噪聲的方差比,這個比值越大越好,越大說明噪音越小,信號的質量越高。比如下圖當中的這個數據分布,我們可以在原始數據當中找到兩個正交軸,根據方差最大理論,我們會把方差大的那個軸看成是信號,方差小的看成是噪音。

根據這個思路,最好的k維特征是將n維的樣本轉換成k維坐標之后,擁有最大方差的k個

13e75a9ce19df6680b78aec9d7b4a753.png

協方差

到這里,我們雖然知道了要獲取方差最大的方向作為新的坐標軸,但是如果我們直接去計算的話是會有問題的。最大的問題在于我們沒辦法選出K個來,如果只是選擇類似的K個方向,這K個軸的信息都差不多,會丟失大量的信息。所以我們不僅要選擇K個軸,而且要保證這K個軸盡可能線性無關

要做到線性無關,也就是說這K個軸應該是彼此正交的。如果兩個軸正交,可以進一步得到這兩個軸的協方差為零。為了簡化運算,我們可以先讓原始數據全部減去各自特征的均值。在去除均值之后,兩個特征的協方差可以表示為:

f39a299fdd38f8332b520c4b4c461c2d.png

兩個特征正交等價于它們的協方差為0,我們假設去除了均值之后的矩陣為X,我們來寫出它的協方差矩陣。

協方差矩陣

對于去除了均值的矩陣X而言,有一個性質是它的協方差矩陣

X_cov=1/m X X^T。我們可以來簡單證明一下,假設矩陣當中只有兩個特征a和b,那么我們將它按行寫成矩陣:

5af02b20b65ab75d2e4f9449c99c0e96.png

我們假設X的協方差矩陣為C,那么C是一個對稱矩陣,它的對角線上的元素表示各個特征的方差,其他的元素則表示特征之間的協方差。我們的目標是希望能夠得到一個類似形式的對角矩陣,也就是說除了對角線之外的其余元素全為0,這樣這些特征之間就是正交矩陣,我們根據對角線上的值挑選出方差最大的K個特征即可。

我們的目的和方向已經很明確了,距離終點只有一步之遙,但是這一步怎么邁過去呢?

對角化

這里我們采用逆向思維來思考,假設我們已經找到了矩陣P,通過P對X進行線性變換的結果是Y,那么Y=PX,我們假設Y的協方差矩陣為D,那么根據剛才我們推導的結論可以得到:

b8c7fbeb042adc3567a597b100af9423.png

我們希望D是一個對角矩陣,所以我們要尋找的就是P,P找到之后一切都迎刃而解。因為D是一個對角矩陣,我們將它對角的元素從大到小排列之后,對應P的行組成的矩陣就是我們尋找的基。我們用P的前K行組成的新矩陣對原始數據X進行線性變換,就將它從n維降低到了K維。

所以問題就只剩下了一個,這個P矩陣要怎么求呢?我們干想是很困難的,其實數據家們已經給了我們答案,就是C矩陣的特征向量

由于C是對稱矩陣,根據線性代數的原理,它有如下兩條性質:

  1. 對稱矩陣不同的特征值對應的特征向量必然正交
  2. 特征值是實數,K重特征值對應的線性無關的特征向量剛好有K個

根據這兩條性質,我們可以得到,對于n*n的矩陣C來說,我們可以找到n個特征向量 e_1, e_2, ... , e_n。我們將它們按列組成矩陣:

87945ffc0ef6bd9793ea0dd2b5517a5a.png

我們通過E可以將C對角化:

da9ec266d9121c0a4526729ada3dd4cb.png

我們對Lambda中的特征值從大到小排列,選出前K個特征值對應的特征向量組成矩陣即得到了最終的結果P。

最后,我們整理一下上述的整個過程。

  1. 每一維特征減去平均值
  2. 計算協方差矩陣
  3. 求解協方差矩陣的特征值和特征向量
  4. 對特征值降序排序,選擇其中最大的K個,然后將對應的K個特征向量作為行向量組成特征向量P
  5. 轉換之后的結果X_t = PX

我們把這個邏輯整理一下,寫成代碼:

import numpy as npdef pca(df, k):    mean = np.mean(df, axis=0)    new_df = df - mean    # 計算協方差矩陣,也可以用公式自己算    cov = np.cov(new_df, rowvar=0)    # 求解矩陣特征值和特征向量    eigVals, eigVects = np.linalg.eig(np.mat(cov))    # 對特征值排序,選最大的K個,由于是從小到大排,所以我們取反    eigValIndice = np.argsort(-eigVals)    # 構建變換矩陣    n_eigValIndice = eigValIndice[:k]    n_eigVect = eigVects[:, n_eigValIndice]    data_ret = new_df.dot(n_eigVect)    return data_ret

實戰驗證

為了驗證程序效果,我們找了一份經典的機器學習數據:http://archive.ics.uci.edu/ml/datasets/SECOM。

我們把它下載下來之后,用pandas讀入進來:

a381105514f82d823a1abf538b7fff45.png

可以看到它的特征有590維,展開看的話會發現特征當中有許多空值:

abf57fa639e282b733e19069b138ff59.png

我們對它進行一個簡單地預處理,將空值替換成特征均值,并且再讀入label的值:

46625bc6263579936b1fda078519ae80.png

為了驗證PCA降維的效果,我們用同樣一份數據,用同樣的模型,比較一下做PCA之前和之后模型的效果

這里我選擇的是隨機森林,其實不管用什么模型都大同小異。我們將數據拆分成訓練數據與測試數據,并且調用skelarn庫當中的隨機森林完成訓練和預測,最后計算模型在測試集當中的表現。說起來挺復雜,但是由于sklearn替我們完成了大量的工作,所以用到的代碼并不多:

0c78e4aca0606169c7860c4afc415981.png

我們可以看到,在PCA之前,隨機森林在測試集上的表現是92.3%的準確率。

接下來,我們用同樣的數據和模型來驗證PCA之后對于模型性能的影響。為了保證數據集的完全一致,我們把測試集的隨機種子也設置成一樣

b001e2c5bcf428464be71928eef62212.png

可以看到模型在測試集上的準確率完全一樣,說明PCA并沒有過多降低模型的性能,和我們的預期一致。

總結

在今天的文章當中,我們詳細介紹并推導了PCA背后的原理,并采取實際數據集驗證了PCA算法的效果。從最后的結果上來看,雖然我們將590維的特征縮減到了10維,但是模型的效果卻幾乎沒有多大影響,可見PCA的威力。

當然,這背后的因素很多,除了PCA本身的原理之外,和數據的分布以及訓練測試樣本的數量也有關系。在極端場景下,可能特征的數量非常多,含有大量的噪音,如果我們不做降維直接訓練的話,很有可能導致模型很難收斂。在這種情況下,使用降維算法是必要的,而且會帶來正向的提升。如果特征數量不多,模型能夠收斂,使用降維算法可能沒什么助益,而且會稍稍降低模型的效果。但在一般的情況下,數據集特征的分布也符合二八定律,即20%的特征帶來80%以上的貢獻,大部分特征效果不明顯,或者噪音很多。在這種情況下,使用PCA進行降維,幾乎是一定起到正向作用的。

當然在實際的應用場景當中,降維算法用的越來越少,除了計算能力提升之外,另外一個很重要的原因是深度學習的興起。深度神經網絡本身就帶有特征篩選的效果,它自己會選擇合適的特征組合達到最好的效果,所以很多特征處理和降維等操作顯得不是特別有必要了。雖然如此,但是算法本身的思想還是很有借鑒作用,PCA算法在Kaggle比賽當中使用頻率也很高,對它進行詳細地了解和學習還是很有必要的。

今天的文章就到這里,如果喜歡本文,可以的話,請點個贊和關注吧,給我一點鼓勵,也方便獲取更多文章。

本文始發于公眾號:TechFlow

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

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

相關文章

html form callback,Promise異步編程模式總結初始化Promise對象統一錯誤處理PromisifyfromCallbackMongoose Promisify...

Promise是JavaScript中的一種異步編程范式, 一個Promise對象表示一個即將完成但還未完成的操作。 鑒于JavaScript中異步和回調的編程風格, Promise模式可以有效地避免『Callback Hell』。Promise 最初有q和bluebird等實現,在ES2015(ES6)提出后…

常用命令_GIT常用命令大全

Git 是一個很強大的分布式版本控制系統。它不但適用于管理大型開源軟件的源代碼,管理私人的文檔和源代碼也有很多優勢。克隆遠程文件:git clone https://gitee.com/abcd/codefile.git projectgit checkout -b dev(本地分支名稱) origin/dev(遠程分支名稱…

nvidia顯示設置不可用_Nvidia顯示設置不可用,您當前未使用連接到NVIDIA GPU的顯示器的解決方法...

相信不少用戶遇到這樣一個問題,就是新購買的臺式機電腦,配置達標的情況下,玩游戲出現卡頓不流暢的現象,準備在NVIDIA控制面板查看是否設置的問題,在打開NVIDIA控制面板的時候,提示了“Nvidia顯示設置不可用…

html的id不能有.嗎,html – 哪些DOM元素不能接受id?

在HTML5中,id屬性是global attribute,可以在任何元素上指定.如果你看看Document Type Declaration for HTML4,你可以找到沒有%attrs的元素;在他們的屬性列表中定義,表示它們不支持id屬性.那些包括在“文檔頭”部分的底部附近:HEAD,TITLE,BASE,META,STYLE…

oracle tns 代理配置_Toad for oracle安裝配置與使用

一.toad安裝與配置注意:toad的使用本機電腦必須安裝完整版oracle客戶端,不能是精簡版的.1.1完整版oracle客戶端的安裝.1.解壓文件,安裝oracle客戶端打開安裝包,找到setup.ext,開始安裝。提示下圖彈窗,可根據此網址內容進行更改(https://blog.…

吳楓 python小課賬號_無門檻速學編程——Python小短課,自上而下分而治之

【Python小短課 11】自上而下,分而治之 做任何事都需計劃,編程也是。 譬如寫文章要列大綱、作畫要想布局,編程也需先謀全局,而后思慮細節。 就以上回說到的“找寶藏”這個程序舉例,最頂層的需求自然就是“找寶藏”&…

計算機本地磁盤D無法擴展,計算機上的本地磁盤D突然無法打開,表明它需要格式化...

接受使用數據恢復軟件將重要數據保存到其他磁盤FindDate特定操作: 運行軟件----“打開”后,將顯示要還原的驅動器. C \ D \ E \ F選擇您要還原的一個,它將開始. 掃描后,再次保存掃描的文件. 哈哈,希望對您有所幫助.最后&#xff0…

caffe運行不停止_caffe(gpu)安裝過程及問題解決

2019.12.05 caffe(gpu)安裝參考網址:教程1:weiliu89/caffe?github.com教程2:https://blog.csdn.net/yggaoeecs/article/details/79163789?blog.csdn.net環境:Ubuntu16.04cuda10.0安裝過程:git clone https://github.…

2021年考計算機考研三戰,2021考研的小伙伴有3條忠告一定要記得,這些都是歷年實戰經驗...

2021考研的小伙伴有3條忠告一定要記得,這些都是歷年實戰經驗,考研一定要記得避開三個大坑。1,分數線低的學校就一定容易考。有一些學校分數線看著很低但實際上難度不低,比如首都師范大學 ,很多專業就是國家線錄取甚至招…

c++ 返回string_JVM系列之:String.intern和stringTable

簡介StringTable是什么?它和String.intern有什么關系呢?在字符串對象的創建過程中,StringTable有起到了什么作用呢?一切的答案都在本文中,快來看看吧。intern簡介intern是String類中的一個native方法,所以它…

conda install 換源_ubuntu更換pip install,apt-get,conda install 成國內源

# 默認注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe mu…

python幫助文檔中查看內置函數_PYTHON官方文檔內置函數整理

一、數學運算類 abs(x) 求絕對值 1 、參數可以是整型,也可以是復數 2 、若參數是復數,則返回復數的模 complex([real[, imag]]) 創建一個復數 divmod(a, b) 分別取商和余數 注意:整型、浮點型都可以 float([x]) 將一個字符串或數轉換為浮點數…

計算機二級指針,C語言——二級指針

二級指針的概念首先任何值都有地址,一級指針的值雖然是地址,但這個地址做為一個值亦需要空間來存放,是空間就具有地址,這就是存放地址這一值的空間所具有的地址,二級指針就是為了獲取這個地址,一級指針所關…

華為 虛擬鍵盤_華為mate30 pro虛擬機械鍵盤特有體驗,雖是虛擬,但卻感受逼真...

華為Mate30 pro已于26日在國內正式發布了。此外,根據了解華為Mate30系列現在已經突破了5億的銷售額。看來,華為的這個下半年旗艦手機非常受歡迎啊。華為Mate30系列現在在國內已經發布了,其整體感官看上去與海外的沒有多大的區別。其實&#x…

python 如何快速判斷列表是否相同_Python-檢查列表中的所有元素是否相同

小編典典 通用方法: def checkEqual1(iterator): iterator iter(iterator) try: first next(iterator) except StopIteration: return True return all(first rest for rest in iterator) 單線: def checkEqual2(iterator): return len(set(iterator)…

計算機有什么著名基金經理排名,百萬年薪的基金經理,都是什么專業出身?!...

有人會說了“小嗶君你四不四撒!基金經理肯定是金融專業出身的咯?不然嘞?”但事實的真相是許多基金經理都并非科班出身這要從基金經理的晉升機制說起了!如下圖基金經理都是從研究員做起的!那么問題來了,如何…

遍歷children_589. N叉樹的前序遍歷

589. N叉樹的前序遍歷給定一個 N 叉樹,返回其節點值的前序遍歷。例如,給定一個 3叉樹 :返回其前序遍歷: [1,3,5,6,2,4]。說明: 遞歸法很簡單,你可以使用迭代法完成此題嗎?題解:既然是樹的遍歷,那么一共就是兩種思路&a…

計算機護理職稱考試報名時間2015,護理職稱考試怎么報名?

護理職稱考試報名流程:網上預報名-現場確認-報名繳費。護理職稱考試網上預報名及網上繳費均在中國衛生人才網,護理職稱考試報名現場確認則按屬地原則在單位或戶籍所在地的衛計局。護理職稱考試報名流程詳解一、網上預報名考生需在規定的時間內登錄中國衛…

怎么用python編程前二n-1項的等差數列的和_python 等差數列末項計算方式

等差數列末項計算 題目內容: 給出一個等差數列的前兩項a1,a2,求第n項是多少 可以使用以下語句實現非負整數n的輸入: nint(input()) 輸入格式: 三行,包含三個整數a1,a2,n 輸出格式: 一…

圖紙中bs是什么意思_園建施工圖中WL、BL、FL、TW、SL分別是什么意思

展開全部WL是水面標高來BL池底自標高FL地面標bai高TW墻頂標高SL 土面標高其他其他一些常du用的注解:PA種植區FF室內樓zhi地面標FG室外軟景完成dao面標高BC路沿底標高BS踏步底標高BR欄桿扶手底標高TR欄桿扶手頂標高SL結構板頂標高擴展資料本書圍繞園林工程建設主題&a…