确定两个独立变量一起出现概率的最佳方法?

时间:2014-01-08 23:40:03

标签: mysql

我有一张用户和特征表。像这样:

| username1 |特质A |

| username2 |特质B |

| username2 |特质A |

有几百个特征。我想要做的是当用户输入表格中的任何特征时建议第二个特征。我想创建的是一个表,使用当前数据来确定任何具有特征A的人有可能还有特征B(或C或D ......)的概率所以该表最终会像这样:

|特质A |特质B | %probable |

|特质A |特质C | %probable |

例如,约翰喜欢苹果,我们知道喜欢苹果的人往往喜欢香蕉,所以我们建议约翰尝试香蕉。

1 个答案:

答案 0 :(得分:1)

请尝试此sqlFiddle

SELECT t1.trait,t2.trait as trait2,count(t1.username)
                               /(SELECT COUNT(DISTINCT username) from users)
                               as probability
FROM users t1 JOIN users t2 USING (username)
WHERE t1.trait < t2.trait
GROUP BY t1.trait,t2.trait

如果你有400个特征,你最终会得到(400 choose 2 (79800))行。

更新:以上实际上是错误,因为它除以不考虑谁喜欢苹果的总人数。正确答案如下(sqlFiddle

SELECT t1.trait,t2.trait as trait2,count(t1.username)
 /(SELECT COUNT(DISTINCT username) from users WHERE trait = t1.trait)
 as probability
FROM users t1 INNER JOIN users t2
  ON t1.username = t2.username
WHERE t1.trait != t2.trait
GROUP BY t1.trait,t2.trait

注意COUNT(DISTINCT username) from users WHERE trait = t1.traitt1.trait != t2.trait而不是t1.trait < t2.trait,因为根据我们正在查看的特征,它会有所不同,例如,如果您有3个人喜欢香蕉,2个喜欢樱桃的话:那么我们可以说 100%喜欢香蕉这样的樱桃,但只喜欢 66.7 喜欢樱桃等香蕉的人。

所以现在如果你有400个特征,它实际上是400 x 399(159600)(之前认为的数字的两倍)可能的行返回。