我正在进行一个项目,基于用户在网站上的浏览模式对其进行分类。
为此,我需要在数据中寻找模式,然后对这些模式进行聚类,但聚类是一个问题,因为我尝试过的聚类算法(k-means、层次聚类和DBSCAN)都不接受列表作为输入数据。
我有按会话分隔的访问页面列表。
示例:
data = [[1, 2, 5], [2, 4], [2, 3], [1, 2, 4], [1, 3], [2, 3], [1, 3], [7, 8, 9], [9, 8, 7], [1, 2, 3, 5], [1, 2, 3]]
每个列表代表一个会话中访问的页面。每个数字代表URL的一部分。
示例:
1 = '/home'2 = '/blog'3 = '/about-us'...
我将数据通过一个模式挖掘脚本处理。
代码:
import pyfpgrowth # pip install pyfpgrowthdata = [[1, 2, 5], [2, 4], [2, 3], [1, 2, 4], [1, 3], [2, 3], [1, 3], [7, 8, 9], [9, 8, 7], [1, 2, 3, 5], [1, 2, 3]]patterns = pyfpgrowth.find_frequent_patterns(data, 2)print(patterns)rules = pyfpgrowth.generate_association_rules(patterns, 0.7)print(rules)
结果:
# print(patterns){(1,): 6, (1, 2): 4, (1, 2, 3): 2, (1, 2, 5): 2, (1, 3): 4, (1, 5): 2, (2,): 7, (2, 3): 4, (2, 4): 2, (2, 5): 2, (4,): 2, (5,): 2, (7,): 2, (8,): 2, (9,): 2}# print(rules){(1, 5): ((2,), 1.0), (2, 5): ((1,), 1.0), (4,): ((2,), 1.0), (5,): ((1, 2), 1.0)}
根据我使用的论文(第118页,第4.3章),下一步应该是将发现的模式作为聚类算法的输入,但据我所知,聚类算法不接受长度可变的列表作为输入。
我尝试过这样做,但没有成功。
代码:
from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=4, random_state=0).fit(patterns)test = [1, 8, 2]print(kmeans.predict(test))
我该如何做才能让k-means算法能够预测浏览模式所属的组,或者是否有其他更适合此任务的算法?
回答:
层次聚类和DBSCAN都可以用于列表数据。
你只需要自己计算距离矩阵,因为显然不能对这类数据使用欧几里得距离。相反,你可以考虑使用Jaccard距离,例如。
k-means不能使用。它需要在R^d中的连续数据。