數據挖掘——關聯算法

1、概念python

關聯(Association)web

關聯就是把兩個或兩個以上在乎義上有密切聯繫的項組合在一塊兒。算法

關聯規則(AR,Assocaition Rules)數組

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

協同過濾(CF,Collaborative Filteringide

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

 

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、 協同過濾

一、 相關數據指標

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

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

經過用戶對各類商品評分的高低,獲得用戶的喜愛並,根據類似喜愛的用戶歷史數據,從而推薦一些信息

優勢:

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

缺點:

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

二、 計算步驟

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

三、 使用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]
相關文章
相關標籤/搜索