大數據,人人都說大數據;類似於人人都知道黃曉明跟AB結婚一樣,那么什么是大數據?對不起,作為一個本科還沒畢業的小白實在是無法回答這個問題。我只知道目前研究的是高維,分布在n遠遠大於2的歐式空間的數據如何聚類。今年的研究生數模中用大數據引出了一個國內還不怎么火熱的概念——多流形結構。題目中那個給出的流形概念:流形是局部具有歐氏空間性質的空間,歐氏空間就是流形最簡單的實例。從而在2000年提出了多流形學習:基於數據均勻采樣於一個高維歐氏空間中的低維流形的假設,流形學習試圖學習出高維數據樣本空間中嵌入的低維子流形,並求出相應的嵌入映射。
很無奈的是這些復雜的文字看了兩天外加其他論文的參考也沒搞明白,整個人就是稀里糊塗,什么是子空間?什么是稀疏子空間?什么是低秩子空間?我知道這些方法的提出很多是基於目前廣泛應用的非線性數據中譜聚類算法有關,希望能從中找到答案。首先我們來了解幾個陌生的概念熱身一下:
- Graph(Ps:Thanks for the contributions of wiki,sorry for no way to donate a cup of coffee)
不妨開一下腦洞,如果把數據可視化為歐式空間的點,那么數據與數據之間的聯系就用權重表示,這個權重就是點之間的連線也叫邊。權重顧名思義就是分量,關系(中國人的思維),假設把我跟你之間的關系用權重表示,可能是沒有關系(權重為0),可能有關系(權重為1)。當然也可以用相關性來看待兩個點之間的相似度,我跟你之間連接越緊密,說明關系越深,相似度越大,所謂:物以類聚,人以群分。所以就有了大大小小的集合,真個社交會如果用圖來表示,就是一個巨大的社交網絡圖G=(V,E),V表示點的集合,E表示邊的集合。
- Cut(值為被切割的邊的權值之和)
現在我是上帝,我要將你們這群人一分為二(現實的聚類往往是2類以上)!如何分割?當然是找關系稀疏的地方下手。譜聚類的目的就是找到一個合理的分割即找到連接兩個子網絡的權重盡可能小的邊,並將其殘忍砍斷,讓你們各自畫地為牢~並使得子網絡內部的邊權盡量大。
這種一分為二的切割情況、具體的Cut值表示以及切割情況如下圖所示(以下部分圖來自“A Tutorial on Spectral Clustering”):

以上公式中,Wnm為屬於類C1中的點n到類C2中的點m之間的權重;Cut(C1,C2)為類C1與C2之間的Cut值,至於具體的切割方式,我們主要推出以下三種常見的切割方式:

本來的目的是只要使得切割的cut值最小,也就是把權重最小的的邊切斷就好,但是人們發現這樣的切割方式運用在數據中如果存在上圖紅色點標記的離異點時就會讓划分不均勻,造成離異的數據點和密集分布的數據被分別聚類,而現實中往往這些離異數據很可能並不是那么“離異”,因此這樣就達不到我們聚類的效果,畢竟聚類是希望把特征相似的數據聚類而不是將“不聽話”的數據識別出來。因此,為了產生分布較為“均勻”,因此提出以下兩種分割方式~
- RatioCut
公式如下:

其中
為子圖Ci(i=1,2)中包含的頂點數目。該目標函數用類內頂點數作分母,反映了一些類內信息,對傾斜划分能起到一定的約束作用,但頂點數多並非類內相似度大的充要條件,因此我們需要更換“標准化數據”的條件,由此,標准化切割被提出~
- Normalized cut

上圖公式中的Vol(Ci)為類Ci的點到空間中相連接點的權重之和。
看起來,第三種方法非常之強大,既滿足不同類間的權值和最小,同一個類內的權值和最大,似乎把需要解決的問題都解決了。But,here is our problem:這個問題的最優解的求解問題是一個NP-hard problem!至於什么是NP-hard,抱歉,各位自行看wiki鏈接吧,我是不明白,也沒有研究過這一塊了。不過不明白也不影響我們后面的譜聚類算法的提出。只要知道譜聚類算法就是解決這個NP問題的一個近似算法,類似於偏微分中常常是以數值解來逼近真實解的道理~
既然我們了解了譜聚類的目的和由來,下面舉個小例子完整的理解一下整個譜聚類算法過程:
(0)空間中有這么6個數據點:A,B,C,D,E關系如下(無向加權圖):

(1)構造鄰接矩陣
由於鄰接矩陣W的構造原理是:如果空間中任意點a與點b屬於同一個子圖,假設邊權全部取值為1,那么W的第a行第b列的元素W(a,b)=W(b,a)=1,反之為0。因此我們由上圖關系構造的鄰接矩陣W為:

上圖的鄰接矩陣通常用來描述圖中點與點之間的關系,其中W的行列標好分別對應於點A,B,C,D,E,F。其實我們也會發現無向圖的鄰接矩陣實際上是沿着對角線對稱的一個對稱矩陣,而且主對角線上的元素全部為0。
(2)構造度矩陣(某個點的度指的是與該點關聯的點之間的總權數,比如A點的度為2,因為A分別與B、C兩點相連且權為1)
那么度矩陣如何構造?第i點的度其實就是鄰接矩陣W的第i列或行的元素相加,因此我們將W的每一列元素相加依次存入一個對角矩陣的對角線上,該矩陣的主對角線以外的元素全部為0,因此本例中的度矩陣D如下:

(3)相似度矩陣(也叫拉普拉斯矩陣)
這個拉普拉斯矩陣L的得來聽得很牛×,實際上就是L=D-W,計算結果如下:

