1. 程式人生 > >資料探勘——關聯演算法

資料探勘——關聯演算法

一、概念

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