pandas 相似项目的聚类

j1dl9f46  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(152)

数据项如下所示:

item1 = {
  "path": "/some/path",
  "data": {
    "a": [0, 1, 2, ...], #numpy array
    "b": [4, 9, 4, ...], #numpy array
    "c": [7, 1, 0, ...], #numpy array
  }
}

然后我把每一个项目进行比较,然后我就有了这样的配对:

pairs = []
pair = {
  "a": item1,
  "b": item2,
  "diff": 12345,
}
pairs.append(pair)
pair = {
  "a": item1,
  "b": item3,
  "diff": 987654,
}
pairs.append(pair)

现在我想要所有相似项的聚类(组)。diff属性越小,项越相似。
我假设这可以用数据科学的方法来完成,但是我的数据不像一个x,y坐标系。(我添加了Pandas标签,因为我假设,它可能在这里有帮助)
如何使用最大相似性(=最小差异属性)将项目排列在聚类中?

mnemlml8

mnemlml81#

我找到了一个解决方案,一开始我通过对diff应用一个阈值来减少项目对(保持diff〈10000000的对)。
然后运行以下代码创建集群(组):

def get_groups(self, pairs):

    def contains(list, filter):
        for x in list:
            if filter(x):
                return True
        return False

    def in_group(a, b, group):
        has_a = contains(group, lambda x: x["path"] == a["path"])
        has_b = contains(group, lambda x: x["path"] == b["path"])
        if has_a:
            if not has_b:
                group.append(b)
            return True
        elif has_b:
            if not has_a:
                group.append(b)
            return True
        return False

    def in_groups(a, b, groups):
        found = False
        for group in groups:
            if in_group(a, b, group):
                found = True
                break

        if not found:
            groups.append([a, b])

    groups = []
    for pair in pairs:
        in_groups(pair["a"], pair["b"], groups)
        
    return groups

这将创建groups,其中每组类似项都有一个元素。

相关问题