-
数据挖掘——关联算法
2025-08-26 10:41:28 1958世界杯
一、概念
关联(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]