Guest User

Untitled

a guest
Apr 28th, 2012
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.62 KB | None | 0 0
  1. SQL classification
  2. 1. select all sessions
  3. 2. for each session S
  4. I. prepare an accumulator ACC for clusters
  5. II. select the clusters of viewed documents for this session
  6. III. for each cluster C accumulate the cluster count ( ACC[C]++ )
  7. IV. find the maximum in the ACC. That is the cluster that the session was classified to
  8.  
  9. +-------+-----------+--------------------+
  10. | ID | sessionID | classified_cluster |
  11. +-------+-----------+--------------------+
  12.  
  13. +-------+-----------+------------+
  14. | ID | sessionID | documentID |
  15. +-------+-----------+------------+
  16.  
  17. +-------+-------+
  18. | ID | label |
  19. +-------+-------+
  20.  
  21. +-------+-----------+------------+
  22. | ID | clusterID | documentID |
  23. +-------+-----------+------------+
  24.  
  25. +-----------+-----------------------+
  26. | sessionID | classifiedIntoCluster |
  27. +-----------+-----------------------+
  28.  
  29. SELECT SD.session_id, CD.cluster_id
  30. FROM cluster_document AS CD
  31. INNER JOIN session_document AS SD
  32. ON CD.document_id = SD.document_id
  33. WHERE session_id IN (SELECT session_id FROM session)
  34.  
  35. private void ClassifyUsers() {
  36. int nClusters = Database.SelectClusterCount(); //get number of clusters
  37. DataSet sessions = Database.SelectSessions(); //get all sessions
  38. foreach (DataRow session in sessions.Tables[0].Rows) { //foreach session
  39. int[] acc = new int[nClusters]; //prepare an accumulator for each known cluster
  40. string s_id = session["session_id"].ToString();
  41. DataSet sessionClusters = Database.SelectSessionClusters(s_id); //get clusters for this session
  42.  
  43. foreach (DataRow cluster in sessionClusters.Tables[0].Rows) { //for each cluster
  44. int c = Convert.ToInt32(cluster["cluster_id"].ToString()) - 1;
  45. acc[c]++; //accumulate the cluster count
  46. }
  47.  
  48. //find the maximum in the accumulator -> that is the most relevant cluster
  49. int max = 0;
  50. for (int j = 0; j < acc.Length; j++) {
  51. if (acc[j] >= acc[max]) max = j;
  52. }
  53. max++;
  54. Database.UpdateSessionCluster(s_id, max); //update the session with its new assigned cluster
  55. }
  56. }
  57.  
  58. session id | cluster
  59. abc 0
  60. def 0
  61. ghi 0
  62. jkl 0
  63. mno 0
  64.  
  65. cluster_id | label
  66. 1 A
  67. 2 B
  68. 3 C
  69. 4 D
  70. 5 E
  71.  
  72. id | session_id | document_id
  73. 1 abc 1
  74. 2 def 5
  75. 3 jkl 3
  76. 4 ghi 4
  77. 5 mno 2
  78. 6 def 2
  79. 7 abc 5
  80. 8 ghi 3
  81.  
  82. id | cluster_id | document_id
  83. 1 1 2
  84. 2 1 3
  85. 3 2 5
  86. 4 3 5
  87. 5 3 1
  88. 6 4 3
  89. 7 5 2
  90. 8 5 4
  91.  
  92. session_id | cluster_id | label | document_id
  93. abc 3 C 1
  94. abc 2 B 5
  95. abc 3 C 5
  96. -----
  97. def 2 B 5
  98. def 3 C 5
  99. def 1 A 2
  100. def 5 E 2
  101. ----
  102. ghi 5 E 4
  103. ghi 1 A 3
  104. ghi 4 D 3
  105. ----
  106. jkl 1 A 3
  107. jkl 4 D 3
  108. ----
  109. mno 1 A 2
  110. mno 5 E 2
  111.  
  112. session_id | cluster_id | label | occurrence
  113. abc 3 C 2 <--- MAX
  114. abc 2 B 1
  115. ----
  116. def 2 B 1
  117. def 3 C 1
  118. def 1 A 1
  119. def 5 E 1 <--- MAX
  120. ----
  121. ghi 5 E 1
  122. ghi 1 A 1
  123. ghi 4 D 1 <--- MAX
  124. ----
  125. jkl 1 A 1
  126. jkl 4 D 1 <--- MAX
  127. ----
  128. mno 1 A 1
  129. mno 5 E 1 <--- MAX
  130.  
  131. session_id | cluster_id
  132. abc 3
  133. def 5
  134. ghi 4
  135. jkl 4
  136. mno 5
  137.  
  138. +------------+------------+-------+------------+
  139. | SESSION_ID | CLUSTER_ID | LABEL | OCCURRENCE |
  140. +------------+------------+-------+------------+
  141. | abc | 3 | C | 2 |
  142. | def | 1 | A | 1 |
  143. | def | 2 | B | 1 |
  144. | def | 3 | C | 1 |
  145. | def | 5 | E | 1 |
  146. | ghi | 1 | A | 1 |
  147. | ghi | 4 | D | 1 |
  148. | ghi | 5 | E | 1 |
  149. | jkl | 1 | A | 1 |
  150. | jkl | 4 | D | 1 |
  151. | mno | 1 | A | 1 |
  152. | mno | 5 | E | 1 |
  153. +------------+------------+-------+------------+
  154.  
  155. +------------+------------+
  156. | SESSION_ID | CLUSTER_ID |
  157. +------------+------------+
  158. | abc | 3 |
  159. | def | 5 |
  160. | ghi | 5 |
  161. | jkl | 4 |
  162. | mno | 5 |
  163. +------------+------------+
  164.  
  165. select s1.session_id, max(s1.cluster_id) as cluster_id from (
  166. select sd.session_id, cd.cluster_id, count(*) as Occurrence
  167. from session_document sd
  168. join cluster_document cd
  169. on sd.document_id = cd.document_id
  170. join cluster c
  171. on c.cluster_id = cd.cluster_id
  172. group by sd.session_id, cd.cluster_id, c.label
  173. ) as s1
  174. left join (
  175. select sd.session_id, count(*) as Occurrence
  176. from session_document sd
  177. join cluster_document cd
  178. on sd.document_id = cd.document_id
  179. join cluster c
  180. on c.cluster_id = cd.cluster_id
  181. group by sd.session_id, cd.cluster_id, c.label
  182. ) as s2
  183. on s1.session_id = s2.session_id and s1.occurrence < s2.occurrence
  184. where s2.occurrence is null
  185. group by s1.session_id
  186.  
  187. create view MaxOccurrences as (
  188. select sd.session_id, cd.cluster_id, count(*) as Occurrence
  189. from session_document sd
  190. join cluster_document cd
  191. on sd.document_id = cd.document_id
  192. join cluster c
  193. on c.cluster_id = cd.cluster_id
  194. group by sd.session_id, cd.cluster_id, c.label
  195. );
  196.  
  197. select s1.session_id, max(s1.cluster_id) as cluster_id
  198. from MaxOccurrences as s1
  199. left join MaxOccurrences as s2
  200. on s1.session_id = s2.session_id and s1.occurrence < s2.occurrence
  201. where s2.occurrence is null
  202. group by s1.session_id
  203.  
  204. SELECT SESSION_ID,MAX(CNT) MAX_CNT
  205. FROM (SELECT SD.SESSION_ID, CD.CLUSTER_ID,COUNT(*) AS CNT
  206. FROM CLUSTER_DOCUMENT AS CD
  207. INNER JOIN SESSION_DOCUMENT AS SD
  208. ON CD.DOCUMENT_ID = SD.DOCUMENT_ID
  209. GROUP BY SD.SESSION_ID,CD.CLUSTER_ID) CNT1
  210. GROUP BY SESSION_ID
  211.  
  212. SELECT B.SESSION_ID, MAX(CNT2.CLUSTER_ID) FROM
  213. (SELECT SESSION_ID,MAX(CNT) MAX_CNT
  214. FROM (SELECT SD.SESSION_ID, CD.CLUSTER_ID,COUNT(*) AS CNT
  215. FROM CLUSTER_DOCUMENT AS CD
  216. INNER JOIN SESSION_DOCUMENT AS SD
  217. ON CD.DOCUMENT_ID = SD.DOCUMENT_ID
  218. GROUP BY SD.SESSION_ID,CD.CLUSTER_ID) CNT1
  219. GROUP BY SESSION_ID) B
  220. JOIN (SELECT SD.SESSION_ID, CD.CLUSTER_ID,COUNT(*) AS CNT
  221. FROM CLUSTER_DOCUMENT AS CD
  222. INNER JOIN SESSION_DOCUMENT AS SD
  223. ON CD.DOCUMENT_ID = SD.DOCUMENT_ID
  224. GROUP BY SD.SESSION_ID,CD.CLUSTER_ID) CNT2
  225. ON B.SESSION_ID = CNT2.SESSION_ID
  226. AND B.MAX_CNT = CNT2.CNT
  227. GROUP BY B.SESSION_ID
Advertisement
Add Comment
Please, Sign In to add comment