0

我在 SQL Server 中有我的数据表AC,其结构为:

+----------+------------+-------+
| AuthorID | CoAuthorID | Year  |
+----------+------------+-------+
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 266386     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 578338     |  2005 |
|  1359    | 721615     |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  ...     |            |       |
|  ...     |            |       |
+----------+------------+-------+

我必须计算给定Conditional Probability的年度AuthorIDCoAuthorID

P(AuthorID|CoAuthorID)=P(AuthorID ∩ CoAuthorID) / P(CoAuthorID)

而在2005交叉口操作的年份。

最初,例如,AuthorID = 677and CoAuthorID = 901706Year = 2005我试过这个:

对于P(AuthorID)

SELECT COUNT(DISTINCT AuthorID) FROM AC WHERE Year = 2005  

它返回390所以P(AuthorID)=1/390

对于P(CoAuthorID)

SELECT COUNT(DISTINCT CoAuthorID) FROM AC WHERE AuthorID = 677 AND Year = 2005

它返回1所以P(CoAuthorID)=1/1

对于P(AuthorID ∩ CoAuthorID)

SELECT * FROM AC WHERE AuthorID = 677 AND Year = 2005
INTERSECT 
SELECT * FROM AC WHERE CoAuthorID = 901706 AND Year = 2005

它返回 1 行:

AuthorID    CoAuthorID  Year
----------------------------
677         901706      2005

而数据中有 3 行,这意味着AuthorIDCoAuthorID在数据中共存 3 次,2005这意味着这两位作者在 2005 年共同贡献了 3 次。所以,

  1. 应该是什么价值P(AuthorID ∩ CoAuthorID)?应该是1还是1/3
  2. 其他计算也正确吗?

谢谢!

4

2 回答 2

2

这个公式有些正确:

P(AuthorID|CoAuthorID) = P(AuthorID ∩ CoAuthorID) / P(CoAuthorID) 

尽管您还应该更准确地指定年份约束:

P(AuthorID|CoAuthorID ∩ Year) = P(AuthorID ∩ CoAuthorID|Year)/P(CoAuthorID|Year)

您给出了P(AuthorID)(或实际上P(AuthorID|Year))的计算,但该术语未出现在上述公式中,因此它没有用处。

其次,你不应该使用DISTINCT. 如果同一作者出现多次,则应认为该作者的概率高于另一个不太频繁出现的作者的概率。通过使用DISTINCT,您将忽略这些不同的频率,并将相同的概率归因于每个作者。这不可能是意图。

相反,您可以按如下方式识别这些概率:

P(CoAuthorID|Year)

使用此 SQL 获得该概率(介于 0 和 1 之间):

SELECT SUM(CASE 
              WHEN CoAuthorID = 901706 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN CoAuthorID = 901706 THEN 1 
           END) AS FLOAT)
           / COUNT(*) AS probability  
FROM   AC 
WHERE  Year = 2005

这实际上返回 3 个值,而您只需要第三个值。但这将有助于分析结果以包括前两个值。

第一个值计算 2005 年给定 CoAuthorID 的每次出现(“matching_records”),第二个值计算2005 年的记录总数(“considered_records”),第三个值将第一个除以第二个以得出概率。

在极端情况下,所有 2005 年的记录都可能具有此 CoAuthorID,然后概率将返回 1。

P(AuthorID ∩ CoAuthorID|Year)

同样,您可以执行以下操作来获取此概率:

SELECT SUM(CASE 
              WHEN AuthorID = 677 AND CoAuthorID = 901706 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN AuthorID = 677 AND CoAuthorID = 901706 THEN 1 
           END) AS FLOAT)
       / COUNT(*)     AS probability  
FROM   AC 
WHERE  Year = 2005

请注意正在出现的模式:通常,约束 Y inP(X|Y)出现在WHERE子句中,而 X 在CASE WHEN子句中表示。

