天天看點

《機器學習實戰》使用apriori算法進行關聯分析,源代碼疑問

對《機器學習實戰》第11章的apriori算法實作時,發現書中不解之處:

# 入參Lk為頻繁項集的list,k為要輸出的頻繁項集的元素個數
# 比如:[{0},{1},{2}],k=2作為輸入,則輸出{0,1},{0,2},{1,2}
def aprioriGen(Lk, k):
    retList = []
    lenLk = len(Lk)

    for i in range(lenLk):
        for j in range(i+1, lenLk):
            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
           

這裡作者說“目前k-2個項相同時,将兩個集合合并”。用作者提供的資料集測試的時候,當k等于3的時候Lk等于[{2,3}, {3,5}, {2,5}, {1,3}]。這時候按照上述規則,生成的Ck就是[{2,3,5}]。那麼{1,3,5},{1,2,3}就被篩掉了,為什麼?

(我使用的是python3,作者使用的python2)

按理說,集合是無序的,那麼按照作者的算法,前k-2個元素做list之後比較的結果肯定就會和集合裡面元素順序有關,進而會影響最終結果。在實踐過程中,我是真真确确同一段代碼多次執行得到了不同結果,原因就是因為集合内元素的次序問題。

有幾個讀者也遇到了這個問題:https://ask.csdn.net/questions/663985 ;https://stackoverflow.com/questions/53956461/creating-itemsets-in-apriori-algorithm?r=SearchResults但是都沒有得到解答。國内的apriori算法部落格倒是不少,可全是把書上内容照葫蘆畫瓢寫下來,都沒有人有這個疑問嗎?失望。。。

隻破不立不好,我倒是在另一位仁兄的文章裡面Apriori算法找到了他自己實作的apriori算法,裡面他将集合合并稱為自連接配接,自連接配接的原則:如果兩個k項集可以自連接配接,必須保證它們有k-1項是相同。

繼續閱讀