1. 程式人生 > >資料探勘:概念與技術(第三版)之第五章的學習記錄

資料探勘:概念與技術(第三版)之第五章的學習記錄

資料立方體

本章主要介紹資料立方體技術
在第四章的時候已經提到過,在資料探勘中有一種OLAP風格的多維資料探勘被廣泛的使用。因此,為了追求其良好的效能,我們對多維模型需要進行預計算和建立索引。第四章只是簡單的說道了完全立方體,冰山立方體等概念。在第五章,我們著重對完全立方體的物化技術和冰山立方體的物化技術進行講解。

首先大家需要明確一些概念。
詳細見書P122,5.1.1節圖5.1及其下方的基本單元,聚集單元,祖先,子女,父母。

在有些時候,我們希望預計算完全立方體(注意這裡不要理解成了一個立方體的所有單元而是給定資料立方體(資料立方體就是方體的格)的所有方體的所有單元)。但實際上,我們知道計算所有立方體的所有單元的開銷是非常大的,但是不是這樣我們就不用研究它的計算方法了呢?實際上不是這樣的,既然有問題,那必然會有相應的解決辦法。比如對於開銷來說,我們可以單獨用一個輔助儲存器來存放它,或者僅把這種演算法用在維數比較少的方體上。但其實更重要的是,理解完全立方體的演算法有助於我們理解部分立方體的計算方法

一般來說,不管是完全立方體和部分立方體,其計算優化策略一般都是這麼幾個
1.排序、雜湊和分組
利用排序、雜湊和分組操作對共享一組相同維值的元組(就是相同格式的資料)進行聚集,這樣有利於計算
2.同時聚集和快取中間結果
計算時不必要每次都從頭算起,利用中間結果進行二次計算會大幅減少開銷
3.選擇合適的子女方體泛化
4.利用先驗剪枝方法有效地計算冰山立方體
這一條策略,可以說是最重要的策略了。我們將在後面細說。關於先驗性質的表述如下:如果給定的單元不滿足最小支援度,則該單元的後代(即更特殊化的單元)也都不滿足最小支援度。

完全立方體的計算方法

多路陣列聚集(Multiway)
我們在第四章的時候已經稍微提到過一點,高效能的OLAP操作依賴於多維資料模型及物化和索引技術。其中物化技術分為全部物化和部分物化。這裡的多路資料聚集是全部物化的一種演算法,而且是一種典型的使用陣列直接定址的MOLAP方法。我們知道全部物化就是把整個資料立方體進行預計算。那麼我們在把整體放入記憶體中進行計算的時候,為了節約資源或者說提高效能。必須要考慮這麼兩個東西。
(1)儘量減少塊反覆調入記憶體的次數。
(2)儘量利用較少的記憶體空間完成計算。
大家首先要明確的是,塊的計算順序是會影響計算所需記憶體的大小的

。為什麼?其實很簡單,像資料立方體這種結構加上全部物化這種操作,勢必要重複訪問某些單元甚至是重複訪問全部單元(想想方體的格)。如果我們訪問次序不當的話,那麼很有可能那些之前被訪問過的單元還要被訪問多次,這就會造成某些單元一直在頻繁的進出記憶體。所以我們假如把這些會被重複訪問的單元一直放在記憶體中,就可以有效的解決記憶體的開銷問題。
當然,上面只是籠統的說了一下,也不是太準確。主要是提供了一種思路。
所以,正如上文所說。我們現在需要做到就是兩個東西
(1)在記憶體中保持某些單元。
(2)改變訪問次序,力求在記憶體中持有最小數量的單元。
OK,參考書上P127頁,圖5.3.
一般情況下來說,先從基數小的維開始聚集。在本例中設A=40,B=400,C=4000,則先聚集A,計算2-D面BC;然後聚集B,計算2-D平面AC;聚集C,計算2-D平面AB。其中AB平面最小,AC平面次大,BC平面最大。
因為計算剛開始的四個塊1,2,3,4就可以得到BC面的第一塊,並且之後每連續的四個塊一組得到下一個BC面的塊,則在計算BC面時只需要緩衝BC面一個塊的大小100*1000就可以,之後計算的16次均重複利用此記憶體塊。
因為只有在調入塊13的時候才可以計算得AC面的一塊,則前面的12塊都應該得到快取,所以在計算AC面的時候,快取的結果大小為AC面的一行,即40*1000;  
因為只有調入第49塊的時候才可以計算AB面,則前面計算結果均需儲存,所需記憶體應為AB整個平面的面積,即40*400.
所以在此次計算中所需的記憶體為:40*400(AB整個平面)+40*1000(AC平面的一行)+100*1000(BC平面的一塊)。即在記憶體中常駐AB整個平面,AC平面的一行,BC平面的一塊。
而按照書上給出的對比的 次序訪問的話,記憶體開銷為是上面的十倍。所以最優次序就是按塊次序1~64依次訪問。
因此,實際上整體的思路還是很清晰的。所有的目的都是為了在儘量減少開銷的基礎上加快操作速度 。
同樣的,可以推廣至0-D和1-D。總的來說,大致思路一致。就是在記憶體中存放最小的方體的全部塊;存放次大的方體的一行塊;存放最大的方體的一塊塊

書上P128頁靠下處即129頁給出了適用情景等 ,寫得很明瞭。
參考文章:多路資料聚集詳解

在實際中,我們可能對方體的許多單元都不感興趣,並且方體中還有許多單元的數值是稀疏的。因此我們希望在計算方體的時候
只計算滿足我們需要的部分方體就好了,這不僅可以減少計算開銷還能我們的分析更加聚焦。
因此這種部分物化的立方體被成為冰山立方體,滿足需要的最小閥值稱為最小支援度閥值。

部分立方體的計算方法

首先要搞清楚的是,什麼是先驗剪枝?
對於資料立方體來說,先驗性質表述如下:如果給定的單元不滿足最小支援度,則該單元的後代(即更特殊的單元也都不滿足最小支援度)。因此,假如說一個方體單元的計數小於最小支援度閥值,那麼我們將其剪枝,因為其後代的任何計數都不可能高於閥值。進行剪枝之後,直接就減少了大量的不符合我們要求的資料,顯著的提高了效能。

BUC:從頂點方體向下計算冰山立方體
BUC是一種計算稀疏冰山立方體的演算法。關於冰山立方體的前面已經介紹過了,其中最重要的概念就是最小度量值。一旦不滿足最小度量值,則根據先驗性質(Apriori property),可以對該單元及其後代進行剪枝。因此這種演算法實際上不同於上面提到的多路陣列聚集演算法共享計算,BUC直接減少了計算數量。
那麼具體做法其實很簡單,用了遞迴的思想。具體過程寫得很清楚。
可以參考下這篇文章BUC

Star-cubing
參考下這篇文章Star-cubing。目前其實我不太理解這個演算法的具體流程,而且書上說兼具Multiway和BUC的優點,但是我只看到了剪枝的優勢。而且,對於星樹的構造實在讓人費解。這裡暫且放一下

外殼片段方法
前面所說的計算冰山立方體只物化資料立方體的一小部分,但這還不是最終的解。原因是最小閥度值很不好確定,定小了,則開銷巨大;定大了則會丟失許多細節。此外,冰山立方體一旦產生增量更新則需要完全從頭計算。
因此,一個可能的解是計算一個很薄的立方體外殼。即只預計算涉及少數維(如3~5個維)的方體,但這種方法會帶來一些問題,即對OLAP支援相當差。
實際上,儘管資料立方體包含很多維,但我們通常都只在少數的幾個維上進行OLAP操作。因此,基於從實際使用的角度出發,我們一般的做法是這樣的:
1.首先找到某些感興趣的方體;
2.在這些方體中,沿一兩個維下鑽;
3.考察相關維的變化。
所以,實際上,計算完全立方體,冰山立方體或外殼立方體很有可能是多餘的。因此,這裡引出一種新的計算方法,即外殼片段方法。

這種演算法的基本思想如下:給定一個高維資料集,把維劃分成互不相交的維片段,把每個片段轉化成倒排索引表示,然後構造立方體外殼片段,並保持與立方體單元相關聯的倒排索引。
OK,這樣的話,我們使用立方體外殼片段(預計算過的),就可以聯機地,動態地組裝和計算所需要的資料立方體的方體單元(通過倒排索引上的集合交操作完成)
這是個什麼概念呢?其實有點模組化的意思。我把它搞成模組化,到時候直接組裝就行了。

那麼這種演算法,會涉及到三個東西。
1.倒排索引
2.構造立方體外殼片段
3.用外殼片段來回答OLAP查詢

其中倒排索引比較好理解,資料也比較多,百度一下就OK,這裡就不說了。這裡重點說說如何構造資料立方體的外殼片段。在書137頁最後一段,給出了計算流程圖。其中我們要重點關注一句“計算它的完全資料立方體”。OK,到這裡我們知道了,在前面,我已經說過,研究完全立方體的演算法可以用來指導 我們研究部分立方體的演算法。在這裡,Frag-shell(外殼片段演算法)實際上就借鑑了完全立方體的思想。既然你體量很大,那麼我們把你劃分成n多個的小東西不就行了嘛!在後面的對比中我們可以看到在面對60維時,採用Frag-shell比直接算,效能高了幾百倍=。=

