天天看點

線性與非線性資料降維方法彙總(Python代碼實作)

資料降維方法及Python實作

前言

大綱

線性資料降維

主元分析(PCA)

偏最小二乘法(PLS)

獨立成分分析(ICA)

線性判别分析(LDA)

典型相關分析(CCA)

慢特征分析(SFA)

非線性資料降維

神經網絡非線性方法

核(Kernel)方法

線性核函數

高斯核函數

流行學習方法

LLE(Locally Linear Embedding) 局部線性嵌入

LE (Laplacian Eigenmaps) 拉普拉斯特征映射

LPP(Locality Preserving Projection) 局部保留投影

11月份了,目前再準備開題, 依舊搞故障診斷,在工業過程中的過程監控現狀大多是從資料驅動的角度進行監控和診斷,然鵝,我們遇到的很多工況資料确實非線性的,在實際生産中,大部分都是非線性的資料,但也有一些線性的,由此我們可以從全局和局部出發,來對資料進行挖掘和分析,對此,近期我做了很多關于資料降維的一些工作用于畢業論文,現在在下面講講我的一些見解和Python代碼的複現。

Python代碼在文末喲!~

線性與非線性資料降維方法彙總(Python代碼實作)

線性降維方法,如主元分析(PCA)"、部分最小二乘化(PLS)及獨立元分析(ICA),線性辨識分析(LDA)等。

之前有過一篇blog介紹過這一部分,-> 看這裡

過程監控中的應用可看 -> 這裡

還是在介紹一遍吧~

PCA是一種統計方法,廣泛應用于工程和科學應用中,與傅裡葉分析相比,尤其适用于品質監測。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
其中,
線性與非線性資料降維方法彙總(Python代碼實作)

為 l 個潛在變量得分的向量。

殘差向量:

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

PLS具體算法過程如下:

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

看似比CCA的簡單,這裡附上CCA的目标函數:

線性與非線性資料降維方法彙總(Python代碼實作)

上面CCA是一次求解的過程,而我們的PLS回歸隻是對目前的第一主成分做了優化計算,剩下的主成分還得再計算。

關于優化的目标求解的辦法,和CCA一樣,也是引用了拉格朗日乘數法來求解。(下面給出詳細計算步驟)

首先,引入拉格朗日乘子:

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

求導可得,

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

具體獨立成分分析ICA原理及應用可看 —> 這裡

LDA的思想:由所給定的資料集,設法将樣例資料投影在一條直線上,使得同類資料的投影點盡可能的接近、而異類資料的投影點之間将可能間隔更遠。在我們做新樣本資料的分類時,将其投影到同樣的直線上,再根據投影點的位置來确定新樣本的類别。如下圖(源自周志華《機器學習》)所示:

這裡的投影直線也用到了最小二乘的思想,所有資料樣本垂直投影在直線上,隻是我們的限制條件表為了不同資料樣本之間的投影在直線上的距離度量。

我們需要尋找到在投影方向w ww上,使得資料樣本滿足兩個條件:1) 相同資料之間投影距離最小;2)不同資料之間投影點位置最大(可通過求其不同資料的投影中心點來判别)

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

LDA二維示意圖

圖中,“+”和“-”代表的是兩種不同的資料簇,而橢圓表示資料簇的外輪廓線,虛線表示其投影,紅色實心圓●和紅色實心三角形△分别代表的兩類資料簇投影到w ww方向上的中心點。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

下面思考另一個問題,如何讓同類的資料樣本投影點盡可能的靠近,而使得不同樣本投影點離得更遠呢?

這裡需要引入協方差的概念,小小複習一下協方差及樣本方差的知識(因為本菜雞數學基礎差)

協方差(Covariance)在機率論和統計學中用于衡量兩個變量的總體誤差。而方差是協方差的一種特殊情況,即當兩個變量是相同的情況。

上面的Σ 0 、 Σ 1因為是自協方差也就是代表方差(也即為樣本方差)。

方差:當資料分布比較分散(即資料在平均數附近波動較大)時,各個資料與平均數的差的平方和較大,方差就較大;當資料分布比較集中時,各個資料與平均數的差的平方和較小。

總的說來:方差越大,資料的波動越大;方差越小,資料的波動就越小。

