我在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
的{{1}}年AuthorID
,即
CoAuthorID
= P(AuthorID|CoAuthorID)
在年份P(AuthorID ∩ CoAuthorID) / P(CoAuthorID)
中,它是一个交叉点操作。
最初,例如2005
和AuthorID = 677
以及CoAuthorID = 901706
,我试过这个:
Year = 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)
它返回1行:
SELECT * FROM AC WHERE AuthorID = 677 AND Year = 2005
INTERSECT
SELECT * FROM AC WHERE CoAuthorID = 901706 AND Year = 2005
虽然数据中有3行,但AuthorID CoAuthorID Year
----------------------------
677 901706 2005
和AuthorID
在数据中共存3次CoAuthorID
意味着这两位作者在2005年共同贡献了3次。所以,
2005
的价值应该是多少?应该是
是P(AuthorID ∩ CoAuthorID)
还是1
? 谢谢!
答案 0 :(得分: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年的总记录数(" Conside_records&# 34;)和第三个将第一个除以第二个到达概率。
在一个极端情况下,所有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
注意出现的模式:通常,P(X|Y)
中的约束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)
为3/num_records
,其中num_records
是Year为2005的数字或记录。
请注意,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 |
+----------+------------+-------+
我们可以看看以下概率:
P(AuthorID=1359 | CoAuthorID=1361047 ∩ Year=2005)
含义: AuthorID=1359
CoAuthor=1361047
和Year=2005
P(AuthorID=1359 ∩ CoAuthorID=1361047 | Year=2005)
的概率是多少
非正式地: 2005年,共同作者1361047与作者1359的合作比例是多少?
合作次数被视为:3,因为此合着者仅在2005年合作了三次
匹配的合作次数:3,因为这位合着者在2005年与该作者合作了三次(即没有与其他任何人合作)
概率: 3/3 = 1。
AuthorID=1359
含义: CoAuthor=1361047
给定Year=2005
和P(CoAuthorID=1361047 | AuthorID=1359 ∩ Year=2005)
之间合作的概率是多少>
非正式地: 2005年,作者1359和共同作者1361047之间的合作比例是多少?
合作次数被视为:31,因为2005年有31次合作
匹配的合作次数:3,因为这位作者和合着者在2005年合作了三次
概率: 3/31。
CoAuthor=1361047
含义: AuthorID=1359
Year=2005
和P(X|Y)
非正式地: 2005年,作者1359与合着者1361047的合作比例是多少?
合作次数被视为:28,因为该作者在2005年与任何人合作了28次
匹配的协作次数:3,因为该作者在2005年与该合着者合作了三次
概率: 3/28。
请注意上述三个谓词听起来有多相似,但它们实际上有多么不同。确切的措辞很重要。以这句话为例:
作者A和共同作者B在2005年合在一起的可能性
从共同作者B的观点来看,这是100%,因为这个人没有与任何其他人共同作者(上述案例1)。但是从作者A的观点来看这是不同的,因为那个人也与许多其他共同作者合作(上面的案例3),因此概率更小。但它甚至可以从无人的角度来解释:然后人们可以看看2005年的所有合作,看看作者A和共同作者B之间有多少次合作(案例2)。这又是另一种可能性。
这表明陈述很容易含糊不清,必须小心谨慎:假设什么是给定的?这必须出现在{{1}}表示法中的管道符号之后。
答案 1 :(得分:0)
EXCEPT返回左输入查询中不是的不同行 通过正确的输入查询输出。
INTERSECT返回左侧和右侧输出的不同行 正确的输入查询。
DISTINCT
,Karl。
https://msdn.microsoft.com/en-us/library/ms188055(v=sql.120).aspx