大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(二十九):關(guān)聯(lián)

大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(二十八):聚類(四)
大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(三十):半監(jiān)督學(xué)習(xí)

一缓呛、關(guān)聯(lián)規(guī)則

  • 關(guān)聯(lián)規(guī)則反應(yīng)一個(gè)事物與其他事物之間的相互依存性關(guān)聯(lián)性
  • 幾個(gè)重要概念:
  • 項(xiàng)目:一個(gè)字段杭隙,對(duì)交易來說一般指一次交易中的一個(gè)物品哟绊,如:尿布。
  • 事務(wù):某個(gè)客戶在一次交易中痰憎,發(fā)生的所有項(xiàng)目的集合票髓,如:尿布、啤酒铣耘。
  • 項(xiàng)集:包含一次事務(wù)中的若干個(gè)項(xiàng)目的集合洽沟。
  • 頻繁項(xiàng)集:某個(gè)相集的支持度大于閾值,則稱為頻繁項(xiàng)集蜗细。
  • 頻繁項(xiàng)集中的幾個(gè)概念:
  • 支持度Support:相集{X,Y}在總項(xiàng)集中出現(xiàn)的概率裆操。
  • 置信度Condifence:在先決條件X發(fā)生的條件下,由關(guān)聯(lián)規(guī)則{X->Y}退出Y的概率炉媒。
  • 提升度:表示含有X的條件下同時(shí)含有Y的概率跷车,與無論含不含X含有Y的概率之比。(Confidence({X}->{Y})/Support({Y}))橱野。
  • 關(guān)聯(lián)規(guī)則的目的朽缴,就是找到數(shù)據(jù)中的頻繁項(xiàng)集
1. Apriori算法
  • Apriorio算法是關(guān)聯(lián)規(guī)則中的常用算法水援,思路如下:
  • 首先指定一個(gè)支持度的閾值密强,
  • 用閾值將頻繁項(xiàng)集分出來,比如下圖中深色的部分為頻繁項(xiàng)集
  • 圖中的數(shù)字表示項(xiàng)集項(xiàng)目的個(gè)數(shù)蜗元。
  • 其中頻繁項(xiàng)集的組合不一定是頻繁項(xiàng)集或渤,因?yàn)?strong>項(xiàng)集組合取的是兩個(gè)頻繁項(xiàng)集的交集,結(jié)果要看交集的結(jié)果是否大于閾值奕扣。
  • 同理薪鹦,兩個(gè)非頻繁項(xiàng)集的組合一定是非頻繁項(xiàng)集
  • 頻繁項(xiàng)集非頻繁項(xiàng)集的組合也一定是非頻繁項(xiàng)集
  • 在經(jīng)過若干組合后池磁,只需要輸出頻繁項(xiàng)集即可奔害。

二、序列規(guī)則

  • 序列規(guī)則將時(shí)間因素考慮進(jìn)來地熄,剔除關(guān)聯(lián)規(guī)則中時(shí)間點(diǎn)靠后的項(xiàng)目對(duì)時(shí)間點(diǎn)靠前的項(xiàng)的支持华临。
1. Apriori-All算法
  • Apriori-All算法通常分為兩步:

ForwardApriori算法過程。
Backward:去掉時(shí)間序列之后的項(xiàng)對(duì)之前的項(xiàng)的支持端考。

三雅潭、代碼實(shí)現(xiàn)

>>>from itertools import combinations


>>>def comb(lst):
>>>    ret = []
>>>    for i in range(1, len(lst) + 1):
>>>        ret += list(combinations(lst, i))
>>>    return ret


>>>class AprLayer(object):
>>>    d = {}
>>>    def __init__(self):
>>>        self.d = {}


>>>class AprNode(object):
>>>    def __init__(self, node):
>>>        self.s = set(node)
>>>        self.size = len(self.s)
>>>        self.lnk_nodes = {}
>>>        self.num = 0

>>>    def __hash__(self):
>>>        return hash("__".join(sorted([str(itm) for itm in list(self.s)])))

>>>    def __eq__(self, other):
>>>        return "__".join(sorted([str(itm) for itm in list(self.s)])) == "__".join(
>>>            sorted([str(itm) for itm in list(other.s)]))

>>>    def isSubnode(self, node):
>>>        return self.s.issubset(node.s)

>>>    def incNum(self, num=1):
>>>        self.num += num

>>>    def addLnk(self, node):
>>>        self.lnk_nodes[node] = node.s


