按列表中的常见元素进行聚类

数据挖掘 机器学习 Python scikit-学习 聚类 特征选择
2021-10-14 10:53:01

假设我有这些元素:

a = [1, 6, 3, 4, 10, 32, 2, 54]
b = [20, 5, 14, 25, 18, 1]
c = [54, 3, 6, 12, 41, 1, 9]
d = [3, 4, 1]
e = [19, 20, 25, 5]

每个都由一个 id 列表标识(实际上代表一个字符串,但为了简单起见,我们将使用数字)。

我如何通过找到那些具有最多共同元素的人来对它们进行聚类?
例如:
aandd有 3 个共同元素
be3 个共同元素
ac4 个共同元素

所以我想要 ar ( a, c, d) 和 ( b, e) 的集群。
我想在 Python 脚本中获得它

1个回答

为了进行聚类,您只需要定义一个距离度量。定义距离后,可以应用 K-means、层次聚类或其他算法。在您的情况下,我将定义以下距离函数:

d(a,b)=1number of common elements of a and bmaximum between lengths of a and b

作为d(a,a)=0d(a,b)>0等等,这可能是一段距离。我不认为三角不等式成立,所以这不是一个明确定义的距离。但是,您仍然可以尝试使用此功能,它可能会为您的目标提供良好的结果。

编辑:sklearn 实现

为了使用 scikit-learn 实现这一点,使其工作的方法是使用DBSCAN,设置metric='precomputed'并传递我们数据的距离矩阵作为参数。我们必须使用预先计算的距离矩阵,因为 scikit-learn 不允许(现在)使用自定义距离进行聚类。