協方差表示的是兩個變量的總體的誤差,這與隻表示一個變量誤差的方差不同。 如果兩個變量的變化趨勢一緻,也就是說如果其中一個大于自身的期望值,另外一個也大于自身的期望值,那麼兩個變量之間的協方差就是正值。 如果兩個變量的變化趨勢相反,即其中一個大于自身的期望值,另外一個卻小于自身的期望值,那麼兩個變量之間的協方差就是負值。

簡而言之:兩個變量之間差距越大,協方差就越小;相反,兩個變量越相似變化趨勢一緻,則協方差越大。

複習完協方差、樣本方差的知識後,解決上面的問題應該不難。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

引入一下類内和間散度矩陣的知識:

類間散度矩陣用于表示各樣本點圍繞均值的散布情況。

類内散度矩陣用于表示樣本點圍繞均值的散步情況,關于特征選擇和提取的結果,類内散布矩陣的積越小越好。

具體可參考這裡,還有這裡。

首先,我們來定義“類内散度矩陣”(within-class scatter matrix)

線性與非線性資料降維方法彙總(Python代碼實作)

“類間散度矩陣”(between-class scatter matrix):

線性與非線性資料降維方法彙總(Python代碼實作)

然後我們的J 可以表示為

線性與非線性資料降維方法彙總(Python代碼實作)

這樣看起來簡單多了,這就是我們的LDA想要最大化的目标函數,比較專業的說法為,S b 和S w 的“廣義瑞利商”(generalizad Rayleigh quotient)。

關于“廣義瑞利商”(generalizad Rayleigh quotient)的解釋,可以參考這裡和這裡。

瑞利商經常出現在降維和聚類任務中,因為降維聚類任務往往能導出最大化最小化瑞利熵的式子,進而通過特征值分解的方式找到降維空間。

大體内容如下:

線性與非線性資料降維方法彙總(Python代碼實作)

下面開始建構我們的函數及限制條件。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

由拉格朗日乘數法(具體可參考

CCA中Lagrange的應用

)可得,

線性與非線性資料降維方法彙總(Python代碼實作)

其中,λ \lambdaλ為拉格朗日乘子。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

LDA還可從貝葉斯決策理論的角度來描述(關于貝葉斯可參考這裡),可證明,當兩類資料同先驗、滿足高斯分布(正态分布)且協方差相等時,LDA可以達到最優的分類效果。

上述講了這麼多都是二分類問題,那麼關于多分類任務。

具體線性判别分析LDA和Fisher判别分析原理及推廣可看 —> 這裡

從字面意義上了解CCA,我們可以知道,簡單說來就是對不同變量之間做相關分析。較為專業的說就是,一種度量兩組變量之間相關程度的多元統計方法。

關于相似性度量距離問題,在這裡有一篇Blog可以參考參考。

首先,從基本的入手。

當我們需要對兩個變量X , Y進行相關關系分析時,則常常會用到相關系數來反映。學過機率統計的小夥伴應該都知道的吧。還是解釋一下。

相關系數:是一種用以反映變量之間相關關系密切程度的統計名額。相關系數是按積差方法計算,同樣以兩變量與各自平均值的離差為基礎,通過兩個離差相乘來反映兩變量之間相關程度;着重研究線性的單相關系數。

線性與非線性資料降維方法彙總(Python代碼實作)

複習了一下大學大學機率統計知識,那麼,如果我們需要分析的對象是兩組或者多組向量,又該怎麼做呢?

CCA的數學表達:

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

我們會得到一個這樣的矩陣:

線性與非線性資料降維方法彙總(Python代碼實作)

這樣的話,我們把每個變量的相關系數都求了出來,不知道會不會和我一樣覺得這樣很繁瑣呢。如果我們能找到兩組變量之間的各自的線性組合,那麼我們就隻分析讨論線性組合之間的相關分析。

典型相關系數:是先對原來各組變量進行主成分分析,得到新的線性關系的綜合名額,再通過綜合名額之間的線性相關系數來研究原各組變量間相關關系。

現在我們利用主成分分析(PCA)的思想,可以把多個變量與多個變量之間的相關轉化成兩個變量之間的相關。

先得到兩組變量( A T , B T )的協方差矩陣

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

典型相關分析最樸素的思想:首先分别在每組變量中找出第一對典型變量,使其具有最大相關性,然後在每組變量中找出第二對典型變量,使其分别與本組内的第一對典型變量不相關,第二對本身具有次大的相關性。如此下去,直到進行到K步,兩組變量的相關系被提取完為止,可以得到K組變量。

