數據挖掘——關聯算法


一、概念

關聯(Association)

關聯就是把兩個或兩個以上在意義上有密切聯系的項組合在一起。

關聯規則(AR,Assocaition Rules)

用於從大量數據中挖掘出有價值的數據項之間的相關關系。(購物籃分析)

協同過濾(CF,Collaborative Filtering

協同過濾常常被用於分辨某位特定顧客可能感興趣的東西,這些結論來自於對其他相似顧客對哪些產品感興趣的分析。(推薦系統)

 

二、關聯規則

1、相關數據指標

兩個不相交的非空集合X、Y,如果X -> Y,就說X -> Y是一條關聯規則。

強度:支持度(Support):support({X -> Y}) = 集合X與集合Y中的項在一條記錄中同時出現的次數 / 數據記錄的個數

   自信度(Confidence):confidence({X -> Y})集合X與集合Y中的項在一條記錄中同時出現的次數 / 集合X出現的次數

效度:提升度(Lift):度量規則是否可用的指標,描述的是相對於不用規則,使用規則可以提高多少,提升度大於1,規則有效

          lift({X -> Y}) = confidence({X -> Y}) /  support({X -> Y})

2、計算步驟

  • 掃描數據集,統計一級候選集出現的次數
  • 清除不滿足條件的候選項集,得到一級項集
  • 從一級項集中國,組合二級候選項集,統計數據集中它們出現的次數
  • 清除不滿足條件的候選項集,得到二級項集
  • 從二級項集中,組合三級候選項集,統計數據集中他們出現的次數
  • ……
  • 將得到的項集作為結果返回

大致過程如下:

                     

  

3、 使用python實現關聯算法(apriori算法)

!apriori 包不支持DataFrame的數據格式,需要將數據轉化為array數組

#導入如下格式的數據

#變換數據格式,然后通過apriori方法進行處理

transform = data.groupby(by='交易ID').apply(lambda x: list(x.購買商品)).values

result = list(apriori(transform))

輸出result並觀察,發現如下規律

#該數據格式包含各種項集和所對應的支持度、自信度、提升度
'''RelationRecord(
items=frozenset({'可樂'}), 
support=0.4, ordered_statistics=[OrderedStatistic(
items_base=frozenset(), items_add=frozenset({'可樂'}),
confidence=0.4,
lift=1.0
)
]
)
''' #items = items_base + items_add

#遍歷result,得到每個項集(X 與 Y ,並得到相對應的支持度、自信度和提升度

supports = []
confidences = []
lifts = []
bases = []
adds = []

for i in result:
    supports.append(i.support)
    confidences.append(i.ordered_statistics[0].confidence)
    lifts.append(i.ordered_statistics[0].lift)
    bases.append(list(i.ordered_statistics[0].items_base))
    adds.append(list(i.ordered_statistics[0].items_add))
    
#將結果轉化為容易處理的數據框
get_result = pd.DataFrame({
        'base': bases,
        'add': adds,
        'support': supports,
        'confidence': confidences,
        'lift': lifts})

#得到如下的數據框,其中有不同項集及其對應結果,可通過關聯規則得到符合的關聯項

 

三、 協同過濾

1、 相關數據指標

協同過濾簡單來說就是利用某興趣相投、擁有共同經驗的群體的喜好來推薦用戶感興趣的信息。

協同過濾主要收集每個用戶對使用過的物品的評價(打分或星級等)。

通過用戶對各種商品評分的高低,得到用戶的喜好並,根據相似喜好的用戶歷史數據,從而推薦一些信息

優點:

  • 能夠過濾機器難以自動分析的信息,如藝術品、音樂等
  • 共用其他人的講演,避免了內容分析的不完全或不精確,能夠基於一些復雜的,難以表述的概念(如個人品味)進行過濾
  • 有推薦新信息的能力,可以發現用戶潛在的但自己尚未發現的興趣偏好
  • 推薦個性化、自動化程度高,能夠有效的利用其他相似用戶的回饋信息,加快個性化學習的速度

缺點:

  • 新用戶在開始時推薦質量較差
  • 新項目的推薦難度大,因為推薦質量取決於歷史數據集

2、 計算步驟

  • 收集用戶信息,必須數據基礎:用戶、商品、評分
  • 根據以上數據得到用戶評分向量和商品評分向量(用戶評分盡量使用標准化評分,消除用戶因打分習慣而導致的差異)
  • 根據用戶評分向量計算距離(如歐式距離)
  • 計算用戶相似度
  • 兩種方法計算相似鄰居
    • A)固定數量的鄰居(K-neighborhoods)
    • 不考慮鄰居的距離差異,只取當前點最近的 K 個點作為其鄰居
    • B)基於相似度門檻的鄰居(Threshold-based neighborhoods)
    • 以當前點為中心,距離為 K 的區域內的所有點作為當前點的鄰居

3、 使用python實現協同過濾算法

#導入如下數據,含用戶ID,商品ID,用戶評分

#通過交叉表及變換形式得到用戶評分矩陣

userrate = data.pivot_table(index='UserID',
                            columns='ItemID',
                            aggfunc=sum,
                            fill_value=0)

#將透視表轉為數據框,優化列名
userrate.columns = userrate.columns.droplevel(0)
del userrate.columns.name

 #計算每個用戶之間的距離和相似度

#計算每個用戶之間的距離
dist = pd.DataFrame(euclidean_distances(userrate))
dist.index = userrate.index
dist.columns = userrate.index

#計算每個用戶之間的相似度
sim = 1/(1+dist)

#設置參數,獲取相似用戶

#設置鄰居個數為3  用戶ID為1
k = 3
userId = 1

#獲取3個相似用戶並得到其相似度
simUserIds = sim.sort_values(userId, ascending=False)[userId].index[1:k+1]
simUser = sim.ix[simUserIds, userId]

#根據相似用戶得到商品的推薦排序

#根據相似用戶,計算出每個物品的評分
score = pd.DataFrame(np.dot(simUser,  userrate.ix[simUserIds]))

#對結果排序,得到最終的結果
result = userrate.columns[score.sort_values(0, ascending=False).index.values]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM