1. 程式人生 > 其它 >visual fortran常用數值演算法集_Apriori演算法介紹及其引數講解

visual fortran常用數值演算法集_Apriori演算法介紹及其引數講解

技術標籤:visual fortran常用數值演算法集

演算法介紹

Apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。

Apriori演算法的基本思想是:首先找出所有的頻集,這些項集出現的頻繁性至少和預定義的最小支援度一樣。然後由頻集產生強關聯規則,這些規則必須滿足最小支援度和最小可信度。然後使用第1步找到的頻集產生期望的規則,產生只包含集合的項的所有規則,其中每一條規則的右部只有一項,這裡採用的是中規則的定義。一旦這些規則被生成,那麼只有那些大於使用者給定的最小可信度的規則才被留下來。為了生成所有頻集,使用了遞迴的方法。

簡單點說,就是先找頻繁項集,再根據關聯規則找關聯物品。

Apriori演算法的原理是:如果某個項集是頻繁項集,那麼它所有的子集也是頻繁的。即如果{0,1}是頻繁的,那麼{0},{1}也一定是頻繁的。

Apriori演算法示意圖如下:

4b361e61be14e4fbefa07233bb39b91b.png

演算法優勢

優點

  1. 適合稀疏資料集。

  2. 演算法原理簡單,易實現。

  3. 適合事務資料庫的關聯規則挖掘。

缺點

  1. 可能產生龐大的候選集。

  2. 演算法需多次遍歷資料集,演算法效率低,耗時。

引數介紹

min_support:預設0.5,最小支援度,0到1的數值代表百分比,比如0.5代表最小支援度為50%;

min_confidence:預設1,最小置信度,數值也代表百分比,比如1代表100%。

調優方法

能看到Apriori在計算過程中有以下幾個缺點

  1. 可能產生大量的候選集。因為採用排列組合的方式,把可能的項集都組合出來了;

  2. 每次計算都需要重新掃描資料集,來計算每個項集的支援度。

所以Apriori演算法會浪費很多計算空間和計算時間,為此人們提出了FP-Growth演算法,它的特點是:

建立了一棵FP樹來儲存頻繁項集。在建立前對不滿足最小支援度的項進行刪除,減少了儲存空間。整個生成過程只遍歷資料集2次,大大減少了計算量。

所以在實際工作中,我們常用FP-Growth來做頻繁項集的挖掘。

適用場景

故障拓撲關聯中,當計算好故障閾值後便可識別哪些是故障指標哪些是正常指標,然後通過Apriori演算法計算故障指標之間的拓撲關係。

應用領域:消費市場價格分析,入侵檢測,行動通訊領域。

Apriori演算法被廣泛應用於行動通訊領域。移動增值業務逐漸成為行動通訊市場上最有活力、最具潛力、最受矚目的業務。隨著產業的復甦,越來越多的增值業務表現出強勁的發展勢頭,呈現出應用多元化、營銷品牌化、管理集中化、合作縱深化的特點。針對這種趨勢,在關聯規則資料探勘中廣泛應用的Apriori演算法被很多公司應用。依託某電信運營商正在建設的增值業務Web資料倉庫平臺,對來自移動增值業務方面的調查資料進行了相關的挖掘處理,從而獲得了關於使用者行為特徵和需求的間接反映市場動態的有用資訊,這些資訊在指導運營商的業務運營和輔助業務提供商的決策制定等方面具有十分重要的參考價值。

demo示例

from efficient_apriori import aprioritransactions = [('eggs', 'bacon', 'soup'),                ('eggs', 'bacon', 'apple'),                ('soup', 'bacon', 'banana')]itemsets, rules = apriori(transactions, min_support=0.5, min_confidence=1)print(rules)  # [{eggs} -> {bacon}, {soup} -> {bacon}]# Filtering and sorting association rulesfrom efficient_apriori import aprioritransactions = [('eggs', 'bacon', 'soup'),                ('eggs', 'bacon', 'apple'),                ('soup', 'bacon', 'banana')]itemsets, rules = apriori(transactions, min_support=0.2, min_confidence=1)# Print out every rule with 2 items on the left hand side,# 1 item on the right hand side, sorted by liftrules_rhs = filter(lambda rule: len(rule.lhs) == 2 and len(rule.rhs) == 1, rules)for rule in sorted(rules_rhs, key=lambda rule: rule.lift):print(rule)#Printstheruleanditsconfidence,support,lift,...