>>>class AprBlk():
>>>    def __init__(self, data):
>>>        cnt = 0
>>>        self.apr_layers = {}
>>>        self.data_num = len(data)
>>>        for datum in data:
>>>            cnt += 1
>>>            datum = comb(datum)
>>>            nodes = [AprNode(da) for da in datum]
>>>            for node in nodes:
>>>                if not node.size in self.apr_layers:
>>>                    self.apr_layers[node.size] = AprLayer()
>>>                if not node in self.apr_layers[node.size].d:
>>>                    self.apr_layers[node.size].d[node] = node
>>>                self.apr_layers[node.size].d[node].incNum()
>>>            for node in nodes:
>>>                if node.size == 1: continue
>>>                for sn in node.s:
>>>                    sub_n = AprNode(node.s - set([sn]))
>>>                    self.apr_layers[node.size - 1].d[sub_n].addLnk(node)

>>>    def getFreqItems(self, thd=1, hd=1):
>>>        freq_items = []
>>>        for layer in self.apr_layers:
>>>            for node in self.apr_layers[layer].d:
>>>                if self.apr_layers[layer].d[node].num < thd: continue
>>>                freq_items.append((self.apr_layers[layer].d[node].s, self.apr_layers[layer].d[node].num))
>>>        freq_items.sort(key=lambda x: x[1], reverse=True)
>>>        return freq_items[:hd]

>>>    def getConf(self, low=True, h_thd=10, l_thd=1, hd=1):
>>>        confidence = []
>>>        for layer in self.apr_layers:
>>>            for node in self.apr_layers[layer].d:
>>>                if self.apr_layers[layer].d[node].num < h_thd: continue
>>>                for lnk_node in node.lnk_nodes:
>>>                    if lnk_node.num < l_thd: continue
>>>                    conf = float(lnk_node.num) / float(node.num)
>>>                    confidence.append([node.s, node.num, lnk_node.s, lnk_node.num, conf])

>>>        confidence.sort(key=lambda x: x[4])
>>>        if low:
>>>            return confidence[:hd]
>>>        else:
>>>            return confidence[-hd::-1]


>>>class AssctAnaClass():

>>>    def fit(self, data):
>>>        self.apr_blk = AprBlk(data)
>>>        return self

>>>    def get_freq(self, thd=1, hd=1):
>>>        return self.apr_blk.getFreqItems(thd=thd, hd=hd)

>>>    def get_conf_high(self, thd, h_thd=10):
>>>        return self.apr_blk.getConf(low=False, h_thd=h_thd, l_thd=thd)

>>>    def get_conf_low(self, thd, hd, l_thd=1):
>>>        return self.apr_blk.getConf(h_thd=thd, l_thd=-l_thd, hd=hd)


>>>def main():
>>>    data = [
>>>        ["魔獸世界", "博德之門", "仙劍奇?zhèn)b傳", "反恐精英"],
>>>        ["魔獸世界", "博德之門", "最終幻想", "心跳回憶"],
>>>        ["博德之門", "最終幻想", "心跳回憶"],
>>>        ["最終幻想", "生化危機(jī)", "空之軌跡"],
>>>        ["魔獸世界", "博德之門", "最終幻想", "心跳回憶"],
>>>        ["魔獸世界", "最終幻想", "心跳回憶"],
>>>    ]
>>>    aac = AssctAnaClass().fit(data)
>>>    print(f"Fred", aac.get_freq(thd=2, hd=10))
>>>    print(f"Conf", aac.get_conf_high(thd=1, h_thd=3))


