1. 程式人生 > >數據挖掘——關聯算法

數據挖掘——關聯算法

muse 關聯規則 轉化 可樂 sans 標準 threshold 滿足 supports

一、概念

關聯(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]

數據挖掘——關聯算法