⑴ 數據挖掘十大演算法-
整理里一晚上的數據挖掘演算法,其中主要引自wiki和一些論壇。發布到上作為知識共享,但是發現Latex的公式轉碼到網頁的時候出現了丟失,暫時沒找到解決方法,有空再回來填坑了。
——編者按
一、 C4.5
C4.5演算法是由Ross Quinlan開發的用於產生決策樹的演算法[1],該演算法是對Ross Quinlan之前開發的ID3演算法的一個擴展。C4.5演算法主要應用於統計分類中,主要是通過分析數據的信息熵建立和修剪決策樹。
1.1 決策樹的建立規則
在樹的每個節點處,C4.5選擇最有效地方式對樣本集進行分裂,分裂規則是分析所有屬性的歸一化的信息增益率,選擇其中增益率最高的屬性作為分裂依據,然後在各個分裂出的子集上進行遞歸操作。
依據屬性A對數據集D進行分類的信息熵可以定義如下:
劃分前後的信息增益可以表示為:
那麼,歸一化的信息增益率可以表示為:
1.2 決策樹的修剪方法
C4.5採用的剪枝方法是悲觀剪枝法(Pessimistic Error Pruning,PEP),根據樣本集計運算元樹與葉子的經驗錯誤率,在滿足替換標准時,使用葉子節點替換子樹。
不妨用K表示訓練數據集D中分類到某一個葉子節點的樣本數,其中其中錯誤分類的個數為J,由於用估計該節點的樣本錯誤率存在一定的樣本誤差,因此用表示修正後的樣本錯誤率。那麼,對於決策樹的一個子樹S而言,設其葉子數目為L(S),則子樹S的錯誤分類數為:
設數據集的樣本總數為Num,則標准錯誤可以表示為:
那麼,用表示新葉子的錯誤分類數,則選擇使用新葉子節點替換子樹S的判據可以表示為:
二、KNN
最近鄰域演算法(k-nearest neighbor classification, KNN)[2]是一種用於分類和回歸的非參數統計方法。KNN演算法採用向量空間模型來分類,主要思路是相同類別的案例彼此之間的相似度高,從而可以藉由計算未知樣本與已知類別案例之間的相似度,來實現分類目標。KNN是一種基於局部近似和的實例的學習方法,是目前最簡單的機器學習演算法之一。
在分類問題中,KNN的輸出是一個分類族群,它的對象的分類是由其鄰居的「多數表決」確定的,k個最近鄰居(k為正整數,通常較小)中最常見的分類決定了賦予該對象的類別。若k = 1,則該對象的類別直接由最近的一個節點賦予。在回歸問題中,KNN的輸出是其周圍k個鄰居的平均值。無論是分類還是回歸,衡量鄰居的權重都非常重要,目標是要使較近鄰居的權重比較遠鄰居的權重大,例如,一種常見的加權方案是給每個鄰居權重賦值為1/d,其中d是到鄰居的距離。這也就自然地導致了KNN演算法對於數據的局部結構過於敏感。
三、Naive Bayes
在機器學習的眾多分類模型中,應用最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBC)[3]。樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。同時,NBC模型所需估計的參數很少,對缺失數據不太敏感,演算法也比較簡單。
在假設各個屬性相互獨立的條件下,NBC模型的分類公式可以簡單地表示為:
但是實際上問題模型的屬性之間往往是非獨立的,這給NBC模型的分類准確度帶來了一定影響。在屬性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型;而在屬性相關性較小時,NBC模型的性能最為良好。
四、CART
CART演算法(Classification And Regression Tree)[4]是一種二分遞歸的決策樹,把當前樣本劃分為兩個子樣本,使得生成的每個非葉子結點都有兩個分支,因此CART演算法生成的決策樹是結構簡潔的二叉樹。由於CART演算法構成的是一個二叉樹,它在每一步的決策時只能是「是」或者「否」,即使一個feature有多個取值,也是把數據分為兩部分。在CART演算法中主要分為兩個步驟:將樣本遞歸劃分進行建樹過程;用驗證數據進行剪枝。
五、K-means
k-平均演算法(k-means clustering)[5]是源於信號處理中的一種向量量化方法,現在則更多地作為一種聚類分析方法流行於數據挖掘領域。k-means的聚類目標是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類。
5.1 k-means的初始化方法
通常使用的初始化方法有Forgy和隨機劃分(Random Partition)方法。Forgy方法隨機地從數據集中選擇k個觀測作為初始的均值點;而隨機劃分方法則隨機地為每一觀測指定聚類,然後執行「更新」步驟,即計算隨機分配的各聚類的圖心,作為初始的均值點。Forgy方法易於使得初始均值點散開,隨機劃分方法則把均值點都放到靠近數據集中心的地方;隨機劃分方法一般更適用於k-調和均值和模糊k-均值演算法。對於期望-最大化(EM)演算法和標准k-means演算法,Forgy方法作為初始化方法的表現會更好一些。
5.2 k-means的標准演算法
k-means的標准演算法主要包括分配(Assignment)和更新(Update),在初始化得出k個均值點後,演算法將會在這兩個步驟中交替執行。
分配(Assignment):將每個觀測分配到聚類中,使得組內平方和達到最小。
更新(Update):對於上一步得到的每一個聚類,以聚類中觀測值的圖心,作為新的均值點。
六、Apriori
Apriori演算法[6]是一種最有影響的挖掘布爾關聯規則頻繁項集的演算法,其核心是基於兩階段頻集思想的遞推演算法。該關聯規則在分類上屬於單維、單層、布爾關聯規則。Apriori採用自底向上的處理方法,每次只擴展一個對象加入候選集,並且使用數據集對候選集進行檢驗,當不再產生匹配條件的擴展對象時,演算法終止。
Apriori的缺點在於生成候選集的過程中,演算法總是嘗試掃描整個數據集並盡可能多地添加擴展對象,導致計算效率較低;其本質上採用的是寬度優先的遍歷方式,理論上需要遍歷次才可以確定任意的最大子集S。
七、SVM
支持向量機(Support Vector Machine, SVM)[7]是在分類與回歸分析中分析數據的監督式學習模型與相關的學習演算法。給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練演算法創建一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器。SVM模型是將實例表示為空間中的點,這樣映射就使得單獨類別的實例被盡可能寬的明顯的間隔分開。然後,將新的實例映射到同一空間,並基於它們落在間隔的哪一側來預測所屬類別。
除了進行線性分類之外,SVM還可以使用所謂的核技巧有效地進行非線性分類,將其輸入隱式映射到高維特徵空間中,即支持向量機在高維或無限維空間中構造超平面或超平面集合,用於分類、回歸或其他任務。直觀來說,分類邊界距離最近的訓練數據點越遠越好,因為這樣可以縮小分類器的泛化誤差。
八、EM
最大期望演算法(Expectation–Maximization Algorithm, EM)[7]是從概率模型中尋找參數最大似然估計的一種演算法。其中概率模型依賴於無法觀測的隱性變數。最大期望演算法經常用在機器學習和計算機視覺的數據聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在E步上求得的最大似然值來計算參數的值。M步上找到的參數估計值被用於下一個E步計算中,這個過程不斷交替進行。
九、PageRank
PageRank演算法設計初衷是根據網站的外部鏈接和內部鏈接的數量和質量對網站的價值進行衡量。PageRank將每個到網頁的鏈接作為對該頁面的一次投票,被鏈接的越多,就意味著被其他網站投票越多。
演算法假設上網者將會不斷點網頁上的鏈接,當遇到了一個沒有任何鏈接出頁面的網頁,這時候上網者會隨機轉到另外的網頁開始瀏覽。設置在任意時刻,用戶到達某頁面後並繼續向後瀏覽的概率,該數值是根據上網者使用瀏覽器書簽的平均頻率估算而得。PageRank值可以表示為:
其中,是被研究的頁面集合,N表示頁面總數,是鏈接入頁面的集合,是從頁面鏈接處的集合。
PageRank演算法的主要缺點是的主要缺點是舊的頁面等級會比新頁面高。因為即使是非常好的新頁面也不會有很多外鏈,除非它是某個站點的子站點。
十、AdaBoost
AdaBoost方法[10]是一種迭代演算法,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率。每一個訓練樣本都被賦予一個權重,表明它被某個分類器選入訓練集的概率。如果某個樣本點已經被准確地分類,那麼在構造下一個訓練集中,它被選中的概率就被降低;相反,如果某個樣本點沒有被准確地分類,那麼它的權重就得到提高。通過這樣的方式,AdaBoost方法能「聚焦於」那些較難分的樣本上。在具體實現上,最初令每個樣本的權重都相等,對於第k次迭代操作,我們就根據這些權重來選取樣本點,進而訓練分類器Ck。然後就根據這個分類器,來提高被它分錯的的樣本的權重,並降低被正確分類的樣本權重。然後,權重更新過的樣本集被用於訓練下一個分類器Ck[,並且如此迭代地進行下去。
AdaBoost方法的自適應在於:前一個分類器分錯的樣本會被用來訓練下一個分類器。AdaBoost方法對於雜訊數據和異常數據很敏感。但在一些問題中,AdaBoost方法相對於大多數其它學習演算法而言,不會很容易出現過擬合現象。AdaBoost方法中使用的分類器可能很弱(比如出現很大錯誤率),但只要它的分類效果比隨機好一點(比如兩類問題分類錯誤率略小於0.5),就能夠改善最終得到的模型。而錯誤率高於隨機分類器的弱分類器也是有用的,因為在最終得到的多個分類器的線性組合中,可以給它們賦予負系數,同樣也能提升分類效果。
引用
[1] Quinlan, J. R. C4.5: Programs for Machine Learning. Morgan Kaufmann Publishers, 1993.
[2] Altman, N. S. An introction to kernel and nearest-neighbor nonparametric regression. The American Statistician. 1992, 46 (3): 175–185. doi:10.1080/00031305.1992.10475879
[3] Webb, G. I.; Boughton, J.; Wang, Z. Not So Naive Bayes: Aggregating One-Dependence Estimators. Machine Learning (Springer). 2005, 58 (1): 5–24. doi:10.1007/s10994-005-4258-6
[4] decisiontrees.net Interactive Tutorial
[5] Hamerly, G. and Elkan, C. Alternatives to the k-means algorithm that find better clusterings (PDF). Proceedings of the eleventh international conference on Information and knowledge management (CIKM). 2002
[6] Rakesh Agrawal and Ramakrishnan Srikant. Fast algorithms for mining association rules in large databases. Proceedings of the 20th International Conference on Very Large Data Bases, VLDB, pages 487-499, Santiago, Chile, September 1994.
[7] Cortes, C.; Vapnik, V. Support-vector networks. Machine Learning. 1995, 20 (3): 273–297. doi:10.1007/BF00994018
[8] Arthur Dempster, Nan Laird, and Donald Rubin. "Maximum likelihood from incomplete data via the EM algorithm". Journal of the Royal Statistical Society, Series B, 39 (1):1–38, 1977
[9] Susan Moskwa. PageRank Distribution Removed From WMT. [October 16, 2009]
[10] Freund, Yoav; Schapire, Robert E. A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting. 1995. CiteSeerX: 10.1.1.56.9855
⑵ 計算復雜性理論的理論與實踐
計算復雜性的初衷是理解不同演算法問題的難度,特別的是一些重要演算法問題的困難性。為了確切的描述一個問題的困難性,計算復雜性的第一步抽象是認為多項式時間是有效的,非多項式時間是困難的。這基於指數函數增長速度的「違反直覺」的特性:如果一個演算法的時間復雜性為2,取輸入的規模是100,在運算速度是10每秒(關於CPU速度,參見Instructions per second,其中報告截止2009年,主流個人電腦的運算速度可以看作是每秒
)
的情況下,該程序將會運行年,幾乎是宇宙年齡。這為多項式時間被看作是有效時間提供了直觀上的證據。
然而多項式的指數很大的時候,演算法在實踐中也不能看作是有效的。如n的多項式演算法,取問題規模大小為1000,那麼幾乎就是2的大小。另一方面,即便一個問題沒有多項式演算法,它可能會有近似比很好的近似演算法(參見近似演算法),或有很好的啟發式演算法(heuristics)。啟發式演算法的特點是在理論上沒有精確的行為的分析,或者可以表明存在很壞的輸入,在這些輸入上運行很慢。然而在大多數時候,它都能快速解決問題。計算復雜性中對應的理論分析是平均復雜性理論(average-case complexity theory)和光滑分析(smooth analysis)。實際中的例子包括en:Presburger arithmetic、布爾可滿足性問題(參見SAT solver)和背包問題。
⑶ 演算法基礎
謹以此文,感謝我在這個學校最喜歡的兩個老師之一——肖my老師。本文基本為老師上課說講授內容加上一部分自己的感悟拼湊而來,寫作文本的目的是為自己的演算法課程留下一點點東西,站在老師肩膀上形成粗糙的框架,方便以後的復習以及深入。文筆有限,其中包含的錯誤還請多多包容,不吝賜教。
to do list:
時間復雜度中遞歸樹法;動規,分治新的感悟;
點覆蓋:一組點的集合,使得圖中所有邊都至少與該集合中一個點相連。
支配集:一組點的集合,使得圖中所有的點要麼屬於該集合,要麼與該集合相連。
最大團:在一個無向圖中找出點數最多的完全圖。
獨立集:一組點的集合,集合中的頂點兩兩不相鄰。(團轉過來)
SAT問題:也稱布爾可滿足性問題。給一組變
其中Ci被稱為句子。
點覆蓋<->獨立集<->最大團
最小割:割是一組邊集。如s-t割就是如果去掉這些邊,將把原圖劃分為兩個點集,其中一個點集包含s,一個點集包含t。(兩個是指不相連,而不是代表不存在邊相連,如反向邊)
decision problem: 是否存在。
search problem:找到一個解。
(這個還能擴展,比如decision problem在多項式時間內解決,所以他是P問題嗎)
漸進符號:
注意以上三種都是緊的,對應的兩個小寫的符號是不緊的,即如下圖所示:
概念:演算法的時間復雜度是一個函數,用於定性描述演算法的運行時間。注意,這個一個代表演算法輸入字元串長度的函數。
[注]輸入字元串長度是一個比較關鍵的理解,比如在背包問題中,其時間復雜度為O(nW),因為W不定,所以只能是一個偽多項式時間。
比較:c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n! < n^n
大致:常數<對數<冪函數<指數函數<階乘
對於指數是n相關的進行比較,優先比較指數,再比較底數。
記住一個特例:n (logn)<n!<n n
計算:
一般來說,計算採用主方法和遞歸樹法,其中遞歸樹技巧性比較強,主方法其實也是遞歸樹推導歸納而來,且主方法能得到一個比較緊的結果。
主方法:
f(n) = af(n-b)+g(n) =>O( a^(n/b) *g(n) )
P:decision problems有一個多項式演算法。
NP(nondeterministic polynomial-time):decision problems能夠在多項式時間內驗證。
NPC:NP完全問題,首先這個問題是NP的,其次,其他所有問題都可以多項式時間內歸約到它。
NPH:如果所有NP問題都可以多項式時間歸約到某個問題,則稱該問題為NP困難。
因為NP困難問題未必可以在多項式時間內驗證一個解的正確性(即不一定是NP問題),因此即使NP完全問題有多項式時間的解(P=NP),NP困難問題依然可能沒有多項式時間的解。因此NP困難問題「至少與NP完全問題一樣難」。
一些NP問題能在多項式時間內解決,因為 P∈NP
NP難類型問題的證明:
先選好一個已知NP難的問題,然後將已知NP難問題多項式歸約到要證明的問題上。先給出這個歸約,然後再證明這個歸約的正確性。
NPC類型問題的證明:
證明一個問題Y是NPC問題,先說明Y是NP的,然後找到一個NPC問題X,將這個問題X歸約到問題Y上,即證明完成。
常見的NPC問題(重要,規約的時候有用!):
packing problems: set-packing,獨立集
覆蓋問題:集合覆蓋問題,頂點覆蓋問題
嚴格滿足問題(constraint satisfaction problems):SAT,3SAT
序列問題:哈密爾頓迴路,旅行商問題
劃分問題:3D-matching, 3著色問題
數字問題:子集合問題(子集元素之和為t),背包問題
其他:分團問題(是否存在一個規模為k的團)
規約的概念與理解
規約:意味著對問題進行轉換,例如將一個未知的問題轉換成我們能夠解決的問題,轉換的過程可能涉及到對問題的輸入輸出的轉換。
自歸約:search problem <=p decision problem
歸約:A歸約到B,也就是說,我們對A套一個函數f,在f函數的作用下形成一個新的問題,對這個問題運用B的黑盒解法,能夠解決問題A。
(B <=p A)一般說來,B問題如果可以歸約到A問題,也就是說,一個解決A問題的演算法可以被用做子函數(子程序)來解決B問題,也就是說,求解B問題不會比求解A問題更困難。因此,如果B問題是困難的,那麼A問題也就是困難的,因為不存在求解A問題的高效演算法。(最後一句不懂)
我簡單說一下我理解的規約,以X規約到Y為准,大概分成兩個方面:
註:在 三 的一些實例中細品。
概念:在對問題求解時,總是做出在當前看來是最好的選擇。
貪心的證明:先假設貪心演算法得到的解不是最優解,假設S1是貪心演算法得到的解,而S2是所有最優解中和S1具有最多相同元素的解,然後比較S1和S2,觀察S1和S2中第一個(最前面一個)不一樣的元素,然後在貪心解S2中將不一樣的元素換成S1中的那個元素得到另一個最優解S3,這樣S3和S1比S2和S1有更多相同元素,和假設S2是與S1有最多相同元素的最優解矛盾,這樣來推導S1是最優解。
我的理解:假設這個不是最優的,但是一定存在一個最優的解在某一個位置之前和我當前解結構是一樣的,那麼在這個位置,選最優解也可以選當前解,不影響最終答案。
[注]概念很簡單,但是實際操作的時候,貪心的角度很重要,同樣的貪心,方向對了,演算法就是對的。
例子:
給你一系列活動,每個活動有一個起始時間和一個結束時間,要求在活動不沖突的情況下找到一種有最多活動的安排。
對於這個問題,我們有一下幾種貪心的角度:
①將任務按照 開始時間 升序排列。
②將任務按照 結束時間 升序排列。
③將任務按照 任務時長 升序排列。
④對於每一個任務,都記錄與其他任務沖突的數量,按照 沖突數量 的升序排列。
其中1,3,4都是不可以的。
任務結束時間的貪心證明(反證法):
假設貪心不是最最優的,那我們在最優解中找一個與當前解有最相似的解。
由圖可以知道,貪心貪的就是最早結束,所以如果不是最優,那麼最優的結束時間一定晚於貪心的結束時間。
由上圖就可以證明。
最大流通常與最小割相聯系。
f 為任意一個流,cap為容量,對於任意的s-t割出來的點集(A,B),v( f ) <= cap(A, B)。
當流增加到與割的容量相等時候,就不可能再有增長空間了,稱為最大流。
對於割的容量來說,不同的割法會有不同流量,有些割法永遠不會有流達到,比如部分A = {s}, B = {V - s},這種把源點割出來的割法。
綜上,通過這種感性的認識,如果能找到一個最小的割,那麼這個割就一定是最大能跑到的流(如果流能更高的話在這個割上就會超過容量,反證。)
上圖為一條增廣路,一條增廣路即為一條s-t的路徑,在路徑上仍有流可以跑,其曾廣的流就是該條路徑上最小的剩餘容量。(相當於每找一條增廣路,就至少有一條邊達到滿流。)
直到在圖中找不到增廣路,此時已經達到了最大流。
找ST集合:把滿流的邊去掉,從S出發走到能到的點,遍歷的點就是S集合;剩下的點就屬於T集合。注意,如果找到了在找S集合的時候找到了T點,說明還可以繼續找增廣路。
[補]有一個很有趣的延伸,如多源點多終點問題。問:如果我有兩個源點s1,s2,兩個終點t1,t2,我想求一組流,使得s1-t1,s2-t2的流達到最大,是否可以加一個源點S,S與s1,s2相連,邊流無限大;加一個終點T,T與t1,t2相連,邊流無限大,然後這組ST的最大流即可。——答案是No,無法保證是s1-t1,s2-t2,有可能交錯。
例子講的感覺不是特別好,對理解感覺起不到很大作用,希望以後有新的想法後進行補充。
規約是一個重要的概念和思想。
一個圖的 最大獨立集 與 最小點覆蓋 是不相交的兩個點集,它們的並就是整個點集。
個人理解:獨立集和點覆蓋都是從點的角度進行劃分的,如果我們從邊的角度來看,①一個最小的點覆蓋即為我集合中的每一個點都盡可能與更多的邊相連,②同時,一條邊的兩個端點中,只能有一個端點在最小點覆蓋中[下注]
[注]我們假設有一條邊兩個端點(u,v)都在點覆蓋之中,首先顯然u,v都不是端點,因為假設u是端點的話只需要選擇v即可;
給一個集合S和一堆S的子集S1,S2,...,Sm,問是否存在存在k個子集,使它們的並集為S。
構造:
集合為點,集合中的元素為邊,有相同元素的邊相連。(注意如果某一元素只在一個子集中出現,應該怎麼處理呢!)
規約:在構造的圖中找最小的點覆蓋,選中的點能覆蓋所有的邊即為對應集合的並集能包含所有的元素。所以就完成了集合覆蓋到點覆蓋的規約。
構造:每個句子構造一個三角形,把對應變數但是相反取值的點相連。
規約:3SAT的有一個特點就是,每一個句子中至少有一個為真即可,每個句子都必須是真。將相同變數相反取值相連的目的就是,在最大獨立集中,比如選擇x為真,則剩下所有句子中x-ba一定不會被選中,同時由獨立集和構造出來三角形的性質可以知道,每一個句子,有且僅有一個會被選中(為真)。如上圖,x1-ba為真,x2-ba和x3任選一個為真即可滿足。
search problem <=p decision version
比如:如果能在多項式時間內找到一個哈密爾頓圈,那麼就能在多項式時間內找到一個哈密爾頓圈(刪邊)
在此再談P和NP:
我們知道有些問題是可以從搜索問題規約到判斷問題的,也就是所該問題如果能在多項式內判斷,那麼久能在多項式中搜索到,那麼我們只需要說,這個判斷問題能在多項式時間內求解,就叫做P問題,也就是上圖紅字的意思;那NP問題呢,必須要給出一個解的實例,判斷的是這個實例是否滿足求解問題,這個才是上圖中的紅字。比如,我如果能在多項式時間內判斷哈密爾頓圈是否(Yes/No)存在,那這個就是ploy-time algorithm,如果我給出了一系列點,能過多項式時間內判斷這些點能否構成哈密爾頓圈,那這個就是poly-time certifier。
構造:把一個點拆分成三個點。
構造:(下面兩個圖要連在一起看)
從行的角度看,一行代表一個變數;從列的角度來看,每三列代表一個句子。兩邊中一邊是兩個點,一邊是一個點,所以有k個句子的話,每一行有3k+3個節點。從哈密爾頓圈的答案轉到3SAT的答案看這個圈在每一行是從左到右還是從右到左。
子集和問題:給一個集合S,問是否能在集合中選取元素,使得總和為W。
構造:如下圖,按照前六行和前三列進行分割,可以分成4部分,其中1,3,4部分是固定的,即在第一部分,變數v列和 變數為v(包括變數及取反)的行對應的格子為0,其餘為0;第三部分全為0;第四部分按照12依次寫下來。第二部分,如果Ci句子中有變數v,則記為1,因為一個句子只有三個變數,可以簡單通過第二部分每一列和為3進行判定。此時集合已經構造出來,W為111444,與上面的規約相似,可以通過3SAT的簡單性質進行感性的認知。
近似的想法很簡單,要解決一個問題,我們希望能夠做到①求解結果是最優的 ②在多項式時間內解決 ③對於任意的實例都能夠通過該演算法解決。現在對於部分問題,無法完全滿足以上要求,所以就犧牲了①,但是我們希望結果不是盲目的,所以就引入了近似的概念。
近似演算法。比如2-近似,認為W為近似解,W 為最優解,在求最小值的情況下W<=2W ;在求最大值的情況下,W>=1/2W*
給m個機器和n個任務,每個任務有一個ti的執行時間,我們認為完成最後一個任務所需的時間為負載時間,希望能夠讓這個負載時間最短。
第一種:將任務依次放在機器上,當某個機器空閑時立即放入新任務。此時是2近似的。
證明:
引理1.最短時間安排是大於等於任務中時間最長的任務,L* >= max tj
我們在考慮放入最後一個任務前,根據我們放置的規則,該機器是耗時最短,也就是說,該機器此時的用時是低於除掉最後一個任務後的平均時長,更低於所有任務的平均時長(引理2);再根據引理1,最後一個任務應該是小於最優解的。
補充:
在這里,我還想討論一下這個近似演算法的中等於符號,先上結論:等號不一定能夠找到一個實例,但是可以構造出一種結構,通過取極限求得,我們認為這樣 也算是緊的。
構造實例:有m個機器,其中m(m-1)個任務的用時為1,1個任務的用時為m。肯定有一種任務集合,可以按照以下方式進行安排,此時的貪心解為19。
此時最佳的解為10,如下圖:
通過推廣可以知道此時的比為(2m-1)/m,當m取極限,能夠達到2倍。
第二種:將任務從大到小排序,然後依次放在機器上,當某個機器空閑時立即放入新任務。此時是2近似的。
引理3:如果有大於m個任務,那麼L*>=2t(m-1)。證明:t(m+1)是目前最短的任務,且目前所有機器上都有任務了,所以該任務加入時最優的情況不過是加入設備的原有任務剛好和t(m+1)相等,即等號。
(2近似)在n個點中,選取k個中心點,使得這些中心點能夠以半徑R的圓包含所有的點,讓其中最大的半徑最小,如下圖所示:
基礎:距離需要滿足的三個定理①(同一性)dist(x, x) = 0 ②(自反)dist(x, y) = dist(y, x) ③(三角不等式)dist(x, y) <=dist(x, z)+dist(z, y)
r(C)為C集合中所有點的最大覆蓋半徑。(需要求min r(C))
演算法:在點集中任選一個作為中心點,然後重復以下步驟k-1次:選取距離已選點集中最遠的點,加入點集。
證明:先假設r(C )< 1/2 * r(C)以選好的點畫半徑為1/2 * r(C)的圓,顯然可知[注],這個圓里有且僅有一個r(C )中的點。那麼根據在下圖中,根據三角不等式可以得出:
[注]在每個點上r(c )一定會包含到c點,而r(C )<1/2 * r(C),相當於大圓套小圓,所以c*一定在c的圓中。
(2近似)問題還是很好理解的,在點上加權值,要找一個點覆蓋,使得權值最小。如下圖左邊就是一個帶權的最小點覆蓋。
演算法: 任選一條邊(i, j)加上代價,這個代價從零開始,且這個代價的最大值低於i和j節點的權值。顯然,這個邊權值的最大值取決於兩個端點權值的最小值,我們認為當邊權值與點權值相等時,對應的那個點是緊的。把所有緊的點找出來即為點覆蓋。
流程:
證明:
引理:邊權之和小於等於點覆蓋的點權之和。這主要是由於涉及到一條邊上兩個點都被選(緊的)的情況,感性認知可以看上圖,縮放證明如下:
w(S)是等於所選的節點的權值之和的,等於所選節點節點所對應的邊權之和,可以把它放大到所有節點對應邊權之和,這樣因為一條邊(u, v)在u上算過一次後還要在v上算一次,所以等於邊權和的兩倍。再由上面引理可得。
主要為了線性規劃和整數規劃。
(2近似)沒啥好說的,只需要把方程構造出來就行了。
由於求解出來結果不一定是整數,所以我們認為某一點的值大於1/2,就選入點集。
證明:
因為xi+xj >=1,且都是正數,那必至少一個點是大於1/2的(反證,兩個都小於1/2則和小於1)。
給你n個物品和一個背包,每個物品有一個價值v和一個大小w,背包的容量是W,要求讓背包裝下盡可能大價值。
背包的時間復雜度:O(nW)
注意其中n表示物品的個數,無論是1個還是999個,他都是多項式的,這個很好理解。但是W就不一樣了,這是一個數字。我理解的是這個數字會很奇特,比如1.00001,比如99999,這些有可能看起來不大但是實際在處理的時候很難處理的數字,統一的來說,如果我們把這些數字放在電腦上,都會以二進制的方式存儲起來,有些數字用十進製表示很小,但是放在二進制上面就會很大,由W導致不能在多項式時間內解決(找不到一個范圍/上界來框它)。
演算法: 為了處理這個問題,我們改動了dp的狀態轉移方程,要讓這個轉移方程和W無關[注]。
此時還不是多項式的,然後我們再對value進行約。[注]
[注]這兩步中,我們把w改成v,並對v進行近似處理。OPT的含義變成了,在面對是否選擇第i個物品時,要想讓價值達到當前值,最少的weight。理由是更改後的誤差是可以忍受的:對v進行近似,結果只會出現最大價值的上下誤差,如果對w進行近似,則有可能出現該物品不能放入背包中,導致整個物品直接放棄的情況。
⑷ 關聯規則挖掘演算法的介紹
學號:17020110019 姓名:高少魁
【嵌牛導讀】關聯規則挖掘演算法是數據挖掘中的一種常用演算法,用於發現隱藏在大型數據集中令人感興趣的頻繁出現的模式、關聯和相關性。這里將對該演算法進行簡單的介紹,之後通過Apriori演算法作為實例演示演算法執行結果。
【嵌牛鼻子】數據挖掘 關聯規則挖掘 python
【嵌牛正文】
一、演算法原理
1、基本概念
關聯規則用於發現隱藏在大型數據集中令人感興趣的頻繁出現的模式、關聯和相關性。 而 Apriori演算法則是經典的挖掘頻繁項集的關聯規則演算法,它通過層層迭代來尋找頻繁項集,最後輸出關聯規則:首先掃描數據集,得到 1-頻繁項集,記為 L1,通過合並 L1得到 2-頻繁項集 L2,再通過 L2找到 L3,如此層層迭代,直到找不到頻繁項集為止。
在Apriori演算法中,定義了如下幾個概念:
⚫ 項與項集 :設 I={i1,i2,…,im}是由 m個不同項構成的集合,其中的每個 ik(k=1,2,…,m)被稱為一個項 (Item),項的集合 I被稱為項集和,即項集。在實驗中,每一條購物記錄可以被看做 一個項集,用戶購買的某個商品即為一個項。
⚫ 事務與事務集:神乎事務 T是項集 I的一個子集,而事務的全體被稱為事務集。
⚫ 關聯規則:形如 A=>B的表達式,其中, A和 B都屬於項集 I,且 A與 B不相交。
⚫ 支持度:定義如下 support(A=>B) = P(A B),即 A和 B所含的項在事務集中同時出現的概率。
⚫ 置信度:定義如下 confidence(A⇒B)=support(A⇒B)/support(A)=P(A B)/P(A)=P(B|A),即如果事務包含 A,則事務中同時出現 B的概率。
⚫ 頻繁項集:如果項集 I的支持度滿足事先定義好的最小支持度閾慧液值(即 I的出現頻度大於相應的最小出現頻度閾值),則 I是頻繁項集。
⚫ 強關聯規則:滿足最小支持度和最小置信度的關聯規則,即待挖掘的關聯規則。
根據以上概念,要實現關聯規則的挖掘,首先要找到所有的頻繁項集,之後找出強關聯規則(即通過多次掃描數據集,找出頻繁集,然後產生關聯規則)。
2、挖掘頻繁項集
在該步驟中有兩個較為重要的部分 :連接和修剪。連接步驟即使用k-1頻繁項集,通過連接得到 k-候選項集,並且只有相差一個項的項集才能進行連接,如 {A,B}和 {B,C}連接成為 {A,B,C}。修剪步驟基於一個性質:一個 k-項集,如果它的一個 k-1項集(子集)不是頻繁的,那麼它本身也不可能是頻繁的。 因此可以基於這個性質,通過判斷先驗性質來對候選集進行修剪。
3、產生關聯規則
經過連接和修剪之後,即找到了所有的頻繁項集,此時可以在此基礎上產生關聯規則,步驟如下
(1)對於每個頻繁項集 l,產生 l的所有非空子集(這些非空子集一定是頻繁項集);
(2)對於 l的每一個非空子集 x,計算 confidence(x => (l-x)),如果 confidence(x => (l-x)) confmin,那麼規則 x => (l-x)」成立。
二、演算法設計
1、數據集
通過語句 import xlrd導入相關的庫來進行數據的讀取 。數據內容為十條購物記錄 ,每條購物記錄有若干個商品,表示某個顧客的購買記錄 ,如圖
對於數據載入部分 使用了 xlrd庫中的函數 open_workbook來 打開一個表格文件,使用sheet_by_index函數得到一個工作表, row_values函數即可讀取表格中的內容。由於每個購物記錄的商品數不一定相同,導致讀取的內容含有空格 (』 』),因此對數據進行刪減以得到緊湊的數據 ,最終讀取數據的結果以列表的游碧悉形式返回。
2、連接
對於連接部分,主要目標是根據已有的k-1頻繁項集生成 k-候選頻繁項集。演算法步驟為:首先將項集中的項按照字典順序排序,之後將 k-1項集中兩個項作比較,如果兩個項集中前 k-2個項是相同的,則可以通過或運算(|)將它們連接起來。
3、修剪
修剪操作主要使用一個判斷函數,通過傳入連接操作後的項集和之前的k-1頻繁項集,對新的項集中的每一個項的補集進行判斷,如果該補集不是 k-1頻繁項集的子集,則證明新的項集不滿足先驗性質,即一個頻繁項集的所有非空子集一定是頻繁的 ,否則就滿足先驗形式。返回布爾類型的參數來供調用它的函數作判斷。
經過連接和修剪步驟之後,項基要成為頻繁項集還必須滿足最小支持度的條件,筆者設計了generateFrequentItems函數來對連接、修剪後產生的 k-候選項集進行判斷,通過遍歷數據集,計算其支持度,滿足最小支持度的項集即是 一個頻繁項集,可將其返回。
以上,經過不斷的遍歷、連接、修剪、刪除,可將得到的所有結果以列表形式返回。筆者還設計了字典類型的變數 support_data,以得到某個頻繁項集及其支持度 。
4、挖掘關聯規則
generateRules函數用來挖掘關聯規則,通過傳入 最小置信度、 頻繁項集及其 支持度來生成規則 。根據定理:對於頻繁項集 l的每一個非空子集 x,計算 confidence(x => (l-x)),如果 confidence(x => (l-x)) confmin,那麼規則 x => (l-x)」成立,因此,該函數重點在掃描頻繁項集,得到每一個子集,並計算置信度,當置信度滿足條件(即大於等於最小置信度)時,生成一條規則。在函數中,使用了元組來表示一條規則,元組中包含 x、 l-x以及其置信度 ,最後返回生成的所有規則的列表。
三、演算法執行結果
設置最大頻繁項集數k為 3,最小支持度為 0.2,最小置信度為 0.8 使用 pycharm運行程序 ,得到以下結果:
由圖中結果可以看出,對於頻繁 1-項集,有五個滿足的項集,頻繁 2-項集有 6個,頻繁 3-項集有 2個,它們都滿足支持度大於或等於最小支持度 0.2。根據頻繁項集,程序得到的關聯規則有三條,即 {麵包 }=>{牛奶 },,{雞蛋 }=>{牛奶 },,{麵包,蘋果 }=>{牛奶 其中,這些規則的置信度都是 1.0,滿足大於或等於最小置信度 0.8的條件 。
四、程序源碼