相信稍微熟悉線代的朋友都看出來這個矩陣的一些性質:主對角線的上元素的值對應的是該點的度,某一列元素中值為-1的下標對應的是與該點關聯的點,至於不相關的點的元素值當然都是1咯。
(4)計算特征值和特征向量
接下來就很好理解,計算這個拉普拉斯矩陣的前k個特征值和對應的特征向量。如果說前面的拉普拉斯矩陣的構造是為了將數據之間的關系反映到矩陣中,那么計算特征值以及特征向量從而達到將維度從N維降到k維,然后維度降下來了,我們就可以很happy的使用kmeans聚類,聚類完成后再將數據投影到原始數據上,這樣原始數據就成功聚類啦~
關於特征值和特征向量的理解,我這里引用知乎上面的一個精彩回答:
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:Dan Pan
鏈接:http://www.zhihu.com/question/21082351/answer/19055262
來源:知乎
特征值是
矩陣特有的值。說其為特征值,根據定義也好理解:
,則說
是一個特征值,
是一個特征向量。換句話說,在
這個方向上,
做的事情無非是把
沿其
的方向拉長/縮短了一點(而不是毫無規律的多維變換)。
就是描述沿着這個方向上拉伸的比例。
那么這樣,給定任意的一個向量
,我們如何求
呢? 很簡單,把
沿着
分解,然后分別按照各自的比例
伸縮 最后再求和即可。
既然我們要將N維的矩陣壓縮到k維矩陣,那么就少不了特征值,取A的前k個特征值進而計算出k個N維向量P(1),P(2),...,P(k).這k個向量組成的矩陣N行k列的矩陣(經過標准化)后每一行的元素作為k維歐式空間的一個數據,將這N個數據使用kmeans或者其他傳統的聚類方法聚類,最后將這個聚類結果映射到原始數據中,原始數據從而達到了聚類的效果。
當然,這里僅僅是昨天一天的研究成果,是參考了多個博客和指導書的情況下豁然開朗,但是隨着今天筆記的進行,發現自己還是有很多不明白的地方,比如具體的切割是怎么實現?具體的特征值以及特征向量又是如何求解,以及最重要的是把自己寫的代碼運用到實際的數據聚類效果又是怎樣?
Problem1:How to create the similarity matrix?
我們知道,正如萬有引力的存在,任何物質之間的引力都存在,只不過萬有引力的大小跟距離和質量有關系。那么空間中的任何兩個數據應該也是都有一定的相關關系的,事情往往不如我們上面舉例中的權重為0和1來區分,如何確定他們每個點與其他點之間的相似度?如何確定邊上的權重分布?怎么得到相似度矩陣?
已知空間中有這么一群數據點:

任意點Sn與點Sm之間的權重為Wnm,那么用這個權重來描述點Sn與點Sm之間的相似度,則該值一般使用高斯核函數來度量:

這里的歐幾里德距離平方,是由於我們計算的歐式距離往往是需要開根號,因此取平方值也是方便計算。由上述公式可以輕易得到隨着兩個點之間距離的增大,近似度也在不斷減小,且總在0到1之間。這里有一個自由參數
的確定是一個問題:
1、早先的自由參數的確定是選取多個自由參數,然后將聚類效果最好的那個參數作為最終的參數,但是這樣計算時間就增加了;
2、也有人提出通過經驗公式確定這個自由參數,例如有人取距離變化范圍的10%~20%或者取最大歐式距離的5%,但是這樣的經驗並不適用於所有的數據集;
3、Zelnik-Manor和Perona提出的Self-Tuning算法得到了比較廣泛的應用。該方法是利用每個點自身的領域信息為每個點計算一個自適應的參數,兩點之間的相似度被定義如下:

假設任何一點Sn有t個最近鄰點。如果我們將這些鄰點按照降序排列,計算出Sn到第t/2個近鄰點之間的距離,並將其定義為
,依次更新近鄰點之間的相似度。(至於這個t的取值,通常取14)
主要算法步驟如下:
- 計算出樣本數據任何一點與其他點之間的距離,並存入距離矩陣d中;
- 對每一個點Sn與其他點之間的距離進行排序,即對距離矩陣d按照行或者列進行降序排序,取排行第7的那個距離為
,並將這些
存入向量m; - 根據距離矩陣d以及參數向量m,運用Wnm的公式求出相似度矩陣W。
Problem2:How to get the Affinity matrix?
我們給每一個數據之間的聯系確定了權重,那么這個相似度矩陣W(similarity matrix)並不是我們想要的鄰接矩陣(Affinity matrix),因為理想情況下,同一個類的連點間的相似度為1,不同類內點之間的相似度為0,而我們計算的相似度往往是介於0到1之間。有人提出可以將權重小於某一個閾值的邊權重置為0,大於該閾值的邊權重置為1,因此就有了我們想要的二值化的鄰接矩陣,但是這個閾值的取定也是一個非常值得討論的問題。實際上這方面能夠很好的解決問題的算法很少被關注,然而,作為一個想要最優化算法的人來說,肯定是想面面俱到,卻發現自己挖掘的坑越來越大~
還有一些其他的問題就不再多贅述,以下兩篇博客里的公式推導非常詳細:
從拉普拉斯矩陣說到譜聚類
漫談 Clustering (4): Spectral Clustering
感謝其他參考文獻,在此就懶得給出參考鏈接,一一謝過~總算是弄明白了一些事情,話說我的重點不應該是稀疏子空間聚類SMMC么?突然發現自己真的是跳進自己挖0的坑越來越無法自拔。。。
