流行-Manifold【1】html
流形,也就是 Manifold 。git
1. 比較好的形象理解算法
流形學習的觀點是認爲,咱們所能觀察到的數據其實是由一個低維流形映射到高維空間上的,即這些數據所在的空間是「嵌入在高維空間的低維流形。」。因爲數據內部特徵的限制,一些高維中的數據會產生維度上的冗餘,實際上只須要比較低的維度就能惟一地表示。app
舉個例子,好比說咱們在平面上有個圓,如何表示這個圓呢?若是咱們把圓放在一個平面直角座標系中,那一個圓實際上就是由一堆二維點構成的。機器學習
好比一個單位圓:(1,0) 是一個在圓上的點, (0,1) 也是一個在圓上的點,但(0.0) 和(2,3) 等等不少點是不在這個圓上的。顯然若是用二維座標來表示,咱們沒有辦法讓這個二維座標系的全部點都是這個圓上的點。也就是說,用二維座標來表示這個圓實際上是有冗餘的。咱們但願,若是能創建某一種描述方法,讓這個描述方法所肯定的全部點的集合都能在圓上,甚至能連續不間斷地表示圓上的點,那就行了!有沒有這種方法呢?對於圓來講,固然有!那就是用極座標。在極座標的表示方法下,圓心在原點的圓,只須要一個參數就能肯定:半徑。當你連續改變半徑的大小,就能產生接二連三的「能被轉換成二維座標表示」的圓。因此說,實際上二維空間中的圓就是一個一維流形。 ide
與之類似的,三維空間中一個球面,用x, y, z三個座標軸肯定時會產生冗餘(不少在三維空間中的數據點並不在球面上)。但其實只須要用兩個座標就能夠肯定了,好比經度和維度。只要給定任何合法的經度和維度,咱們就都能保證這個點確定在球面上!球面是一個很典型的流形的例子,而地球就是一個很典型的「球面」啦(姑且看成球面好啦)。函數
有時候常常會在 paper 裏看到「嵌入在高維空間中的低維流形」,不太高維的數據對於咱們這些可憐的低維生物來講老是很難以想像,因此最直觀的例子一般都會是嵌入在三維空間中的二維或者一維流行。直觀上來說,一個流形比如是一個 d 維的空間,在一個 m 維的空間中 (m > d) 被扭曲以後的結果。須要注意的是,流形並非一個「形狀」,而是一個「空間」,若是你以爲「扭曲的空間」不可思議,那麼請再回憶一塊布的例子(一塊二維的布,再三維空間進行扭曲,則說「三維空間扭曲的布是一個二維的流行」,即"二維流形"嵌入了「三維空間」)。若是我沒弄錯的話,廣義相對論彷佛就是把咱們的時空看成一個四維流(空間三維加上時間一維)形來研究的,引力就是這個流形扭曲的結果。固然,這些都是直觀上的概念,其實流形並不須要依靠嵌入在一個「外圍空間」而存在,稍微正式一點來講,一個 d 維的流形就是一個在任意點出局部同胚於(簡單地說,就是正逆映射都是光滑的一一映射)歐氏空間 。學習
2. 流形學習的做用spa
那麼,流形學習有什麼用呢?我如今能想到的主要有兩個方面。.net
先說第一個方面。高維空間有冗餘,低維空間沒冗餘。也就是說,流形能夠做爲一種數據降維的方式。傳統不少降維算法都是用歐氏距離做爲評價兩個點之間的距離函數的。可是仔細想一想這種歐氏距離直覺上並不靠譜。「咱們只是看到了三維數據,就要用三維座標系內的尺度去對事物進行評價?」總以爲有些怪怪的。
舉個例子,從北京到上海有多遠?你能夠找一個地球儀,而後用一把能彎曲的軟軟的尺子,通過地球儀表面而後測量一下這兩個點的距離。可是若是我用一個直直的線,將地球儀從北京到上海洞穿,測量出一個更短的距離,你必定會以爲我瘋了。顯然對於「從北京到上海的距離」這件事,咱們關注的是把三維地球展開成二維平面,而後測量的地表上的距離,而不是三維空間中球面上兩個點的空間直線距離(相信沒有人從北京到上海會挖一條直通上海的地道的!將這個問題推廣一些,假如說決策部門打算把一些離得比較近的城市聚成一堆,而後組建個大城市。這時候「遠近」這個概念顯然是指地表上的距離,由於說空間直線距離並無什麼意義。
而對於降維算法來講,若是使用傳統的歐氏距離來做爲距離尺度,顯然會拋棄「數據的內部特徵」。若是測量球面兩點距離採用空間歐氏距離,那就會忽略掉「這是個球面」這個信息。
那麼,除了地球這種簡單的例子,實際應用中的數據,怎麼知道它是否是一個流形呢?因而不妨又迴歸直觀的感受。再從球面提及,若是咱們事先不知道球面的存在,那麼球面上的點,其實就是三維歐氏空間上的點,能夠用一個三元組來表示其座標。可是和空間中的普通點不同的是,它們容許出現的位置受到了必定的限制,具體到球面,能夠能夠看一下它的參數方程
能夠看到,這些三維的座標其實是由兩個變量 和
生成的,也能夠說成是它的自由度是二,也正好對應了它是一個二維的流形。有了這樣的感受以後,再來看流形學習裏常常用到的人臉的例子,就很天然了。
3. 流行學習的應用
下圖是 Isomap 論文裏的一個結果:
這裏的圖片來自同一張人臉(好吧,實際上是人臉模型),每張圖片是 64×64 的灰度圖,若是把位圖按照列(或行)拼起來,就能夠獲得一個 4096 維的向量,這樣一來,每一張圖片就能夠當作是 4096 維歐氏空間中的一個點。很顯然,並非 4096 維空間中任意一個點均可以對應於一張人臉圖片的,這就相似於球面的情形,咱們能夠假定全部能夠是人臉的 4096 維向量實際上分佈在一個 d 維 (d < 4096) 的子空間中。而特定到 Isomap 的人臉這個例子,實際上咱們知道全部的 698 張圖片是拍自同一我的臉(模型),不過是在不一樣的 pose 和光照下拍攝的,若是把 pose (上下和左右)看成兩個自由度,而光照看成一個自由度,那麼這些圖片實際只有三個自由度,換句話說,存在一個相似於球面同樣的參數方程(固然,解析式是無法寫出來的),給定一組參數(也就是上下、左右的 pose 和光照這三個值),就能夠生成出對應的 4096 維的座標來。換句話說,這是一個嵌入在 4096 維歐氏空間中的一個 3 維流形。 實際上,上面的那張圖就是 Isomap 將這個數據集從 4096 維映射到 3 維空間中,並顯示了其中 2 維的結果,圖中的小點就是每一個人臉在這個二維空間中對應的座標位置,其中一些標紅圈的點被選出來,並在旁邊畫上了該點對應的原始圖片,能夠很直觀地看出這兩個維度正好對應了 pose 的兩個自由度平滑變化的結果。 就我目前所知,把流形引入到機器學習領域來主要有兩種用途:一是將原來在歐氏空間中適用的算法加以改造,使得它工做在流形上,直接或間接地對流形的結構和性質加以利用;二是直接分析流形的結構,並試圖將其映射到一個歐氏空間中,再在獲得的結果上運用之前適用於歐氏空間的算法來進行學習。 這裏 Isomap 正巧是一個很是典型的例子,由於它其實是經過「改造一種本來適用於歐氏空間的算法」,達到了「將流形映射到一個歐氏空間」的目的。 :) Isomap 所改造的這個方法叫作 Multidimensional Scaling (MDS) ,MDS 是一種降維方法,它的目的就是使得降維以後的點兩兩之間的距離儘可能不變(也就是和在原是空間中對應的兩個點之間的距離要差很少)。只是 MDS 是針對歐氏空間設計的,對於距離的計算也是使用歐氏距離來完成的。若是數據分佈在一個流形上的話,歐氏距離就不適用了。
讓咱們再回到地球——這個在三維空間中的二維流形,假設咱們要在三維空間中計算北極點和南極點的距離,這很容易,就是兩點相連的線段的長度,但是,若是要在這個流形上算距離就不能這樣子算了,咱們總不能從北極打個洞鑽到南極去吧?要沿着地球表面走才行,固然,若是我隨便沿着什麼路線走一遍,而後數出總共走了多少步做爲距離,這是不成的,由於這樣一來若是我沿着不一樣的路線走,豈不是會獲得不一樣的距離值?總而言之,咱們如今須要一個新的定義在地球表面(流形)上的距離度量,理論上來講,任意知足測度的 4 個條件的函數均可以被定義爲距離,不過,爲了和歐氏空間對應起來,這裏選擇一個直線距離的推廣定義。
還記得初中學的「兩點之間,線段最短」嗎?如今,咱們反過來講,把線段的概念推廣一下,變成「兩點之間最短的曲線是線段」,因而流形上的距離定義也就等同於歐氏空間了:流形上兩個點之間的距離就是鏈接兩個點的「線段」的長度。雖然只是置換了一個概念,可是如今二者統一塊兒來了,不過,在流形上的線段大概就不必定是「直」的了(因而直線也變成不必定是「直」的了),一般又稱做是「測地線」。對於球面這個簡單的流形來講,任意一條線段一定是在一個「大圓」上的,因而球面上的直線其實都是一些大圓,也形成了球面這個流形上沒有平行線等一系列尷尬的局面(任意兩條直線均相交),若是你看過一些數學科普八卦類的書,應該會回憶起很多東西啦!
回到 Isomap ,它主要作了一件事情,就是把 MDS 中原始空間中距離的計算從歐氏距離換爲了流形上的測地距離。固然,若是流形的結構事先不知道的話,這個距離是無法算的,因而 Isomap 經過將數據點鏈接起來構成一個鄰接 Graph 來離散地近似原來的流形,而測地距離也相應地經過 Graph 上的最短路徑來近似了。以下圖所示:
這個東西叫作 Swiss Roll ,姑且把它看做一塊捲起來的布好了。圖中兩個標黑圈的點,若是經過外圍歐氏空間中的歐氏距離來計算的話,會是捱得很近的點,但是在流形上它們其實是距離很遠的點:紅色的線是 Isomap 求出來的流形上的距離。能夠想像,若是是原始的 MDS 的話,降維以後確定會是很暴力地直接把它投影到二維空間中,徹底無視流形結構,而 Isomap 則能夠成功地將流形「展開」以後再作投影。
除了 Isomap 以外,Manifold Embedding 的算法還有不少不少,包括 Locally Linear Embedding 、Laplacian Eigenmaps 、Hessian Eigenmaps 、Local Tangent Space Alignment、Semidefinite Embedding (Maximum Variance Unfolding) 等等等等。哪一個好哪一個壞也很差說,它們都各有特色,並且也各自有很多變種。網上有一個 Matlab 的 demo ,給出了幾種流行的 manifold embedding 算法在一些 synthetic manifold 上的結果和對比,能夠有一個直觀的認識。
另外一方面是改造現有算法使其適合流形結構甚至專門針對流形的特色來設計新的算法,比較典型的是 graph regularized semi-supervised learning 。簡單地說,在 supervised learning 中,咱們只能利用有 label 的數據,而(一般都會有不少的)沒有 label 的數據則白白浪費掉。在流形假設下,雖然這些數據沒有 label ,可是仍然是能夠有助於 Learn 出流形的結構的,而學出了流形結構以後實際上咱們就是對原來的問題又多了一些認識,因而理所固然地指望能獲得更好的結果嘍。
固然,全部的這些都是基於同一個假設,那就是數據是分佈在一個流形上的(部分算法可能會有稍微寬鬆一些的假設),然而 real world 的數據,究竟哪些是分別在流形上的呢?這個倒是很難說。不過,除了典型的 face 和 hand written digit 以外,你們也有把基於流形的算法直接用在諸如 text 看起來好像也流形沒有什麼關係的數據上,效果彷佛也還不錯。
話說回來,雖然和實際應用結合起來是很是重要的一個問題,可是也並非決定性的,特別是對於搞理論方面的人來我想,對於他們來講,其實也像是在作應用啦,不過是把數學裏的東西應用到機器學習所研究的問題裏來,並且其中關係錯綜複雜,圖論、代數、拓撲、幾何……彷彿是十八路諸侯齊聚一堂,因此讓我總以爲要再花 500 年來惡補數學才行呀!
不過我表示能夠理解其中存在的潛在的 happy 之處,就比如你玩遊戲,先玩了《天地劫:神魔至尊傳》,而後再玩《天地劫序章:幽城幻劍錄》的時候,會發現裏面的人物、劇情逐漸地聯繫起來,也許甚至只是在一個地方出現過的一個徹底不起眼的配角,當你再在另外一地方忽然看到他是,一系列的線索瞬間被聯繫起來,全局的畫面漸漸浮現,那種 happy 的感受,大概就是所謂的「撥雲見日」了吧!
因此呀,這些東西其實都是差很少的,有時候想一想那些泰斗站在頂峯上「一覽衆山小」的感受,那種「融會貫通」的感受,真是讓人各類羨慕呀!無奈就只好去爬爬老和山北高峯來體驗體驗了。
局部線性嵌入:假設數據中每一個點能夠由其近鄰的幾個點重構出來。降到低維,使樣本仍能保持原來的重構關係,且重構係數也同樣。
一個流形在很小的局部鄰域上能夠近似當作歐式的,就是局部線性的。那麼,在小的局部鄰域上,一個點就能夠用它周圍的點在最小二乘意義下最優的線性表示。局部線性嵌入把這個線性擬合的係數當成這個流形局部幾何性質的刻畫。那麼一個好的低維表示,就應該也具備一樣的局部幾何,因此利用一樣的線性表示的表達式。
所謂 Machine Learning 裏的 Learning ,就是在創建一個模型以後,經過給定數據來求解模型參數。而 Manifold Learning 就是在模型裏包含了對數據的流形假設。
參考博客:
http://blog.pluskid.org/?p=533
https://blog.csdn.net/sinat_32043495/article/details/78997758