P(AuthorID|CoAuthorID ∩ Year)

尽管您可以使用前两个查询的结果,但您可以采用更直接的方式,并使用以下模式P(AuthorID|CoAuthorID ∩ Year)

SELECT SUM(CASE 
              WHEN AuthorID = 677 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN AuthorID = 677 THEN 1 
           END) AS FLOAT)
       / COUNT(*)     AS probability  
FROM   AC 
WHERE  Year = 2005
AND    CoAuthorID = 901706 

回答第一个问题

应该是什么价值P(AuthorID ∩ CoAuthorID)?应该是1还是1/3

由于您的数据中有 3 行的 AuthorId、CoAuthorID 和 Year 匹配,P(AuthorID ∩ CoAuthorID|Year)因此Year 为 2005 的数字或记录3/num_records在哪里。num_records

请注意,INTERSECT它的副作用是它消除了结果中的重复项。我上面写的DISTINCT内容也适用于这里:在处理概率时需要计算重复项。

附录:一些示例结果

鉴于此数据:

+----------+------------+-------+
| AuthorID | CoAuthorID | Year  |
+----------+------------+-------+
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 266386     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 578338     |  2005 |
|  1359    | 721615     |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
+----------+------------+-------+

我们可以看看以下概率:

1.P(AuthorID=1359 | CoAuthorID=1361047 ∩ Year=2005)

含义: 当它是给定的时的概率是多少,并且AuthorID=1359CoAuthor=1361047Year=2005

非正式地: 在 2005 年,共同作者 1361047 与作者 1359 合作的比例是多少?

考虑的合作次数:3,因为该合著者在 2005 年只合作了 3 次

匹配的合作数:3,因为这个合着者在 2005 年和这个作者合作过 3 次(即没有和其他人合作过)

概率: 3/3 = 1。

2.P(AuthorID=1359 ∩ CoAuthorID=1361047 | Year=2005)

含义: 合作发生的概率是多少?AuthorID=1359CoAuthor=1361047Year=2005

非正式地: 在 2005 年,作者 1359 和共同作者 1361047 之间的合作比例是多少?

考虑的合作数量:31,因为 2005 年有 31 个合作

匹配的合作数量:3,因为这个作者和共同作者在 2005 年合作了 3 次

概率: 3/31。

3.P(CoAuthorID=1361047 | AuthorID=1359 ∩ Year=2005)

含义: 当它是给定的时的概率是多少,并且CoAuthor=1361047AuthorID=1359Year=2005

非正式地: 在 2005 年,作者 1359 与共同作者 1361047 合作的比例是多少?

考虑的合作次数:28,因为该作者在 2005 年(与任何人)合作了 28 次

匹配的合作数量:3,因为该作者在 2005 年与该合著者合作了 3 次

概率: 3/28。

观察

请注意上述三个谓词听起来多么相似,但它们实际上有多么不同。准确的措辞很重要。以这句话为例:

作者 A 和共同作者 B 在 2005 年在一起的概率

从共同作者 B 的角度来看,这是 100%,因为这个人没有与其他任何人共同创作(上面的案例 1)。但是从作者 A 的角度来看是不同的,因为这个人也与许多其他共同作者合作(上面的案例 3),所以概率更小。但它甚至可以从没有人的角度来解释:然后可以查看 2005 年的所有合作,看看作者 A 和共同作者 B 之间的合作次数(案例 2)。这又是另一种可能性。

这表明陈述很容易模棱两可,必须注意准确:假设什么是给定的?这必须出现在符号中的管道符号之后P(X|Y)

于 2016-03-05T10:13:13.540 回答
0

EXCEPT 从左输入查询返回不由右输入查询输出的不同行。

INTERSECT 返回由左右输入查询输出的不同行。

DISTINCT,卡尔。

https://msdn.microsoft.com/en-us/library/ms188055(v=sql.120).aspx

于 2016-03-05T09:38:25.103 回答