OK,那麼構造了外殼片段,我們如何使用他們來回答OLAP的查詢呢?
首先我們要弄清楚查詢型別,之後在分型別進行響應。具體的書上139-141有詳細的介紹。

處理高階查詢

上面提到的點查詢和子立方體查詢是典型的用於商務資料倉庫應用的。那種資料立方體相對來說還是簡單的多維結構。我們接下來要介紹的是傳統資料立方體技術的拓展,使用這種拓展技術可以用來回答在樣本資料立方體上的查詢,top-k查詢。實際上,基本資料立方體已經進一步擴充套件到各種複雜的資料 和 新的應用。比如空間資料立方體,多媒體立方體等等。在這裡,我們只介紹幾個簡單的擴充套件。

抽樣立方體
樣本資料是我們在統計中經常需要用到的。而假如把傳統的OLAP工具用於樣本資料(即用樣本資料來構造傳統的資料立方體)則會產生一些問題。為此,我們需要針對樣本資料引入一種新的立方體結構。它就是抽樣立方體。
抽樣立方體是一種儲存樣本資料和它們多維聚集的資料立方體結構。它支援樣本資料上的OLAP操作。此外,它還要計算置信區間。
我們知道,我們進行抽樣的目的是希望通過樣本來估計總體。為了度量估計結果是否符合總體,我們引入了置信區間這個概念。置信區間能夠告訴我們結果的可靠程度。置信區間越小,則這個結果越可靠。
書上P142,5.1給出了置信區間的公式 。觀察這個公式我們會發現。影響置信區間大小的主要因素有兩個:樣本資料的方差和樣本大小。
這個很好理解,如果樣本資料的方差過大時,說明我們選擇的樣本資料就不好,沒有“代表性”;而樣本過小時,會有較小的自由度導致較大的置信區間。
針對方差過大的問題,我們的解決辦法是下鑽到更細節的單元,即做更細節的查詢;針對樣本資料過小的問題,我們的解決方法也很簡單,那就是取得更多的資料。
但是,我們要明確一點的是。雖然立方體裡面有足夠多的資料,但是不是隨便哪個資料就能作為擴充資料來使用的。我們通常使用“鄰近”單元中的資料。
那麼如何使用“鄰近”單元中的資料呢?我們通常採用兩種方法:方體內查詢擴充套件和方體間查詢擴充套件。

方體內查詢擴充套件
我們知道在方體內部有很多維。現在我們面臨的問題是抽樣資料過小,那麼這種方法很簡單,就是通過在該方體內部擴充套件一些維來擴大樣本。這個很好理解。那麼問題來了,我們到底該擴充套件哪些維呢??
注意了!!!在這裡,我們要遵循一個引入原則,那就是“新樣本旨在提高回答的置信度,而不改變查詢的語義。”什麼意思?說白了就是你擴充套件的維不能與你待預測的值有很大的關係。
書上舉了個例子。在這裡例子,我們主觀認知,收入與教育水平有關係。此時,樣本資料過小了,我們需要進行樣本內查詢擴充套件。假如說我們擴充套件education維的話,這就違反了原則。因為education與income的關係非常密切,我們這樣做可能會改變最終的結果,因此,我們擴充套件birth_month。因為我們通常認為,income與出生年月日沒有什麼關係。
在上面我們反覆提到了關係,那麼究竟如何來度量這些關係呢?換句話說,我們怎麼知道這個維與待預測的值之間有沒有關係?
很簡單,其實這就是一個相關性的問題。我們在第二章就提到過計算相關性的問題。其實這裡也是一樣的。通常的,我們對數值資料使用皮爾遜相關係數來計算相關性,而對標稱資料使用卡方檢驗
OK,到這裡,我們已經知道了該拓展那些維了。那麼是不是我們就一定要使用拓展維裡面的所有資料呢?
答案是否定的,我們應該選擇語義類似的值。如何選擇語義類似的值?方法有兩個:一個是選擇接近被例示的查詢值的值,一個是使用t-檢驗。
P143下面有詳細解釋,P144,例5.14也有詳細的例子展示。

方體間查詢
理解了方體內查詢,方體間查詢就很好理解了。具體檢視書145頁。

排序立方體
同樣的,Top-k查詢在日常生活中也是比較常見的。而傳統的資料立方體不能滿足這種要求。因此,我們引入一種新的立方體結構,即排序立方體。排序立方體的核心思想是物化+分割槽。具體看書145,5.3.2

總結,第五章涉及到很多資料庫方面的知識。對這一塊不是特別熟悉的,很吃力的同學,可以暫時忽略這一章。等以後在實際工作中有需要了,再去了解。