>>>if __name__ == '__main__':
>>>    main()
Fred [({'最終幻想'}, 5), ({'魔獸世界'}, 4), ({'博德之門'}, 4), ({'心跳回憶'}, 4), ({'心跳回憶', '最終幻想'}, 4), ({'博德之門', '魔獸世界'}, 3), ({'魔獸世界', '最終幻想'}, 3), ({'魔獸世界', '心跳回憶'}, 3), ({'博德之門', '最終幻想'}, 3), ({'博德之門', '心跳回憶'}, 3)]
Conf [[{'博德之門', '心跳回憶'}, 3, {'博德之門', '心跳回憶', '最終幻想'}, 3, 1.0], [{'博德之門', '最終幻想'}, 3, {'博德之門', '心跳回憶', '最終幻想'}, 3, 1.0], [{'魔獸世界', '心跳回憶'}, 3, {'魔獸世界', '心跳回憶', '最終幻想'}, 3, 1.0], [{'魔獸世界', '最終幻想'}, 3, {'魔獸世界', '心跳回憶', '最終幻想'}, 3, 1.0], [{'心跳回憶'}, 4, {'心跳回憶', '最終幻想'}, 4, 1.0], [{'最終幻想'}, 5, {'心跳回憶', '最終幻想'}, 4, 0.8], [{'心跳回憶', '最終幻想'}, 4, {'博德之門', '心跳回憶', '最終幻想'}, 3, 0.75], [{'心跳回憶', '最終幻想'}, 4, {'魔獸世界', '心跳回憶', '最終幻想'}, 3, 0.75], [{'心跳回憶'}, 4, {'博德之門', '心跳回憶'}, 3, 0.75], [{'心跳回憶'}, 4, {'魔獸世界', '心跳回憶'}, 3, 0.75], [{'博德之門'}, 4, {'博德之門', '心跳回憶'}, 3, 0.75], [{'博德之門'}, 4, {'博德之門', '最終幻想'}, 3, 0.75], [{'博德之門'}, 4, {'博德之門', '魔獸世界'}, 3, 0.75], [{'魔獸世界'}, 4, {'魔獸世界', '心跳回憶'}, 3, 0.75], [{'魔獸世界'}, 4, {'魔獸世界', '最終幻想'}, 3, 0.75], [{'魔獸世界'}, 4, {'博德之門', '魔獸世界'}, 3, 0.75], [{'博德之門', '心跳回憶', '最終幻想'}, 3, {'博德之門', '魔獸世界', '心跳回憶', '最終幻想'}, 2, 0.6666666666666666], [{'魔獸世界', '心跳回憶', '最終幻想'}, 3, {'博德之門', '魔獸世界', '心跳回憶', '最終幻想'}, 2, 0.6666666666666666], [{'博德之門', '心跳回憶'}, 3, {'博德之門', '魔獸世界', '心跳回憶'}, 2, 0.6666666666666666], [{'博德之門', '最終幻想'}, 3, {'博德之門', '魔獸世界', '最終幻想'}, 2, 0.6666666666666666], [{'魔獸世界', '心跳回憶'}, 3, {'博德之門', '魔獸世界', '心跳回憶'}, 2, 0.6666666666666666], [{'魔獸世界', '最終幻想'}, 3, {'博德之門', '魔獸世界', '最終幻想'}, 2, 0.6666666666666666], [{'博德之門', '魔獸世界'}, 3, {'博德之門', '魔獸世界', '心跳回憶'}, 2, 0.6666666666666666], [{'博德之門', '魔獸世界'}, 3, {'博德之門', '魔獸世界', '最終幻想'}, 2, 0.6666666666666666], [{'最終幻想'}, 5, {'博德之門', '最終幻想'}, 3, 0.6], [{'最終幻想'}, 5, {'魔獸世界', '最終幻想'}, 3, 0.6], [{'博德之門', '魔獸世界'}, 3, {'博德之門', '魔獸世界', '反恐精英'}, 1, 0.3333333333333333], [{'博德之門', '魔獸世界'}, 3, {'仙劍奇?zhèn)b傳', '博德之門', '魔獸世界'}, 1, 0.3333333333333333], [{'博德之門'}, 4, {'博德之門', '反恐精英'}, 1, 0.25], [{'博德之門'}, 4, {'仙劍奇?zhèn)b傳', '博德之門'}, 1, 0.25], [{'魔獸世界'}, 4, {'魔獸世界', '反恐精英'}, 1, 0.25], [{'魔獸世界'}, 4, {'仙劍奇?zhèn)b傳', '魔獸世界'}, 1, 0.25], [{'最終幻想'}, 5, {'空之軌跡', '最終幻想'}, 1, 0.2], [{'最終幻想'}, 5, {'生化危機(jī)', '最終幻想'}, 1, 0.2]]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市却特,隨后出現(xiàn)的幾起案子扶供,更是在濱河造成了極大的恐慌,老刑警劉巖裂明,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椿浓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漾岳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門粉寞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尼荆,“玉大人,你說我怎么就攤上這事唧垦⊥比澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵振亮,是天一觀的道長(zhǎng)巧还。 經(jīng)常有香客問我,道長(zhǎng)坊秸,這世上最難降的妖魔是什么麸祷? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮褒搔,結(jié)果婚禮上阶牍,老公的妹妹穿的比我還像新娘。我一直安慰自己星瘾,他們只是感情好走孽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳状,像睡著了一般磕瓷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天困食,我揣著相機(jī)與錄音边翁,去河邊找鬼。 笑死陷舅,一個(gè)胖子當(dāng)著我的面吹牛倒彰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莱睁,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼待讳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仰剿?” 一聲冷哼從身側(cè)響起创淡,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎南吮,沒想到半個(gè)月后琳彩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡部凑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年露乏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涂邀。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘟仿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出比勉,到底是詐尸還是另有隱情劳较,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布浩聋,位于F島的核電站观蜗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衣洁。R本人自食惡果不足惜墓捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坊夫。 院中可真熱鬧毙替,春花似錦、人聲如沸践樱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拷邢。三九已至袱院,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忽洛。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工腻惠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欲虚。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓集灌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親复哆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欣喧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容