English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
大規模データセットからアイテム間の潜在的な関係を見つけるプロセスは、関連分析または関連規則学習と呼ばれます。このプロセスは二つのステップに分かれます:1.頻繁項集合を抽出します。2.頻繁項集合から関連規則を抽出します。
頻繁項集合は、一緒に頻繁に現れるアイテムの集合です。
関連規則は、二つのアイテム間に強い関係がある可能性を示唆します。
項集合のサポート度は、データセットにその項集合を含むレコードの割合で定義され、項集合の頻繁度を示します。サポート度は項集合に定義されています。
信頼性または確率は、{おむつ}のような一つのルールに対して定義されます。-「{おむつ、ワイン}」のサポート度で定義された{ワイン}の関連規則です。/サポート度({おむつ})
頻繁項集合の探索
Apriori原理:ある項集合が頻繁である場合、そのすべての部分集合も頻繁です。逆に、ある項集合が非頻繁項集合の場合、そのすべての上位集合も非頻繁です。
Aprioriアルゴリズムは頻繁項集合を見つける方法です。このアルゴリズムはまず、すべての単一アイテムの項集合リストを生成し、取引記録をスキャンしてどの項集合が最小サポート度を満たすかを確認し、最小サポート度を満たさない項集合は除外されます。その後、残された集合を組み合わせて、二つの要素を含む項集合を生成します。次に、取引記録を再スキャンし、最小サポート度を満たさない項集合を除外し、このプロセスはすべての項集合が除外されるまで繰り返されます。
Apriori仮説コード
当列表中项的个数大于0时:
检查数据以确认每个项集都是频繁的
保留频繁项集并构建k+1项组成的候选项集的列表
从频繁项集中挖掘关联规则
当可信度大于最小可信度时,可以认为是含有关联规则的。可以观察到,如果某条规则不满足最小可信度要求,那么该规则的所有子集也不会满足最小可信度要求。
可以首先从一个频繁项集开始,接着创建一个規則列表,其中規則右部只包含一个元素,然后对这些規則进行测试,接下来合并,通过合并所有剩余規則右部来创建新的規則列表,其中規則右部包含两个元素,以此类推。
每个频繁项集:
while(len(L)>1)
(k規則列表)
满足最小置信度
创建k+1規則
整体代码:
import numpy as np def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5] def createC1(dateSet): c1 = [] for line in dateSet: for item in line: if not [item] in c1: c1.append([item]) c1.sort() return list(map(frozenset,c1)) def scanData(data,ck,minSupport):#寻找满足最小支持度的项集 ssCnt = {} for tid in data: for can in ck: if can.issubset(tid): if can not in ssCnt.keys(): ssCnt[can] = 0 ssCnt[can] += 1 numItems = len(data) retList = [] supportData = {} for key in ssCnt.keys(): support = ssCnt[key]/numItems if support >= minSupport: retList.append(key) supportData[key] = support return retList,supportData def aprioriGen(Lk,k): # 根据k-1項集合生成k項集合 retList = [] for i in range(lenLk): for j in range(i ,lenLk):+1= list(Lk[i])[:k l1 = list(Lk[i])[:k-2] l2 = list(Lk[j])[:k-2] l1.sort() l2.sort() if l1 == l2: retList.append(Lk[i] | Lk[j]) return retList def apriori(dataSet,minSupport = 0.5)#頻繁項集生成 c1 = createC1(dataSet) D = list(map(set,dataSet)) l1,supportData = scanData(D,c1,minSupport) L = [l1] k = 2 while(len(L[k-2])>0): ck = aprioriGen(L[k-2],k) lk,supk = scanData(D,ck,minSupport) k = k + 1 L.append(lk) supportData.update(supk) return L,supportData def generaterRules(L,supportData,minConf=0.7)#ルール生成 bigRuleList = [] for i in range(1,len(L)): for freqSet in L[i]: H1 = [frozenset([item]) for item in freqSet] if i>1: rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf) else: calcConf(freqSet,H1,supportData,bigRuleList,minConf) return bigRuleList def calcConf(freqSet,H,suppurtData,brl,minConf = 0.7)#計算満足信頼度のルール prunedH = [] for conseq in H: conf = suppurtData[freqSet/suppurtData[freqSet-conseq] if conf > minConf: brl.append((freqSet-conseq,conseq,conf)) prunedH.append(conseq) prunedH.append(conseq) return prunedH7def rulesFromConseq(freqSet,H,supportData,brl,minConf=0. ):#ルールの再帰生成 m = len(H[0])+1) > ):1 if len(freqSet)>=(m = calcConf(freqSet,H,supportData,brl,minConf)1if (len(Hmp 1) > ):1 Hmp1= aprioriGen(Hmp+1) ,m1,supportData,brl,minConf) data = [line.split() for line in open('mushroom.dat').readlines()] L,support = apriori(data,minSupport=0.3) for i in range(len(L)): for item in L[i]: if item & {2'}: print(item)
コード及びデータセットのダウンロード:Apriori
これでこの記事のすべてが終わりました。皆様の学習に役立てば幸いです。皆様の応援をよろしくお願いします。
声明:この記事の内容はインターネットから取得しており、著作権者はすべて持ち主であり、インターネットユーザーが自発的に貢献し、アップロードしたものであり、このサイトは所有権を持ちません。また、人間による編集は行われておらず、関連する法的責任も負いません。著作権侵害が疑われる内容を見つけた場合は、メールを送信して:notice#oldtoolbag.com(メール送信時は、#を@に変更してください。通報を行い、関連する証拠を提供してください。一旦確認がつき、このサイトは侵害が疑われるコンテンツをすぐに削除します。)