根据过去观察到的分组对最佳数据分组进行排名

Posted

技术标签:

【中文标题】根据过去观察到的分组对最佳数据分组进行排名【英文标题】:Ranking the best groupings of data based on past observed groupings 【发布时间】:2017-12-23 11:14:14 【问题描述】:

帮我解决这个问题:

我想弄清楚如何对这些动物进行分组。

假设您每天都观察到一群动物以朋友的身份闲逛。 您想根据动物最喜欢谁自己找出对动物进行分组的最佳方式。

为了说明,你观察:

今天,您看到这些动物一起放松: 象虎长颈鹿孔雀

第二天你看到了这些: 长颈鹿孔雀象狮猴

然后第二天: 象虎鬣狗犀牛

因此,您可能会得出结论,大象和老虎是好朋友,因为他们已经在两个不同的场合闲逛了。 你也会对孔雀和大象说同样的话。

确定将这些动物分组的最佳方式的算法是什么?

为了提供更多细节,我正在研究一个大数据类型问题,并试图对这个问题进行分类。

机器学习可以解决这个问题吗?

真实数据可能看起来更像这样:

A B F G R P K U J H A F G K B J H A S 还有数百万行这样的......

为我指明正确的方向也会很有帮助。

【问题讨论】:

【参考方案1】:

有多种方法可以解决这个问题,但一个简单的公式可能是根据您的数据为任何给定的动物组设计一个评分函数,然后执行数值优化,例如 simulated annealing 以找到将动物分组,使您的总分大致最大化。或者,如果动物的数量足够少,您可以对所有分区进行详尽的搜索。

您应该仔细选择您的评分函数,确保您不会以n 大小的组为11 大小为n 的组。不要忘记尊重对称性。

您可以首先计算每对动物一起出现的概率,然后将所有概率的集合缩放为均值为零,然后将每个组 G 评分为成对缩放分数的总和:

这只是第一次尝试,你应该能想出更好的评分功能。

然后对k 时间步应用模拟退火:

Choose a random partition π
for i = 0 to k:
    T = i/k #floating point division
    make a random transition to partition π'
    if P_accept(π, π', T) > rand(0,1):
        π <- π'
return π

其中随机转换是一种动物从一组交换到另一组,包括进入一个新的空组。

P_accept 是您必须按照模拟退火文章中所述设计的接受概率函数。这应该基于两个分区的分数和温度。例如,分区的分数可以是分区中每个组的分数的总和。有关设计接受概率函数的更多信息,请参阅here。

请注意,您实际上并不需要分区的绝对分数来运行模拟退火。您可以使用将一个分区与另一个分区进行比较的函数。有几种方法可以设计这样的功能,但如果你想拿出大炮,你可以考虑使用Generalized Bradley Terry Model [pdf]。您可以对输入数据进行训练,以获得具有以下属性的每只动物的数值参数 γ:

例如。这应该可以更好地衡量组合意性,并且应该更适合模拟退火框架!

【讨论】:

这是一个很棒的答案! 非常感谢您的详细回复。我能够将您的答案用作在 R 中实施解决方案的参考。对于其他正在研究此问题的人,请阅读 Apriori 算法。 太好了,很高兴你找到了一些关于这个问题的现有工作。我无法找到正确的关键字。看起来它被称为“集合挖掘”/“关联规则挖掘”。尝试搜索第一个只会得到一堆扑克结果:)

以上是关于根据过去观察到的分组对最佳数据分组进行排名的主要内容,如果未能解决你的问题,请参考以下文章

Mysql分组排名

对分组内的行进行排名(2 列)

查询优化 PostgreSQL (GreenPlum)。根据排名前 5 位的结果进行分组

根据熊猫数据框中的列标签对数据进行分组

怎么循序渐进写出分组排名

MySQL 怎样分组查询