1、概念python
關聯(Association)web
關聯就是把兩個或兩個以上在乎義上有密切聯繫的項組合在一塊兒。算法
關聯規則(AR,Assocaition Rules)數組
用於從大量數據中挖掘出有價值的數據項之間的相關關係。(購物籃分析)app
協同過濾(CF,Collaborative Filtering)ide
協同過濾經常被用於分辨某位特定顧客可能感興趣的東西,這些結論來自於對其餘類似顧客對哪些產品感興趣的分析。(推薦系統)學習
2、關聯規則優化
一、相關數據指標idea
兩個不相交的非空集合X、Y,若是X -> Y,就說X -> Y是一條關聯規則。spa
強度:支持度(Support):support({X -> Y}) = 集合X與集合Y中的項在一條記錄中同時出現的次數 / 數據記錄的個數
自信度(Confidence):confidence({X -> Y})集合X與集合Y中的項在一條記錄中同時出現的次數 / 集合X出現的次數
效度:提高度(Lift):度量規則是否可用的指標,描述的是相對於不用規則,使用規則能夠提升多少,提高度大於1,規則有效
lift({X -> Y}) = confidence({X -> Y}) / support({X -> Y})
二、計算步驟
大體過程以下:
三、 使用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})
#獲得以下的數據框,其中有不一樣項集及其對應結果,可經過關聯規則獲得符合的關聯項
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]