我计算了一个矩阵,其中包含人与人之间的 boolean 值,指示他们是否共享某个属性。我想根据人与人之间的相似性对该矩阵的行进行排序(并使用此排序也对列进行排序)。因此,显示相似“共享配置文件”的多个人应该一起订购。比如6人之间的属性:
name P1 P2 P3 P4 P5 P6
P1 x x
P2 x x
P3 x x x
P4 x x x
P5 x x x
P6 x x x
在示例中,P1 和 P2 共享属性,因此一起排序。 P3、P4 和 P5 也是如此。请注意,属性不必完全相同。例如,P6 与 P3/P4/P5 最相似,因此它接近该集群。
我试图想出一个特定的 Java 比较器,但它通常适用于返回值 -1 0 和 1,在我的例子中我只有一个相似性分数。不幸的是,它需要使用 Java,因为这是整个项目的主要语言......
有人知道如何根据相似度得分对矩阵进行排序吗?
[编辑] 我添加了 optaplanner 标签,这是我在根据评论搜索问题时发现的。它似乎适用于我的问题,也许了解 optaplanner 的人可以确认它是解决我的问题的相关工具?
最佳答案
你不能在这里真正地“排序”:你实际上在做的是分组。
假设你有一些方法返回它们应该被分组的属性,你可以将元素组合到一个映射中,由该属性作为键:
Function<Person, SomeType> groupingFn = ... // SomeType is the type of the property on which to group.
Map<SomeType, List<Person>> = people.stream().collect(groupingBy(groupingFn));
然后您可以将其展平为一个列表,其中的元素组合在一起:
List<Person> grouped =
people.values().stream()
.flatMap(Collection::stream)
.collect(toList());
关于java - 根据相似度对集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153957/