So,

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

具體典型相關分析CCA算法及故障診斷應用可看 —>

這裡

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

提供輸入-輸出功能

線性與非線性資料降維方法彙總(Python代碼實作)

輸出信号

線性與非線性資料降維方法彙總(Python代碼實作)

輸出信号的各分量的均值和機關方差都為零,并且是不相關的。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

隻有在測試信号對訓練信号具有代表性的情況下,歸一化才是準确的。輸出信号也是如此

線性與非線性資料降維方法彙總(Python代碼實作)

由于實際原因,在步驟4和步驟5中使用了奇異值分解而不是PCA。對于一些特征值非常接近于零的退化資料,奇異值分解是一種較好的分析方法,然後在步驟4中丢棄這些特征值。非線性展開有時會導緻退化資料,因為它産生高度備援的表示,其中一些成分可能具有線性關系。一般來說,特征值接近于零的信号分量通常包含噪聲,如舍入誤差,在歸一化後會非常迅速地波動和在任何情況下,SFA都不會在步驟5中選擇。是以,決定哪些小元件應該被丢棄并不重要。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

具體慢特征分析SFA原理及應用可看 —> 這裡

實際工業過程往往表現出複雜的特性,過程的非線性特性尤為突出,是以非線性資料降維方法在故障診斷領域得到了廣泛的關注和應用。針對工業過程中存在的大量非線性過程,尤其是當輸入的取值範圍較大時,很多過程資訊及這種非線性關系無法再被PCA描述。針對非線性恃征的故障診斷研究從九十年代發展至今,主要提出了以下幾類方法:神經網絡非線性方法;(Kernel)方法;流形學習(Maniford Learning)方法。

神經網絡非線性PCA方法最早是有Kramer提出的,其模型是一個五層神經網絡,輸入和輸出采用同一組資料。由于中間層神經元個數小于輸入層的個數,實作了降維的效果。有作者指出該網絡結構線上性情況下并不能保證與線性PCA等價,提出了一種改進的方法,即先計算出每個訓練資料點的具有實體意義的主曲線的低維表示後,再使用兩個三層神經網絡分别實作降維和重反構映射;有學者引入核機率密度函數研究了非線性PCA中主元不服從正态分布的問題;有學者研究了非線性過程資料含有的動态性問題。

其中神經網絡還可結合LDA、ICA、SFA、CCA等上述線性方法,這裡就不再展開啦!~~

這裡隻以神經網絡加入PCA方法為例。但是針對神經網絡(NN)加入PCA的方法,從實際上來講目前任然存在很多的問題,首當其沖的就是整個神經網絡的訓練複雜度,會很高,提高成本,在實際工業生産中的資料并不是完整的,會存在樣本的不均衡和故障樣本的缺失或樣本量極少,是以,整個模型的泛化能力不是很好或者說是難以保證。怎樣确定整個神經網絡模型的結構及對應生産工況資料的規模,優化算法,效率及線上功能實作,保證學習樣本的完整性和價值問題仍未得到解決,故對于此類加入神經網絡的降維方法,不是很看好,簡單來說就是——太玄了!

核方法是将資料的原始輸入空間非線性地變換到一個高維的核特征空間後、再使用線性技術的一種間接處理方法。

最開始将線性推廣至非線性的為支援向量機(SVM),後來又有了Kernel PCA用于人臉識别和語音識别,同時在過程監控領域也有了很大的研究進展,推動了過程監控故障診斷的進步,雖然有很多學者将核kernel應用到了非線性降維方法中來,但均存在着一個很重要的問題,就是核函數究竟該怎麼選取。而且,對于加入核函數的方法,僅僅依賴于反映資料中的非線性,在其降維用的目标函數中沒有考慮到保持其資料結構的完整性,甚至存在将資料強行變為非線性結構的缺陷,由此,此種方法并不是很好,還需要進一步的研究和改善。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

當不需要在特征空間進行運算時,可以使用線性核函數。

如果原始資料已經是高維且可進行比較,在輸入空間中線性可分。

線性核心适用于由大量固定長度的特征資料表示的對象。

高斯核函數其又稱作——Square exponential kernel(SE Kernel )or radial basis function(RBF,徑向基函數),其形如:

線性與非線性資料降維方法彙總(Python代碼實作)

其中,Σ 表示的是輸入樣本的每個特征資料所對應的協方差,P維資料矩陣。

當Σ 是對角矩陣時,為

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

該核函數的特征空間的次元是無限的。核函數避免轉換函數的計算,故可用相對馬氏距離來機選n階的Gram方陣,即使已經将隐式的将對象投影到無限次元的特征空間中去,依舊有效。

流形學習是非線性降維的重要研究領域,也是近些年來,利用流行學習方法進行特征提取和故障診斷的一種新的探索,并受到了廣泛的關注。

流形(manifold)是一般幾何對象的總稱,包括各種次元的曲線與曲面等,和一般的降維分析一樣,流形學習是把一組在高維空間中的資料在低維空間中重新表示。不同之處是,在流形學習中假設:所處理的資料采樣與一個潛在的流形上,或者說對于這組資料存在一個潛在的流形。

流形上的點本身是沒有坐标的,是以為了表示這些資料點,我們把流形放入到外圍空間(ambient space),用外圍空間上的坐标來表示流形上的點,例如三維空間 R中球面是一個2維曲面,即球面上隻有兩個自由度,但我們一般采用外圍空間R^3 空間中的坐标來表示這個球面。

流形學習 = 微分流形 + 黎曼幾何

流行學習可以概括為:在保持流形上點的某些幾何性質特征的情況下,找出一組對應的内蘊坐标(intrinsic coordinate),将流形盡量好的展開在低維平面上,這種低維表示也叫内蘊特征(intrinsic feature),外圍空間的維數叫觀察維數,其表示叫自然坐标,在統計上稱為observation。(引用自此Blog)

LLE算法是在2000年被S.T.Roweis和L.K.Saul提出來的非線性降維方法,它的基本思想是将全局非線性轉化為局部線性,而互相重疊的局部鄰域能夠提供全局結構的資訊,這樣對每個局部進行線性降維後,在按照某種規則将結果組合在一起,就能夠得到低維的全局坐标表示。

LLE算法有一個前提假設:采樣資料所在的低維流形在局部是線性的,即每個采樣點可以用它的近鄰點線性表示。這個假設可以由最終結果的有效性上得到證明。該算法的學習目标是:在低維空間中保持每個鄰域中的權值不變,即假設嵌入映射在局部是線性的條件下,最小化重構誤差。

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)

上圖為LLE算法的運作步驟

線性與非線性資料降維方法彙總(Python代碼實作)

主要步驟:

尋找每個樣本點的k個近鄰點;

由每個樣本點的近鄰點計算出該樣本點的局部重建權值矩陣

由該樣本點的局部重建權值矩陣和其近鄰點計算出該樣本點的輸出向量

具體的詳細計算步驟就不放這裡了,有一個大佬的寫的不錯,這跳轉這裡

拉普拉斯特征映射(Laplacian Eigenmaps,LE)也是一種局部的流行學習方法,和LE的方法有點相似,LE算法也具有直覺降維的目标函數,也就是說,通過保持了高維資料之間的近鄰關系來得到低次元資料流行結構。

線性與非線性資料降維方法彙總(Python代碼實作)

LE算法的主要有以下四步:

線性與非線性資料降維方法彙總(Python代碼實作)

局部保留投影LPP算法提出的目的是為了實作非線性流形的學習和分析,LPP可以提取最具有判别性的特征來進行降維,是一種保留了局部資訊,降低影響圖像識别的諸多因素的降維方法,這種算法本質上是一種線性降維方法,由于其巧妙的結合了拉普拉斯特征映射算法(LE)的思想,進而可以在對高維資料進行降維後有效地保留資料内部的非線性結構。

與其他非線性降維方法相比,LPP方法可以将新增的測試資料點,通過映射在降維後的子空間找到對應的位置,而其他非線性方法隻能定義訓練資料點,無法評估新的測試資料。LPP方法可以很容易地将新的測試資料點根據特征映射關系(矩陣),投影映射在低維空間中。

将 n 維原資料映射為 l 維資料,l<< n ;實作資料降維,樣本個數為m 。(引用此大佬)

線性與非線性資料降維方法彙總(Python代碼實作)
線性與非線性資料降維方法彙總(Python代碼實作)