English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

pythonでAprioriアルゴリズムを使用した関連解析

大規模データセットからアイテム間の潜在的な関係を見つけるプロセスは、関連分析または関連規則学習と呼ばれます。このプロセスは二つのステップに分かれます: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(メール送信時は、#を@に変更してください。通報を行い、関連する証拠を提供してください。一旦確認がつき、このサイトは侵害が疑われるコンテンツをすぐに削除します。)

おすすめ