noshot 0.1.7__py3-none-any.whl → 0.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. noshot/data/ML TS XAI/ML/1. PCA - EDA/PCA-EDA.ipynb +207 -0
  2. noshot/data/ML TS XAI/ML/1. PCA - EDA/balance-scale.csv +626 -0
  3. noshot/data/ML TS XAI/ML/1. PCA - EDA/input.txt +625 -0
  4. noshot/data/ML TS XAI/ML/2. KNN Classifier/KNN.ipynb +287 -0
  5. noshot/data/ML TS XAI/ML/2. KNN Classifier/balance-scale.csv +626 -0
  6. noshot/data/ML TS XAI/ML/2. KNN Classifier/input.txt +625 -0
  7. noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/LDA.ipynb +83 -0
  8. noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/balance-scale.csv +626 -0
  9. noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/input.txt +625 -0
  10. noshot/data/ML TS XAI/ML/4. Linear Regression/Linear-Regression.ipynb +117 -0
  11. noshot/data/ML TS XAI/ML/4. Linear Regression/machine-data.csv +210 -0
  12. noshot/data/ML TS XAI/ML/5. Logistic Regression/Logistic-Regression.ipynb +137 -0
  13. noshot/data/ML TS XAI/ML/5. Logistic Regression/wine-dataset.csv +179 -0
  14. noshot/data/ML TS XAI/ML/6. Bayesian Classifier/Bayesian.ipynb +129 -0
  15. noshot/data/ML TS XAI/ML/6. Bayesian Classifier/wine-dataset.csv +179 -0
  16. noshot/data/ML TS XAI/TS/1. EDA - Handling Time Series Data/Handling TS Data.ipynb +784 -0
  17. noshot/data/ML TS XAI/TS/1. EDA - Handling Time Series Data/raw_sales.csv +29581 -0
  18. noshot/data/ML TS XAI/TS/2. Feature Engineering/Feature Engineering-.ipynb +1445 -0
  19. noshot/data/ML TS XAI/TS/3. Temporal Relationships/Exploring Temporal Relationships.ipynb +603 -0
  20. noshot/data/ML TS XAI/TS/4. Up-Down-Sampling and Interploation/Up-Down-Sampling.ipynb +721 -0
  21. noshot/data/ML TS XAI/TS/4. Up-Down-Sampling and Interploation/shampoo_sales.csv +37 -0
  22. noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/Stationarity-Trend-Seasonality.ipynb +392 -0
  23. noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/daily-min-temperatures.csv +3651 -0
  24. noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/daily-total-female-births.csv +366 -0
  25. noshot/data/ML TS XAI/TS/6. Autocorrelation - Partial Autocorrelation/ACF-PACF.ipynb +175 -0
  26. noshot/data/ML TS XAI/TS/6. Autocorrelation - Partial Autocorrelation/daily-min-temperatures.csv +3651 -0
  27. {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/METADATA +2 -2
  28. noshot-0.1.9.dist-info/RECORD +35 -0
  29. noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(A) Breadth First Search.ipynb +0 -112
  30. noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(B) Depth First Search.ipynb +0 -111
  31. noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(C) Uniform Cost Search.ipynb +0 -134
  32. noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(D) Depth Limites Search.ipynb +0 -115
  33. noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(E) Iterative Deepening DFS.ipynb +0 -123
  34. noshot/data/ML TS XAI/AIDS/10. ANOVA/2_ANOVA.csv +0 -769
  35. noshot/data/ML TS XAI/AIDS/10. ANOVA/One Way ANOVA (Repeated Measure).ipynb +0 -126
  36. noshot/data/ML TS XAI/AIDS/10. ANOVA/One Way ANOVA.ipynb +0 -134
  37. noshot/data/ML TS XAI/AIDS/10. ANOVA/Sample 1 Way ANOVA Test.ipynb +0 -119
  38. noshot/data/ML TS XAI/AIDS/10. ANOVA/Two Way ANOVA.ipynb +0 -138
  39. noshot/data/ML TS XAI/AIDS/10. ANOVA/reaction_time.csv +0 -5
  40. noshot/data/ML TS XAI/AIDS/10. ANOVA/sample_data.csv +0 -16
  41. noshot/data/ML TS XAI/AIDS/10. ANOVA/sleep_deprivation.csv +0 -4
  42. noshot/data/ML TS XAI/AIDS/11. Linear Regression/3_Linear.csv +0 -4802
  43. noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression LAB.ipynb +0 -113
  44. noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression New- sklearn.ipynb +0 -118
  45. noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression.ipynb +0 -148
  46. noshot/data/ML TS XAI/AIDS/11. Linear Regression/house_rate.csv +0 -22
  47. noshot/data/ML TS XAI/AIDS/12. Logistic Regression/Logistic Regression New- sklearn.ipynb +0 -128
  48. noshot/data/ML TS XAI/AIDS/12. Logistic Regression/Logistic Regression.ipynb +0 -145
  49. noshot/data/ML TS XAI/AIDS/12. Logistic Regression/default.csv +0 -1001
  50. noshot/data/ML TS XAI/AIDS/12. Logistic Regression/hours_scores_records.csv +0 -101
  51. noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(A) Astar.ipynb +0 -256
  52. noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(B) IDAstar.ipynb +0 -157
  53. noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(C) SMAstar.ipynb +0 -178
  54. noshot/data/ML TS XAI/AIDS/3. Genetic Algorithm/Genetic.ipynb +0 -95
  55. noshot/data/ML TS XAI/AIDS/4. Simulated Annealing/Simulated Annealing.ipynb +0 -74
  56. noshot/data/ML TS XAI/AIDS/4. Simulated Annealing/Sudoku Simulated Annealing.ipynb +0 -103
  57. noshot/data/ML TS XAI/AIDS/5. Alpha Beta Pruning/AlphaBetaPruning.ipynb +0 -182
  58. noshot/data/ML TS XAI/AIDS/6. Consraint Satisfaction Problems (CSP)/(A) CSP House Allocation.ipynb +0 -120
  59. noshot/data/ML TS XAI/AIDS/6. Consraint Satisfaction Problems (CSP)/(B) CSP Map Coloring.ipynb +0 -125
  60. noshot/data/ML TS XAI/AIDS/7. Random Sampling/Random Sampling.ipynb +0 -73
  61. noshot/data/ML TS XAI/AIDS/7. Random Sampling/height_weight_bmi.csv +0 -8389
  62. noshot/data/ML TS XAI/AIDS/8. Z Test/Z Test Hash Function.ipynb +0 -141
  63. noshot/data/ML TS XAI/AIDS/8. Z Test/Z Test.ipynb +0 -151
  64. noshot/data/ML TS XAI/AIDS/8. Z Test/height_weight_bmi.csv +0 -8389
  65. noshot/data/ML TS XAI/AIDS/9. T Test/1_heart.csv +0 -304
  66. noshot/data/ML TS XAI/AIDS/9. T Test/Independent T Test.ipynb +0 -119
  67. noshot/data/ML TS XAI/AIDS/9. T Test/Paired T Test.ipynb +0 -118
  68. noshot/data/ML TS XAI/AIDS/9. T Test/T Test Hash Function.ipynb +0 -142
  69. noshot/data/ML TS XAI/AIDS/9. T Test/T Test.ipynb +0 -158
  70. noshot/data/ML TS XAI/AIDS/9. T Test/height_weight_bmi.csv +0 -8389
  71. noshot/data/ML TS XAI/AIDS/9. T Test/iq_test.csv +0 -0
  72. noshot/data/ML TS XAI/AIDS/Others (AllinOne)/All In One.ipynb +0 -4581
  73. noshot/data/ML TS XAI/CN/1. Chat Application/chat.java +0 -81
  74. noshot/data/ML TS XAI/CN/1. Chat Application/output.png +0 -0
  75. noshot/data/ML TS XAI/CN/1. Chat Application/procedure.png +0 -0
  76. noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/LAN.tcl +0 -65
  77. noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/analysis.awk +0 -44
  78. noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/output.png +0 -0
  79. noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/procedure.png +0 -0
  80. noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/complexdcf.tcl +0 -229
  81. noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/output.png +0 -0
  82. noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/procedure.png +0 -0
  83. noshot/data/ML TS XAI/CN/2. File Transfer/file_to_send.txt +0 -2
  84. noshot/data/ML TS XAI/CN/2. File Transfer/filetransfer.java +0 -119
  85. noshot/data/ML TS XAI/CN/2. File Transfer/output.png +0 -0
  86. noshot/data/ML TS XAI/CN/2. File Transfer/procedure.png +0 -0
  87. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/Client.class +0 -0
  88. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/MyServerImpl.class +0 -0
  89. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/MyServerIntf.class +0 -0
  90. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/Server.class +0 -0
  91. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/output.png +0 -0
  92. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/procedure.png +0 -0
  93. noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/rmi.java +0 -56
  94. noshot/data/ML TS XAI/CN/4. Wired Network/output.png +0 -0
  95. noshot/data/ML TS XAI/CN/4. Wired Network/procedure.png +0 -0
  96. noshot/data/ML TS XAI/CN/4. Wired Network/wired.awk +0 -25
  97. noshot/data/ML TS XAI/CN/4. Wired Network/wired.tcl +0 -81
  98. noshot/data/ML TS XAI/CN/5. Wireless Network/output.png +0 -0
  99. noshot/data/ML TS XAI/CN/5. Wireless Network/procedure.png +0 -0
  100. noshot/data/ML TS XAI/CN/5. Wireless Network/wireless.awk +0 -27
  101. noshot/data/ML TS XAI/CN/5. Wireless Network/wireless.tcl +0 -153
  102. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/analysis.awk +0 -27
  103. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/output.png +0 -0
  104. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/sack.tcl +0 -86
  105. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/vegas.tcl +0 -86
  106. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/analysis.awk +0 -28
  107. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/output.png +0 -0
  108. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/reno.tcl +0 -78
  109. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/tahoe.tcl +0 -79
  110. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/analysis.awk +0 -27
  111. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/flow.tcl +0 -163
  112. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/output.png +0 -0
  113. noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/procedure.png +0 -0
  114. noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/DV.tcl +0 -111
  115. noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/LS.tcl +0 -106
  116. noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/analysis.awk +0 -36
  117. noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/output.png +0 -0
  118. noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/procedure.png +0 -0
  119. noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/analysis.awk +0 -20
  120. noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/broadcast.tcl +0 -76
  121. noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/multicast.tcl +0 -103
  122. noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/output.png +0 -0
  123. noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/procedure.png +0 -0
  124. noshot/data/ML TS XAI/CN/9. DHCP/DHCP.java +0 -125
  125. noshot/data/ML TS XAI/CN/9. DHCP/output.png +0 -0
  126. noshot/data/ML TS XAI/CN/9. DHCP/procedure.png +0 -0
  127. noshot/data/ML TS XAI/NLP/NLP 1/1-Prereqs.py +0 -18
  128. noshot/data/ML TS XAI/NLP/NLP 1/2-Chi2test.py +0 -83
  129. noshot/data/ML TS XAI/NLP/NLP 1/2-T-test.py +0 -79
  130. noshot/data/ML TS XAI/NLP/NLP 1/3-WSD-nb.py +0 -53
  131. noshot/data/ML TS XAI/NLP/NLP 1/4-Hindle-Rooth.py +0 -53
  132. noshot/data/ML TS XAI/NLP/NLP 1/5-HMM-Trellis.py +0 -82
  133. noshot/data/ML TS XAI/NLP/NLP 1/6-HMM-Viterbi.py +0 -16
  134. noshot/data/ML TS XAI/NLP/NLP 1/7-PCFG-parsetree.py +0 -15
  135. noshot/data/ML TS XAI/NLP/NLP 1/Chi2test.ipynb +0 -285
  136. noshot/data/ML TS XAI/NLP/NLP 1/Hindle-Rooth.ipynb +0 -179
  137. noshot/data/ML TS XAI/NLP/NLP 1/Lab 10 - Text generator using LSTM.ipynb +0 -1461
  138. noshot/data/ML TS XAI/NLP/NLP 1/Lab 11 NMT.ipynb +0 -2307
  139. noshot/data/ML TS XAI/NLP/NLP 1/PCFG.ipynb +0 -134
  140. noshot/data/ML TS XAI/NLP/NLP 1/Prereqs.ipynb +0 -131
  141. noshot/data/ML TS XAI/NLP/NLP 1/T test.ipynb +0 -252
  142. noshot/data/ML TS XAI/NLP/NLP 1/TFIDF BOW.ipynb +0 -171
  143. noshot/data/ML TS XAI/NLP/NLP 1/Trellis.ipynb +0 -244
  144. noshot/data/ML TS XAI/NLP/NLP 1/WSD.ipynb +0 -645
  145. noshot/data/ML TS XAI/NLP/NLP 1/Word2Vec.ipynb +0 -93
  146. noshot/data/ML TS XAI/NLP/NLP 2/Lab01(tokenizer)/tokenizer.ipynb +0 -370
  147. noshot/data/ML TS XAI/NLP/NLP 2/Lab01(tokenizer)/training_tokenizer.txt +0 -6
  148. noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/exp0.ipynb +0 -274
  149. noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/lab2.ipynb +0 -905
  150. noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/test.txt +0 -1
  151. noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/tokenizing.ipynb +0 -272
  152. noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/collocation.ipynb +0 -332
  153. noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/lab3.ipynb +0 -549
  154. noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/nlp.txt +0 -1
  155. noshot/data/ML TS XAI/NLP/NLP 2/Lab04(collocation)/Lab4-NLP-Exp-2.ipynb +0 -817
  156. noshot/data/ML TS XAI/NLP/NLP 2/Lab04(collocation)/collocation.ipynb +0 -332
  157. noshot/data/ML TS XAI/NLP/NLP 2/Lab05(WSD)/NLP-Lab-5-Exp3.ipynb +0 -231
  158. noshot/data/ML TS XAI/NLP/NLP 2/Lab05(WSD)/word-sense-disambiguation.ipynb +0 -507
  159. noshot/data/ML TS XAI/NLP/NLP 2/Lab06(additional-exercise)/lab6.ipynb +0 -134
  160. noshot/data/ML TS XAI/NLP/NLP 2/Lab07(HMM,Viterbi)/NLP Exp 4.ipynb +0 -255
  161. noshot/data/ML TS XAI/NLP/NLP 2/Lab07(HMM,Viterbi)/NLP_Exp_5.ipynb +0 -159
  162. noshot/data/ML TS XAI/NLP/NLP 2/Lab08(PCFG)/PCFG.ipynb +0 -282
  163. noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/Lab 9 - MLP classifier.ipynb +0 -670
  164. noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/MLP-alternative-code.ipynb +0 -613
  165. noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/hindle-rooth-algorithm.ipynb +0 -74
  166. noshot/data/ML TS XAI/NLP/NLP 2/Lab10(LSTM)/Lab_10_Text_generator_using_LSTM.ipynb +0 -480
  167. noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/Machine-translation.ipynb +0 -445
  168. noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/Viterbi-PCFG.ipynb +0 -105
  169. noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/corpora_tools.py +0 -87
  170. noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/data_utils.py +0 -11
  171. noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/train_translator.py +0 -83
  172. noshot/data/ML TS XAI/NLP/NLP 2/Lab12(Information-Extraction)/Information_Extraction.ipynb +0 -201
  173. noshot/data/ML TS XAI/NLP/NLP 3/Backtrack-without-Verbitri.ipynb +0 -185
  174. noshot/data/ML TS XAI/NLP/NLP 3/Backward-Procedure.ipynb +0 -597
  175. noshot/data/ML TS XAI/NLP/NLP 3/Bag_of.ipynb +0 -1422
  176. noshot/data/ML TS XAI/NLP/NLP 3/CYK-algorithm.ipynb +0 -1067
  177. noshot/data/ML TS XAI/NLP/NLP 3/Forward-Procedure.ipynb +0 -477
  178. noshot/data/ML TS XAI/NLP/NLP 3/LSTM.ipynb +0 -1290
  179. noshot/data/ML TS XAI/NLP/NLP 3/Lab 10 - Text generator using LSTM.ipynb +0 -1461
  180. noshot/data/ML TS XAI/NLP/NLP 3/Lab 11 NMT.ipynb +0 -2307
  181. noshot/data/ML TS XAI/NLP/NLP 3/NLP-LAB-4.ipynb +0 -216
  182. noshot/data/ML TS XAI/NLP/NLP 3/NLP-LAB-5.ipynb +0 -216
  183. noshot/data/ML TS XAI/NLP/NLP 3/abc.txt +0 -6
  184. noshot/data/ML TS XAI/NLP/NLP 3/ex-1-nltk.ipynb +0 -711
  185. noshot/data/ML TS XAI/NLP/NLP 3/ex-2-nlp.ipynb +0 -267
  186. noshot/data/ML TS XAI/NLP/NLP 3/exp8&9.ipynb +0 -305
  187. noshot/data/ML TS XAI/NLP/NLP 3/hind.ipynb +0 -287
  188. noshot/data/ML TS XAI/NLP/NLP 3/lab66.ipynb +0 -752
  189. noshot/data/ML TS XAI/NLP/NLP 3/leb_3.ipynb +0 -612
  190. noshot/data/ML TS XAI/NLP/NLP 3/naive_bayes_classifier.pkl +0 -0
  191. noshot/data/ML TS XAI/NLP/NLP 3/nlp_leb_1.ipynb +0 -3008
  192. noshot/data/ML TS XAI/NLP/NLP 3/nlp_leb_2.ipynb +0 -3095
  193. noshot/data/ML TS XAI/NLP/NLP 3/nlplab-9.ipynb +0 -295
  194. noshot/data/ML TS XAI/NLP/NLP 3/nltk-ex-4.ipynb +0 -506
  195. noshot/data/ML TS XAI/NLP/NLP 3/text1.txt +0 -48
  196. noshot/data/ML TS XAI/NLP/NLP 3/text2.txt +0 -8
  197. noshot/data/ML TS XAI/NLP/NLP 3/text3.txt +0 -48
  198. noshot/data/ML TS XAI/NLP/NLP 3/translation-rnn.ipynb +0 -812
  199. noshot/data/ML TS XAI/NLP/NLP 3/word2vector.ipynb +0 -173
  200. noshot/data/ML TS XAI/NLP/NLP 4/Backward Procedure Algorithm.ipynb +0 -179
  201. noshot/data/ML TS XAI/NLP/NLP 4/Chi Square Collocation.ipynb +0 -208
  202. noshot/data/ML TS XAI/NLP/NLP 4/Collocation (T test).ipynb +0 -188
  203. noshot/data/ML TS XAI/NLP/NLP 4/Experiment 1.ipynb +0 -437
  204. noshot/data/ML TS XAI/NLP/NLP 4/Forward Procedure Algorithm.ipynb +0 -132
  205. noshot/data/ML TS XAI/NLP/NLP 4/Hindle Rooth.ipynb +0 -414
  206. noshot/data/ML TS XAI/NLP/NLP 4/MachineTranslation.ipynb +0 -368
  207. noshot/data/ML TS XAI/NLP/NLP 4/Multi Layer Perceptron using MLPClassifier.ipynb +0 -86
  208. noshot/data/ML TS XAI/NLP/NLP 4/Multi Layer Perceptron using Tensorflow.ipynb +0 -112
  209. noshot/data/ML TS XAI/NLP/NLP 4/PCFG Inside Probability.ipynb +0 -451
  210. noshot/data/ML TS XAI/NLP/NLP 4/Text Generation using LSTM.ipynb +0 -297
  211. noshot/data/ML TS XAI/NLP/NLP 4/Viterbi.ipynb +0 -310
  212. noshot/data/ML TS XAI/NLP/NLP 4/Word Sense Disambiguation.ipynb +0 -335
  213. noshot/data/ML TS XAI/NLP/NLP 5/10.Text Generation using LSTM.ipynb +0 -316
  214. noshot/data/ML TS XAI/NLP/NLP 5/11.Machine Translation.ipynb +0 -868
  215. noshot/data/ML TS XAI/NLP/NLP 5/2.T and Chi2 Test.ipynb +0 -204
  216. noshot/data/ML TS XAI/NLP/NLP 5/3.Word Sense Diambiguation.ipynb +0 -234
  217. noshot/data/ML TS XAI/NLP/NLP 5/4.Hinddle and Rooth.ipynb +0 -128
  218. noshot/data/ML TS XAI/NLP/NLP 5/5.Forward and Backward.ipynb +0 -149
  219. noshot/data/ML TS XAI/NLP/NLP 5/6.Viterbi.ipynb +0 -111
  220. noshot/data/ML TS XAI/NLP/NLP 5/7.PCFG Parse Tree.ipynb +0 -134
  221. noshot/data/ML TS XAI/NLP/NLP 5/7.PCFG using cyk.ipynb +0 -101
  222. noshot/data/ML TS XAI/NLP/NLP 5/8.Bag of words and TF-IDF.ipynb +0 -310
  223. noshot/data/ML TS XAI/NLP/NLP 5/9.Word2Vector.ipynb +0 -78
  224. noshot/data/ML TS XAI/NLP/NLP 5/NLP ALL In One.ipynb +0 -2619
  225. noshot/data/ML TS XAI/NLP/NLP 5/sample1.txt +0 -15
  226. noshot/data/ML TS XAI/NLP/NLP 5/sample2.txt +0 -4
  227. noshot/data/ML TS XAI/NLP/NLP 5/word2vec_model.bin +0 -0
  228. noshot/data/ML TS XAI/NLP/NLP 6/1. Tokenize, Tagging, NER, Parse Tree.ipynb +0 -312
  229. noshot/data/ML TS XAI/NLP/NLP 6/2. T Test and Chi2 Test.ipynb +0 -185
  230. noshot/data/ML TS XAI/NLP/NLP 6/3. Naive Bayes WSD.ipynb +0 -199
  231. noshot/data/ML TS XAI/NLP/NLP 6/4. Hinddle and Rooth.ipynb +0 -151
  232. noshot/data/ML TS XAI/NLP/NLP 6/5 and 6 FWD, BWD, Viterbi.ipynb +0 -164
  233. noshot/data/ML TS XAI/NLP/NLP 6/7. PCFG using CYK.ipynb +0 -383
  234. noshot/data/ML TS XAI/NLP/NLP 6/8. BOW and TF-IDF.ipynb +0 -252
  235. noshot/data/ML TS XAI/Ubuntu CN Lab.iso +0 -0
  236. noshot-0.1.7.dist-info/RECORD +0 -216
  237. {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/LICENSE.txt +0 -0
  238. {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/WHEEL +0 -0
  239. {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/top_level.txt +0 -0
@@ -1,752 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "id": "4f47e82a-1f08-4a66-a2f2-d09e61b65279",
7
- "metadata": {},
8
- "outputs": [
9
- {
10
- "name": "stdin",
11
- "output_type": "stream",
12
- "text": [
13
- "Enter the states (comma-separated): cp,ip\n",
14
- "Enter the possible observations (comma-separated): lem,ice-t,cola\n",
15
- "Enter the observation sequence as space-separated names (options: ['lem', 'ice-t', 'cola']): lem ice-t cola\n"
16
- ]
17
- },
18
- {
19
- "name": "stdout",
20
- "output_type": "stream",
21
- "text": [
22
- "\n",
23
- "Enter the state transition probabilities:\n"
24
- ]
25
- },
26
- {
27
- "name": "stdin",
28
- "output_type": "stream",
29
- "text": [
30
- "P(cp | cp): 0.7\n",
31
- "P(ip | cp): 0.5\n",
32
- "P(cp | ip): 0.3\n",
33
- "P(ip | ip): 0.5\n"
34
- ]
35
- },
36
- {
37
- "name": "stdout",
38
- "output_type": "stream",
39
- "text": [
40
- "\n",
41
- "Enter the emission probabilities:\n"
42
- ]
43
- },
44
- {
45
- "name": "stdin",
46
- "output_type": "stream",
47
- "text": [
48
- "P(lem | cp): 0.3\n",
49
- "P(ice-t | cp): 0.1\n",
50
- "P(cola | cp): 0.6\n",
51
- "P(lem | ip): 0.2\n",
52
- "P(ice-t | ip): 0.7\n",
53
- "P(cola | ip): 0.1\n"
54
- ]
55
- },
56
- {
57
- "name": "stdout",
58
- "output_type": "stream",
59
- "text": [
60
- "\n",
61
- "Enter the initial state probabilities (comma-separated):\n"
62
- ]
63
- },
64
- {
65
- "name": "stdin",
66
- "output_type": "stream",
67
- "text": [
68
- "Enter initial probabilities for ['cp', 'ip']: 1.0,0.0\n"
69
- ]
70
- },
71
- {
72
- "name": "stdout",
73
- "output_type": "stream",
74
- "text": [
75
- "\n",
76
- "Forward Matrix:\n",
77
- " [[0.3 0.021 0.02772]\n",
78
- " [0. 0.105 0.0063 ]]\n",
79
- "Probability of the observation sequence: 0.034019999999999995\n"
80
- ]
81
- },
82
- {
83
- "data": {
84
- "image/png": "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1a5dWy+88MJFH9+9e7e2b99eWuuFNQwYMEBHjx7Vjh07rnic3r17KykpSZK0YsUK5eXl6ZlnnlHdunW1aNEiSVJSUpK6du0qX19fSefeT19fX91zzz1lXuv8+/v7KQ29evVSrVq1Lnr89evX6/bbb1f9+vW1fPnycr9jAK7M/cq7ALhQq1atdNttt5XbHhgYqIMHD172uSdPnlRYWFi57SEhIeX2u9j2i207duyYdu/eLQ8Pj4se88SJE2W+r1OnTrl9atasec2LFB555BH16NFDb775po4fP37Jy9nk5OSoZ8+e8vLy0htvvKGbbrpJPj4+OnjwoO66665yx/Xx8bnkCumMjAwdPHhQffr0Ubdu3co8dv49a9CgQbnnNWzYUDabTVlZWfLx8VGbNm3UqVMnTZkyRX/6059UUlKib775Rnfeeadq1659ze/DqFGjNHHiRHl7e5cLOBfW5+7urnr16pXZbrFYFBISUlr/pX727u7u5X52x44d09y5c6/6Z3+tAgIC9Le//U1PPfVUadD9/fElaezYsRo7dux119CnTx999dVX2rVrl5KSknTLLbcoODhYvXr1UlJSkoYNG6YVK1bo5ZdfLn3OyZMnFRISUu4fMcHBwXJ3dy99H8+72OfivEWLFunEiROaOHGigoKCrlgvgPIIlEA1qlOnjtLT08tt//2288HhUvteeH3DunXrytvbu9wimQsfrwrdu3dXixYt9Nprr5UuULmY5ORkHTlyREuWLCntSkoqtxDlvMtdw7JJkyaaOHGihgwZorvuukszZ86Ul5eXpP97z44ePVrueUeOHJGbm1uZDtWoUaP05z//Wdu2bdPevXt19OhRjRo16orn/Xt33XWXHn/8cb399tt69NFH5e3tfdH96tSpo+LiYh0/frxMqDQMQ+np6erUqVOZ80hPT1doaGjpfsXFxeVCUt26ddWuXbtLrsZu2LDhNZ/P740ZM0YffPCBXnjhBY0ZM6bc8SXppZde0l133XXR57do0eKKxzi/8CopKUmLFi1S3759S7f/7W9/U2pqqs6ePas+ffqUPqdOnTpavXq1DMMo85nJyMhQcXFxuc/95T5Xzz33nPbs2aOHHnpIxcXFeuihh65YM4CyGPIGqlF0dLS2bNmijRs3ltn+7bfflvn+9ttvl5eXl6ZNm1Zm+4oVK8oNTQ8aNEh79uxRnTp1dNttt5X7quyLa1/ob3/7m+64444yK29/7/wf8po1a5bZ/sUXX1zXMWNiYpSQkKDU1FQNGjSodKV4ixYtFBoaqm+//VaGYZTun5ubq1mzZpWu/D7v/vvvl5eXl6ZOnaqpU6cqNDRUMTEx11yPt7e3/v73v+uOO+4oF7gudD40ffPNN2W2z5o1S7m5uaWPn79o/e9/9jNmzCi3cnvQoEH67bffFB4eftGffWUESk9PT73xxhtau3atZs6cWeaxFi1aqHnz5tq4ceNFj3/bbbeVTq84//O/WCe8QYMGat26tWbNmqVffvmlNFD27dtXx48f18SJExUQEFAauqVz72dOTo5mz55d5rW+/vrr0sevlpubm7744gv99a9/1ciRI/XZZ59d9XMBnEOHEqhGTz31lCZPnqyBAwfqjTfeUP369TVt2jRt3769zH61atXS2LFj9cYbb+iPf/yjhg4dqoMHD+rVV18tNxT61FNPadasWYqIiNDTTz+tdu3ayWaz6cCBA0pMTNSzzz6rLl26VMn5PPDAA3rggQcuu0+3bt1Uq1YtjR49Wq+88oo8PDw0bdq0cqH6WvTo0UOLFy9WbGysYmJiFB8fr8DAQL3zzjsaPny4Bg0apMcee0xnz57Vu+++q+zs7HJ3fgkKCtKQIUM0depUZWdna+zYsRe91M/VeOaZZ/TMM89cdp++ffuqX79+euGFF3T69Gl1795dmzZt0iuvvKJbbrlFDz74oKRzUyoeeOABvf/++/Lw8FCfPn3022+/acKECeWmArz22mtatGiRunXrpieffFItWrRQQUGB9u3bp/j4eH3++edq1KjRdZ3The6//35NmDDhopet+uKLL9S/f3/169dPI0eOVGhoqDIzM7Vt2zatX7++NISev8vRpEmT5O/vLy8vL4WFhZV2ZHv37q2PPvpI3t7epdfwDAsLU1hYmBITExUXF1dmDulDDz2kTz75RCNGjNC+fft08803a9myZXrrrbc0YMCAMt3Mq/Xee+/J399ff/7zn5WTk6Pnnnvuml8DcFV0KIFqFBISIqvVqtatW2vMmDF64IEH5OXlpY8//rjcvq+99prGjx9f+sf0o48+0ueff15uCNHX11dLly7VyJEjNWnSJA0cOFB/+MMf9OGHH6pRo0ZV2qG8GnXq1NH8+fPl4+OjBx54QA8//LD8/PzKLIi5HrfddpusVqv27t2rXr166cSJExo2bJhmz56tkydP6t5779WoUaMUEBCglJSUiy6aGjVqlDIyMlRYWHjdtzS8WhaLRbNnz9YzzzyjKVOmaMCAAZowYYIefPBBJScnl+ngfvnll3rmmWc0depUxcXFacaMGZo1a1a5RSUNGjTQunXrFBMTo3fffVexsbF68MEHNXnyZHXo0OGSi1Cup/Z//vOfF30sOjpaa9asUVBQkJ566in16dNHY8aMUVJSUplQFxYWpvfff18bN25UVFSUOnXqpLlz55Y+fn7fHj16lE5juHD77wOil5eXUlJSNHz4cL377rvq37+/pk6dqrFjx+rHH3+87nN99dVX9e677+r555/XK6+8ct2vA7gai3Hh2BAAAABwjehQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAAAqhEAJAACACiFQAgAAoEIIlAAAAKgQAiUAAMAlHDp0SI899phWr15tdil2jUAJAABwCcuXL9ekSZN0++23q1+/flqzZo3ZJdklAiUAAMBVWLx4sbp06aLY2FiC5e+4m10AAACAIygpKZEkJSQkKCEhQXfffbc2btyogoICBQQE6NZbb1X37t3Vo0cPtWrVSm5urtO3I1ACAABcREFBgX7++eeLPtakSRM98sgjSktL07Fjx3Ty5EmtWrVK3377rUpKSnTDDTdo3LhxeuCBB+Tu7vxxy2IYhmF2EQAAAPZk5syZevbZZ3X48GHZbDa5ubnJZrOpe/fuev311xUVFSWLxVLueTk5OVq1apU+++wz/fjjj7rxxhs1fvx43XPPPSacRfVxnV4sAADAFRiGoTfffFN/+MMfdOutt+qLL76QJHXt2lXJyclaunSpoqOjLxomJcnPz099+vTRrFmz9Ouvv6pVq1YaOnSoXnzxRdlstuo8lWpFhxIAAECSzWbT008/rQ8//FCvvvqq/v73v8swDKWlpemGG264ZIi8HMMw9P777+vZZ5/V4MGD9d///le+vr5VUL25CJQAAACSJk6cqGef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1jp27JheeuklbdmyhTCJSkeHEgAAJ5STk6Po6GitW7dOtWvX1qJFi9SxY0ezy4KTokMJAICTWbBggYKDg7Vu3ToNHDhQx44dI0yiShEoAQBwEjabTQ899JAGDBigkpISffPNN5o3bx4Lb1Dl+IQBAOAEdu3apcjISB09elQtW7aU1WpVcHCw2WXBRdChBADAwb333ntq2bKl0tPT9fzzz2vbtm2ESVQrOpQAADionJwc9enTR6tXr1ZQUJAWLVqk2267zeyy4ILoUAIA4IASEhJUv359rV69WrGxsTp27BhhEqYhUAIA4EBsNptGjRql2NhYFRUV6auvvtKCBQvk6elpdmlwYQx5AwDgINLS0tSzZ08dPnxYN910k6xWq0JCQswuC6BDCQCAI/jggw/UvHlzHTlyRM8884x27NhBmITdoEMJAIAdy8vLU9++fbVixQoFBgYqISFBXbp0MbssoAw6lAAA2KnFixcrODhYK1asUExMjDIyMgiTsEsESgAA7IzNZtMf//hH9enTR2fPntXkyZOVkJDAwhvYLYa8AQCwI/v371fPnj118OBB3XjjjbJarWrYsKHZZQGXRYcSAAA78fHHHys8PFwHDx7Uk08+qV27dhEm4RDoUAIAYLK8vDz169dPy5YtU0BAgOLj49W9e3ezywKuGh1KAABMtGTJEtWvX1/Lli1T7969dfz4ccIkHA6BEgAAExiGodGjRys6OloFBQX697//raSkJBbewCEx5A0AQDU7cOCAIiIitH//ft1www2yWq1q1KiR2WUB140OJQAA1eizzz5TeHi49u/fryeeeEJ79uwhTMLh0aEEAKAaFBQUKDY2VlarVf7+/oqPj1ePHj3MLguoFHQoAQCoYkuXLlVwcLCsVquioqKUkZFBmIRTIVACAFCFHn/8cUVERCg/P1+ff/65UlJS5OXlZXZZQKViyBsAgCpw6NAhRUREKC0tTc2aNZPValWTJk3MLguoEnQoAQCoZJMmTVJYWJjS0tI0evRopaWlESbh1OhQAgBQSQoLC9W/f38lJyfLz89Pc+fOVVRUlNllAVWOQAkAQCVYvny5BgwYoNOnT6tnz55KTExkriRcBkPeAABU0JNPPqkePXooNzdXH3/8sVJTUwmTcCl0KAEAuE5HjhxRRESE9uzZoyZNmig1NVVNmzY1uyyg2tGhBADgOkyZ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FgDAxdChBBzU7Nmz1aBBA23YsEF333230tPTCZMAAFMQKAEHY7PZ9Ic//EFDhgyRYRj64Ycf9MMPP8jNjV9nAIA5GPIGHMi2bdsUFRWljIwM3XzzzVqyZIlq165tdlkAABdHSwNwEG+99Zbatm2r48ePa9y4cdq0aRNhEgBgF+hQAnbu9OnTioqK0q+//qo6depo8eLFat++vdllAQBQig4lYMfmzp2r+vXr69dff9Wdd96p9PR0wiQAwO4QKAE7ZLPZdP/99ysuLk42m03ff/+9Zs+eLXd3BhUAAPaHv06AndmxY4eioqKUnp6u1q1by2q1qm7dumaXBQDAJdGhBOzIO++8o9atW+vYsWP6f//v/2nLli2ESQCA3aNDCdiBM2fOqFevXlq3bp1q166tRYsWqWPHjmaXBQDAVaFDCZhswYIFql+/vtatW6dBgwbp2LFjhEkAgEMhUAImsdlsevDBBzVgwACVlJRo2rRpmjt3LgtvAAAOh79cgAl27dqlyMhIHT16VC1btpTValVwcLDZZQEAcF3oUALV7L333lPLli2Vnp6u559/Xtu2bSNMAgAcGh1KoJrk5OSoT58+Wr16tYKCgrRo0SLddtttZpcFAECF0aEEqkFCQoLq16+v1atXq3///srIyCBMAgCcBoESqEI2m02jRo1SbGysioqK9PXXXys+Pl4eHh5mlwYAQKVhyBuoInv37lVERIQOHz6sm266Sampqapfv77ZZQEAUOnoUAJV4P3339dNN92kI0eO6Nlnn9WOHTsIkwAAp0WHEqhEeXl56tu3r1asWKHAwEAlJCSoS5cuZpcFAECVokMJVJLFixcrODhYK1asUExMjDIyMgiTAACXQKAEKshms+mPf/yj+vTpo8LCQk2ZMkUJCQny9PQ0uzQAAKoFQ95ABezbt08RERE6ePCgbrzxRqWmpqpBgwZmlwUAQLWiQwlcp48++kg33nijDh48qL/+9a/atWsXYRIA4JLoUALXKC8vT/369dOyZcsUEBCgBQsWqFu3bmaXBQCAaehQAtcgJSVF9evX17Jly9S7d28dP36cMAkAcHkESuAq2Gw2PfbYY+rVq5cKCgr073//W0lJSSy8AQBADHkDV3TgwAFFRERo//79uuGGG2S1WtWoUSOzywIAwG7QoQQu47PPPtMNN9yg/fv364knntCePXsIkwAA/A4dSuAiCgoK1K9fP6Wmpsrf31/x8fHq0aOH2WUBAGCX6FACv7N06VIFBwcrNTVVUVFRysjIIEwCAHAZBErgAo8//rgiIiKUn5+vzz//XCkpKfLy8jK7LAAA7BpD3oCkQ4cOKSIiQmlpaWrWrJmsVquaNGlidlkAADgEOpRweZMmTVJYWJjS0tI0evRopaWlESYBALgGdCjhss6ePav+/fsrJSVFfn5+mjt3rqKioswuCwAAh0OghEtavny5BgwYoNOnTysiIkIJCQnMlQQA4Dox5A2X8+STT6pHjx7Kzc3VJ598IqvVSpgEAKAC6FDCZRw5ckQRERHas2ePmjRpotTUVDVt2tTssgAAcHh0KOESJk+erKZNm2rPnj169NFHlZaWRpgEAKCS0KGEUyssLNTAgQOVlJQkX19fLVy4UL179za7LAAAnAqBEk5r1apVio2N1alTp9S9e3clJibKx8fH7LIAAHA6DHnDKT399NPq1q2bcnJy9MEHH2jZsmWESQAAqggdSjiV9PR0RUREaNeuXWrUqJFSU1MVFhZmdlkAADg1OpRwGl999ZWaNGmiXbt2adSoUdq/fz9hEgCAakCHEg6vsLBQcXFxSkhIkI+Pj+bPn6++ffuaXRYAAC6DQAmHtnbtWsXExCg7O1tdu3bVokWL5Ovra3ZZAAC4FIa84bCee+45denSRadPn9bEiRO1YsUKwiQAACagQwmHk5GRoYiICO3YsUMNGzaU1WrVjTfeaHZZAAC4LDqUcCjTpk1To0aNtGPHDj300EM6ePAgYRIAAJPRoYRDKC4u1p133qn4+Hh5e3trzpw56t+/v9llAQAAESjhANatW6eYmBhlZWWpc+fOWrx4sfz8/MwuCwAA/A9D3rBrL730kjp37qxTp07p3Xff1erVqwmTAADYGTqUsEvHjx9XZGSktm3bpgYNGshqtap58+ZmlwUAAC6CDiXsznfffadGjRpp27ZtGj58uA4dOkSYBADAjtGhhN0oLi7WXXfdpblz58rb21vz5s3TwIEDzS4LAABcAYESdmHDhg3q06ePTp48qVtvvVXJyckKCAgwuywAAHAVGPKG6f72t7+pY8eOysrK0ltvvaV169YRJgEAcCB0KGGakydPKjIyUlu2bFH9+vW1ZMkStWzZ0uyyAADANaJDCVPMnDlTDRs21JYtW3TffffpyJEjhEkAABwUHUpUq5KSEt1zzz2aPXu2vLy8NGfOHMXFxZldFgAAqAACJarN5s2b1atXL504cUK33HKLUlJSFBgYaHZZAACgghjyRrV49dVX1b59e2VmZur111/X+vXrCZMAADgJOpSoUllZWYqKitKmTZtUr149paSkqE2bNmaXBQAAKhEdSlSZH3/8UQ0aNNCmTZs0dOhQpaenEyYBAHBCBEpUOpvNpnvuuUd33323JGnWrFmaMWOG3Nz4uAEA4IwY8kal2rJli6Kjo3X8+HG1b99eKSkpqlWrltllAQCAKkTLCJXm9ddfV7t27XTixAm98sor2rBhA2ESAAAXQIcSFZadna3o6Ght2LBBdevWVXJysm6++WazywIAANWEDiUq5Oeff1aDBg20YcMGDRkyROnp6YRJAABcDIES18Vms+nee+/VnXfeKcMwNGPGDP3444+qUaOG2aUBAIBqxpA3rtm2bdsUHR2tY8eOqW3btrJarapdu7bZZQEAAJPQocQ1GT9+vNq2bauMjAyNGzdOmzdvJkwCAODi6FDiqpw+fVrR0dFav3696tSpo6SkJHXo0MHssgAAgB2gQ4krmjdvnurXr6/169crLi5O6enphEkAAFCKQIlLstlsGj58uO644w7ZbDZ9//33mjNnjtzdaWwDAID/QzLARe3YsUNRUVFKT09X69atZbVaVbduXbPLAgAAdogOJcp555131Lp1ax07dkwvvviitmzZQpgEAACXRIcSpXJyctSrVy+tXbtWtWvX1qJFi9SxY0ezywIAAHaODiUkSQsWLFBwcLDWrl2rgQMH6tixY4RJAABwVQiULs5ms+mhhx7SgAEDVFxcrG+++Ubz5s1j4Q0AALhqpAYXtnv3bkVGRurIkSNq2bKlrFargoODzS4LAAA4GDqULuq9995TixYtdPToUT3//PPatm0bYRIAAFwXOpQuJicnR3379tWqVasUFBSkxMREderUyeyyAACAA6ND6UISExNVv359rVq1SrGxsTp27BhhEgAAVJjLBErDMMwuwTQ2m02jRo1Sv379VFRUpKlTp2rBggXy9PQ0uzQAAOAEXCJQbtmyRTVr1tRDDz2kXbt2mV1OtUpLS1PTpk01depU3XTTTTpw4IBGjBhhdlkAAMCJuESgPHr0qIqKijRt2jS1aNHCZYLlBx98oObNm+vw4cN65pln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",
85
- "text/plain": [
86
- "<Figure size 640x480 with 1 Axes>"
87
- ]
88
- },
89
- "metadata": {},
90
- "output_type": "display_data"
91
- }
92
- ],
93
- "source": [
94
- "import numpy as np\n",
95
- "import networkx as nx\n",
96
- "import matplotlib.pyplot as plt\n",
97
- "\n",
98
- "# Step 1: Define states and observations based on user input\n",
99
- "states = list(map(str.strip, input(\"Enter the states (comma-separated): \").split(',')))\n",
100
- "observations = list(map(str.strip, input(\"Enter the possible observations (comma-separated): \").split(',')))\n",
101
- "\n",
102
- "# Step 2: Get user input for the observation sequence\n",
103
- "observation_seq = list(map(str.strip, input(f\"Enter the observation sequence as space-separated names (options: {observations}): \").split()))\n",
104
- "\n",
105
- "# Step 3: Convert observation sequence to indices\n",
106
- "try:\n",
107
- " observation_indices = [observations.index(obs) for obs in observation_seq]\n",
108
- "except ValueError as e:\n",
109
- " print(f\"Error: {e}. Please make sure your observation sequence contains only valid options: {observations}.\")\n",
110
- " exit()\n",
111
- "\n",
112
- "# Step 4: Get user input for the transition matrix\n",
113
- "print(\"\\nEnter the state transition probabilities:\")\n",
114
- "transition_matrix = np.zeros((len(states), len(states)))\n",
115
- "for i in range(len(states)):\n",
116
- " for j in range(len(states)):\n",
117
- " transition_matrix[i, j] = float(input(f\"P({states[j]} | {states[i]}): \"))\n",
118
- "\n",
119
- "# Step 5: Get user input for the emission matrix\n",
120
- "print(\"\\nEnter the emission probabilities:\")\n",
121
- "emission_matrix = np.zeros((len(states), len(observations)))\n",
122
- "for i in range(len(states)):\n",
123
- " for j in range(len(observations)):\n",
124
- " emission_matrix[i, j] = float(input(f\"P({observations[j]} | {states[i]}): \"))\n",
125
- "\n",
126
- "# Step 6: Set initial state probabilities (ask the user to input them)\n",
127
- "initial_probabilities = np.zeros(len(states))\n",
128
- "print(\"\\nEnter the initial state probabilities (comma-separated):\")\n",
129
- "initial_probabilities = list(map(float, input(f\"Enter initial probabilities for {states}: \").split(',')))\n",
130
- "\n",
131
- "# Step 7: Forward Procedure\n",
132
- "def forward_procedure(observation_seq, transition_matrix, emission_matrix, initial_probabilities):\n",
133
- " num_states = len(transition_matrix)\n",
134
- " num_observations = len(observation_seq)\n",
135
- " \n",
136
- " # Initialize the forward matrix\n",
137
- " forward_matrix = np.zeros((num_states, num_observations))\n",
138
- " \n",
139
- " # Initialization step\n",
140
- " for i in range(num_states):\n",
141
- " forward_matrix[i, 0] = initial_probabilities[i] * emission_matrix[i, observation_seq[0]]\n",
142
- " \n",
143
- " # Recursion step\n",
144
- " for t in range(1, num_observations):\n",
145
- " for j in range(num_states):\n",
146
- " forward_matrix[j, t] = sum(forward_matrix[i, t - 1] * transition_matrix[i, j] for i in range(num_states)) * emission_matrix[j, observation_seq[t]]\n",
147
- " \n",
148
- " # Termination step\n",
149
- " prob_observation = sum(forward_matrix[i, num_observations - 1] for i in range(num_states))\n",
150
- " \n",
151
- " return forward_matrix, prob_observation\n",
152
- "\n",
153
- "# Step 8: Compute the forward matrix and the probability of the observation sequence\n",
154
- "forward_matrix, prob_observation = forward_procedure(observation_indices, transition_matrix, emission_matrix, initial_probabilities)\n",
155
- "\n",
156
- "# Display the results\n",
157
- "print(\"\\nForward Matrix:\\n\", forward_matrix)\n",
158
- "print(\"Probability of the observation sequence:\", prob_observation)\n",
159
- "\n",
160
- "# Step 9: Visualize the HMM\n",
161
- "G = nx.DiGraph()\n",
162
- "\n",
163
- "# Add nodes with state names\n",
164
- "for state in states:\n",
165
- " G.add_node(state, shape='circle')\n",
166
- "\n",
167
- "# Add edges with transition probabilities\n",
168
- "for i in range(len(states)):\n",
169
- " for j in range(len(states)):\n",
170
- " if transition_matrix[i, j] > 0:\n",
171
- " G.add_edge(states[i], states[j], weight=transition_matrix[i, j])\n",
172
- "\n",
173
- "# Draw the graph\n",
174
- "pos = nx.spring_layout(G)\n",
175
- "edges = G.edges(data=True)\n",
176
- "nx.draw(G, pos, with_labels=True, node_size=2000, node_color='lightblue', font_size=10, font_weight='bold', arrows=True)\n",
177
- "nx.draw_networkx_edge_labels(G, pos, edge_labels={(u, v): f'{d[\"weight\"]:.2f}' for u, v, d in edges})\n",
178
- "\n",
179
- "plt.title(\"Hidden Markov Model Network\")\n",
180
- "plt.show()\n"
181
- ]
182
- },
183
- {
184
- "cell_type": "code",
185
- "execution_count": 3,
186
- "id": "ca80fd1f-cf54-4560-a5a7-47599cf73aae",
187
- "metadata": {},
188
- "outputs": [
189
- {
190
- "name": "stdin",
191
- "output_type": "stream",
192
- "text": [
193
- "Enter the states (comma-separated): low,high\n",
194
- "Enter the possible observations (comma-separated): snow,rain,dry,sunny\n",
195
- "Enter the observation sequence as space-separated names (options: ['snow', 'rain', 'dry', 'sunny']): rain dry sunny snow\n"
196
- ]
197
- },
198
- {
199
- "name": "stdout",
200
- "output_type": "stream",
201
- "text": [
202
- "\n",
203
- "Enter the state transition probabilities:\n"
204
- ]
205
- },
206
- {
207
- "name": "stdin",
208
- "output_type": "stream",
209
- "text": [
210
- "P(low | low): 0.3\n",
211
- "P(high | low): 0.5\n",
212
- "P(low | high): 0.7\n",
213
- "P(high | high): 0.5\n"
214
- ]
215
- },
216
- {
217
- "name": "stdout",
218
- "output_type": "stream",
219
- "text": [
220
- "\n",
221
- "Enter the emission probabilities:\n"
222
- ]
223
- },
224
- {
225
- "name": "stdin",
226
- "output_type": "stream",
227
- "text": [
228
- "P(snow | low): 0.1\n",
229
- "P(rain | low): 0.3\n",
230
- "P(dry | low): 0.6\n",
231
- "P(sunny | low): 0\n",
232
- "P(snow | high): 0\n",
233
- "P(rain | high): 0.2\n",
234
- "P(dry | high): 0.3\n",
235
- "P(sunny | high): 0.5\n"
236
- ]
237
- },
238
- {
239
- "name": "stdout",
240
- "output_type": "stream",
241
- "text": [
242
- "\n",
243
- "Enter the initial state probabilities (comma-separated):\n"
244
- ]
245
- },
246
- {
247
- "name": "stdin",
248
- "output_type": "stream",
249
- "text": [
250
- "Enter initial probabilities for ['low', 'high']: 0.6,0.4\n"
251
- ]
252
- },
253
- {
254
- "name": "stdout",
255
- "output_type": "stream",
256
- "text": [
257
- "\n",
258
- "Forward Matrix:\n",
259
- " [[0.18 0.066 0. 0.0018375]\n",
260
- " [0.08 0.039 0.02625 0. ]]\n",
261
- "Probability of the observation sequence: 0.0018375\n"
262
- ]
263
- },
264
- {
265
- "data": {
266
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAIICAYAAADQa34EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABSqklEQVR4nO3deVxVdf7H8fdFQEBAREQEBJHIndQ0x41NxLUs02qyTNuzZcxpmaaxbN/7tWdNpU7LjJllabiACJiaiUvu+y4iKiKyynJ+fzgwEloqy7nL6/l4+CjvPffe9wHKt5/v+d5rMQzDEAAAAHCJnMwOAAAAANtGoQQAAECtUCgBAABQKxRKAAAA1AqFEgAAALVCoQQAAECtUCgBAABQKxRKAAAA1AqFEgAAALVCoQQu0PTp02WxWJSRkXHO+4cPH642bdpUu61NmzYaN27cHz53amqqLBaLUlNT//DYmJgYxcTE/HHgOrZ3715ZLBZZLBZNmTLlnMfcfvvtVcfUtZiYGHXu3LnOn/diVX6vLBaLpk+ffs5j4uLiZLFYavw81NaF/jydy+993357nMVi0csvv1zjvj/6b+D3bN68WVOmTNHevXsv+rH1pfJn+vXXXzc7CmDzKJRAPfruu+80efJks2PUKS8vL02fPl0VFRXVbs/Pz9esWbPk7e1tUrKG5eXlpU8//bTG7Xv27FFqaqrNfx1efvll5eTk1Nnzbd68Wc8884xVFUoAdYdCCdSjbt26KTw83OwYderGG2/Uvn37tHjx4mq3z5w5U+Xl5brmmmvq9PUKCwvr9Pnqyo033qiffvpJO3bsqHb7Z599pqCgIPXt29ekZLUXHx+vgoICvfDCC2ZHqReGYaioqMjsGIBdoVAC9ehcS5Rbt27V4MGD5eHhIT8/P9177706depUjccahqFXX31VoaGhcnNzU/fu3TV//vxzvk5eXp4eeeQRhYWFydXVVUFBQZo4caIKCgqqHWexWPTAAw/o888/V4cOHeTh4aErrrhC8+bNu+Bzateunfr06aPPPvus2u2fffaZRo4cqaZNm9Z4zMyZM5WQkKBWrVrJ3d1dHTp00N/+9rca+caNGydPT09t2LBBCQkJ8vLy0oABA86b5bvvvpOHh4fuvPNOlZWVSZJ++OEH9e7dWx4eHvLy8tLAgQO1YsWKqsfMmTNHFoulRiGWpA8//FAWi0Xr16//w6/DwIED1bp162pfh4qKCs2YMUO33XabnJxq/u+1uLhYTzzxRLXv0/3336/c3Nxqx5WWluqxxx5TQECAPDw81K9fP/3yyy/nzJGVlaV77rlHwcHBcnV1VVhYmJ555pmqr8elaNeune644w69//772rdv3x8en5GRoWuuuUa+vr5yc3NTt27d9PXXX1fdP336dI0ePVqSFBsbW+2Sgffff19OTk7Kzs6uOv6NN96QxWLR/fffX3VbRUWFmjVrpr/+9a9Vt+Xk5GjChAkKCgqSq6ur2rZtqyeffFIlJSXV8lX+3E+dOlUdOnRQ48aNNWPGjHOeS2lpqW677TZ5enpe1H8XgMMzAFyQadOmGZKMn3/+2SgtLa3xa+jQoUZoaGi1x4SGhhq33XZb1e+zsrIMf39/IygoyJg2bZqRmJhojBkzxggJCTEkGUuWLKk69umnnzYkGXfccYcxf/584+OPPzaCgoKMgIAAIzo6uuq4goICo2vXroafn5/x5ptvGsnJycbbb79tNG3a1IiLizMqKiqqjpVktGnTxrjqqquMr7/+2khMTDRiYmIMZ2dnY9euXb97/nv27DEkGa+99prx6aefGm5ubkZOTo5hGIaxdetWQ5KRkpJi3H///cZv/9fy3HPPGf/3f/9n/Pjjj0ZqaqoxdepUIywszIiNja123G233Wa4uLgYbdq0MV566SVj8eLFxsKFCw3DMIzo6GijU6dOVce++eabRqNGjYznnnuu6rYvv/zSkGQkJCQYc+bMMWbOnGlceeWVhqurq7F06VLDMAyjtLTU8Pf3N8aMGVPjHK+66iqje/fuv/t1WLJkiSHJmDVrljF58mQjMDDQKCsrMwzDMObPn29YLBZj586dxrBhw6r9PFRUVBiDBg0ynJ2djcmTJxuLFi0yXn/9daNJkyZGt27djOLi4mpfB4vFYjz66KPGokWLjDfffNMICgoyvL29q/08HT582GjdurURGhpqfPTRR0ZycrLx3HPPGY0bNzbGjRtXLbck4+mnn/7dc6s87v777zcOHz5seHh4GLfeemvVfZX/DaxatarqtpSUFMPV1dXo37+/MXPmTGPBggXGuHHjDEnGtGnTDMMwjOzsbOPFF180JBnvv/++sWLFCmPFihVGdnZ21c/OV199VfWcgwcPNtzd3Y2IiIiq21auXGlIMhIT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jaXp4cOHa9euXWrevLl69OhR41ddv7n22f7xj3/o6quvrrbz9rcq/yBv3Lhxtds/+uijS3rNhIQELVy4UOnp6Ro+fHjVTvF27dopKChIX331lQzDqDq+oKBAs2fPrtr5XenPf/6z3NzcNH36dE2fPl1BQUFKSEi46Dzu7u566qmndPXVV9coXGerLE1ffPFFtdtnz56tgoKCqvsr37T+t9/7r7/+usbO7eHDh2vjxo0KDw8/5/e+Lgqlq6urnn/+ea1atUqzZs2qdl+7du0UERGhX3/99Zyv36NHj6rLKyq//+eahLdq1UodO3bU7NmztXr16qpCOXDgQB09elRvvvmmvL29q0q3dObrmZ+frzlz5lR7rn/9619V918oJycnffTRR/rLX/6icePG6cMPP7zgxwI4gwkl0IAmTpyozz77TMOGDdPzzz+vli1b6ssvv9TWrVurHdesWTM98sgjev7553XnnXdq9OjROnDggKZMmVJjKXTixImaPXu2oqKi9PDDDysyMlIVFRXav3+/Fi1apL/+9a/q1atXvZzPLbfcoltuueV3j+nTp4+aNWume++9V08//bRcXFz05Zdf1ijVF6Nfv35avHixBg8erISEBCUmJqpp06Z69dVXNWbMGA0fPlz33HOPSkpK9Nprryk3N7fGJ7/4+Pjouuuu0/Tp05Wbm6tHHnnknG/1cyEmTZqkSZMm/e4xAwcO1KBBg/T4448rLy9Pffv21fr16/X000+rW7duuvXWWyWduaTilltu0VtvvSUXFxfFx8dr48aNev3112tcCvDss88qKSlJffr00UMPPaR27dqpuLhYe/fuVWJioqZOnarg4OBLOqez/fnPf9brr79+zret+uijjzRkyBANGjRI48aNU1BQkHJycrRlyxatWbOmqoRWfsrRxx9/LC8vL7m5uSksLKxqIjtgwAC9++67cnd3r3oPz7CwMIWFhWnRokW65pprql1DOnbsWL3//vu67bbbtHfvXnXp0kU//fSTXnzxRQ0dOrTaNPNCvfHGG/Ly8tKECROUn5+vRx999KKfA3BUTCiBBhQQEKC0tDR17NhR9913n2655Ra5ubnpvffeq3Hss88+q5deeqnqD9N3331XU6dOrbGE2KRJEy1dulTjxo3Txx9/rGHDhumGG27QO++8o+Dg4HqdUF6I5s2b68cff5SHh4du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OclisZzzmF27dum9997TzJkz5e/vL09PT33zzTcKCAho4LQAYLsolADsmmEY5y2TxcXF6tq1q1q2bKn4+HgNHTpUr776qrZu3aqkpCT5+/s3cFoAsE3OZgcAgPp0vjIpSTfddJMk6Z133tEVV1whSXrxxRc1ZMgQ7dq1i0IJABeIQgnAIU2bNk3z58/XwoULq8qkdOb9Lfft28f7WQLARWBTDgCHU1BQoKeffloPPPCA+vXrV+2+WbNmqXPnzuwMB4CLQKEE4HA2btwoLy8vDRs2TM7O/1uoycjI0MKFC9W2bVt169atxuPKysp08uTJhowKADaBQgnA4Tg7O2vPnj1q2rRp1W179uzR559/ru3bt2vy5MmSVGPZ++eff1avXr300UcfNWheALB2FEoADqdVq1aKjIxUUlKS8vPzlZmZqaefflppaWl6/PHHFRkZqYqKCjk5Vf9fZL9+/fTMM8/or3/9q6677ro/fH9LAHAUvG0QAIeUmJioW2+9Va1bt9bu3bvVoUMH3XHHHbr77rsl/f7bDR04cEC333671q1bp8TERPXs2bMhowOA1aFQAnBYp06dUmJiory9vRUXF6fGjRv/7vG/nVq2b99e27dv13fffacRI0bUd1wAsFoUSgD4rwULFmjJkiV64IEH1Lp16/Mel5iYqKlTp+qXX37R2LFj9eijj6pFixYNmBQArAvXUAKApPLyci1btkxffPGFsrOzz3lMTk6OXnvtNd19993Kzs7WnDlz9Morr1QrkyUlJQ0VGQCsBhNKADjL8uXL1adPH0nVr6NMSUnRq6++qrS0ND333HO6/vrrFRYWVvW4lJQUffjhhzIMQ02bNtU///nPGpt6AMBe8X87ADhLZZksKyuTxWLRvn379Pbbb2vIkCFq0qSJZs6cqUceeURt2rSpesxjjz2miRMnau/everTp4927NihTp066eDBgyadBQA0LCaUAHAeJ0+eVEREhHx8fDRq1Cg9++yzVW+Efvr0abm6umrGjBl68MEHNWXKFE2YMEFubm46ceKEhg4dqkceeUTXX3+9yWcBAPWPz/IGgPNo2rSpPvjgAwUEBFT7iMaysjK5urrq8OHDuv/++3X33Xfrtttuk5ubmySpWbNmOnjwoHbu3GlWdABoUBRKAPgdo0aNqvr3yrcNqpxSPv744+rWrZvuueceNW/evOq4lStXKiAgQC1btmzwvABgBq6hBIALdPYmm2PHjunAgQMaOHCgLrvssqrb8/PzlZiYqKysLEVHR5sREwAaHIUSAC6BYRjKyMhQSEiIGjVqJOnMdZXJycl644039PDDDyssLKzG54EDgD1iyRsALoGnp6diY2Or7eSeM2eOXn31VcXGxmrSpEmSxFsHAXAIFEoAuATu7u666aabdPvtt2vt2rXKzs5WZmamunTpos8//1zS738eOADYE942CABqYdu2bfrggw/k5uamAQMG6Morr1Tz5s1rfO43ANgzCiUAAABqhb8+A0A9MgxDhw4dUteuXZWbm2t2HACoFxRKAKhnL7zwgn799VcFBARo9uzZZscBgDrHkjcANIDZs2drzJgxKikp0ciRIzVr1iyusQRgNyiUANBATpw4odjYWP3666/y8/PTkiVL1LlzZ7NjAUCt8ddjAGggzZo107p16/TMM88oJydHkZGRmjJlitmxAKDWmFACgAk2bdqkuLg4ZWdnq0uXLkpNTZWvr6/ZsQDgkjChBAATdOrUSYcPH9bo0aO1YcMGBQYGatasWWbHAoBLQqEEAJM4OTnp66+/1pw5c2SxWHTDDTfo2muvVVlZmdnRAOCisOQNAFYgNzdXAwYM0Jo1a9S8eXMlJyera9euZscCgAvChBIArICPj49Wr16t559/XidOnFD37t315JNPmh0LAC4IE0oAsDJbtmxRbGysjhw5oo4dOyotLU1+fn5mxwKA82JCCQBWpkOHDsrMzNSf//xnbd68WUFBQZo5c6bZsQDgvJhQAoAVmzdvnm644QYVFRVp+PDh+u677+Ts7Gx2LACohkIJAFYuLy9PcXFxWr16tXx9fZWUlKTu3bubHQsAqrDkDQBWztvbWxkZGXrllVeUm5urHj166IknnjA7FgBUYUIJADZk27ZtiomJUVZWltq3b6+0tDT5+/ubHQuAg2NCCQA2pF27djp06JDGjBmjrVu3qnXr1vryyy/NjgXAwTGhBAAblZiYqFGjRqmoqEhDhw7V999/z4YdAKagUAKADcvPz9eAAQP0yy+/qFmzZlq4cKF69uxpdiwADoYlbwCwYZ6enlq5cqVef/11nTx5Ur169dJjjz1mdiwADoYJJQDYiR07digmJkaZmZm6/PLLlZaWpoCAALNjAXAATCgBwE5ERETowIEDuu2227R9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",
267
- "text/plain": [
268
- "<Figure size 640x480 with 1 Axes>"
269
- ]
270
- },
271
- "metadata": {},
272
- "output_type": "display_data"
273
- }
274
- ],
275
- "source": [
276
- "import numpy as np\n",
277
- "import networkx as nx\n",
278
- "import matplotlib.pyplot as plt\n",
279
- "\n",
280
- "# Step 1: Define states and observations based on user input\n",
281
- "states = list(map(str.strip, input(\"Enter the states (comma-separated): \").split(',')))\n",
282
- "observations = list(map(str.strip, input(\"Enter the possible observations (comma-separated): \").split(',')))\n",
283
- "\n",
284
- "# Step 2: Get user input for the observation sequence\n",
285
- "observation_seq = list(map(str.strip, input(f\"Enter the observation sequence as space-separated names (options: {observations}): \").split()))\n",
286
- "\n",
287
- "# Step 3: Convert observation sequence to indices\n",
288
- "try:\n",
289
- " observation_indices = [observations.index(obs) for obs in observation_seq]\n",
290
- "except ValueError as e:\n",
291
- " print(f\"Error: {e}. Please make sure your observation sequence contains only valid options: {observations}.\")\n",
292
- " exit()\n",
293
- "\n",
294
- "# Step 4: Get user input for the transition matrix\n",
295
- "print(\"\\nEnter the state transition probabilities:\")\n",
296
- "transition_matrix = np.zeros((len(states), len(states)))\n",
297
- "for i in range(len(states)):\n",
298
- " for j in range(len(states)):\n",
299
- " transition_matrix[i, j] = float(input(f\"P({states[j]} | {states[i]}): \"))\n",
300
- "\n",
301
- "# Step 5: Get user input for the emission matrix\n",
302
- "print(\"\\nEnter the emission probabilities:\")\n",
303
- "emission_matrix = np.zeros((len(states), len(observations)))\n",
304
- "for i in range(len(states)):\n",
305
- " for j in range(len(observations)):\n",
306
- " emission_matrix[i, j] = float(input(f\"P({observations[j]} | {states[i]}): \"))\n",
307
- "\n",
308
- "# Step 6: Set initial state probabilities (ask the user to input them)\n",
309
- "initial_probabilities = np.zeros(len(states))\n",
310
- "print(\"\\nEnter the initial state probabilities (comma-separated):\")\n",
311
- "initial_probabilities = list(map(float, input(f\"Enter initial probabilities for {states}: \").split(',')))\n",
312
- "\n",
313
- "# Step 7: Forward Procedure\n",
314
- "def forward_procedure(observation_seq, transition_matrix, emission_matrix, initial_probabilities):\n",
315
- " num_states = len(transition_matrix)\n",
316
- " num_observations = len(observation_seq)\n",
317
- " \n",
318
- " # Initialize the forward matrix\n",
319
- " forward_matrix = np.zeros((num_states, num_observations))\n",
320
- " \n",
321
- " # Initialization step\n",
322
- " for i in range(num_states):\n",
323
- " forward_matrix[i, 0] = initial_probabilities[i] * emission_matrix[i, observation_seq[0]]\n",
324
- " \n",
325
- " # Recursion step\n",
326
- " for t in range(1, num_observations):\n",
327
- " for j in range(num_states):\n",
328
- " forward_matrix[j, t] = sum(forward_matrix[i, t - 1] * transition_matrix[i, j] for i in range(num_states)) * emission_matrix[j, observation_seq[t]]\n",
329
- " \n",
330
- " # Termination step\n",
331
- " prob_observation = sum(forward_matrix[i, num_observations - 1] for i in range(num_states))\n",
332
- " \n",
333
- " return forward_matrix, prob_observation\n",
334
- "\n",
335
- "# Step 8: Compute the forward matrix and the probability of the observation sequence\n",
336
- "forward_matrix, prob_observation = forward_procedure(observation_indices, transition_matrix, emission_matrix, initial_probabilities)\n",
337
- "\n",
338
- "# Display the results\n",
339
- "print(\"\\nForward Matrix:\\n\", forward_matrix)\n",
340
- "print(\"Probability of the observation sequence:\", prob_observation)\n",
341
- "\n",
342
- "# Step 9: Visualize the HMM\n",
343
- "G = nx.DiGraph()\n",
344
- "\n",
345
- "# Add nodes with state names\n",
346
- "for state in states:\n",
347
- " G.add_node(state, shape='circle')\n",
348
- "\n",
349
- "# Add edges with transition probabilities\n",
350
- "for i in range(len(states)):\n",
351
- " for j in range(len(states)):\n",
352
- " if transition_matrix[i, j] > 0:\n",
353
- " G.add_edge(states[i], states[j], weight=transition_matrix[i, j])\n",
354
- "\n",
355
- "# Draw the graph\n",
356
- "pos = nx.spring_layout(G)\n",
357
- "edges = G.edges(data=True)\n",
358
- "nx.draw(G, pos, with_labels=True, node_size=2000, node_color='lightblue', font_size=10, font_weight='bold', arrows=True)\n",
359
- "nx.draw_networkx_edge_labels(G, pos, edge_labels={(u, v): f'{d[\"weight\"]:.2f}' for u, v, d in edges})\n",
360
- "\n",
361
- "plt.title(\"Hidden Markov Model Network\")\n",
362
- "plt.show()\n"
363
- ]
364
- },
365
- {
366
- "cell_type": "code",
367
- "execution_count": 1,
368
- "id": "55377792-128f-4ddf-be66-27fb6b5abf56",
369
- "metadata": {},
370
- "outputs": [
371
- {
372
- "name": "stdin",
373
- "output_type": "stream",
374
- "text": [
375
- "Enter the states (comma-separated): regen,sonne,wolken\n",
376
- "Enter the possible observations (comma-separated): tro,etro,efeu,feu\n",
377
- "Enter the observation sequence as space-separated names (options: ['tro', 'etro', 'efeu', 'feu']): tro etro efeu feu\n"
378
- ]
379
- },
380
- {
381
- "name": "stdout",
382
- "output_type": "stream",
383
- "text": [
384
- "\n",
385
- "Enter the state transition probabilities:\n"
386
- ]
387
- },
388
- {
389
- "name": "stdin",
390
- "output_type": "stream",
391
- "text": [
392
- "P(regen | regen): 0.375\n",
393
- "P(sonne | regen): 0.25\n",
394
- "P(wolken | regen): 0.375\n",
395
- "P(regen | sonne): 0.125\n",
396
- "P(sonne | sonne): 0.5\n",
397
- "P(wolken | sonne): 0.375\n",
398
- "P(regen | wolken): 0.375\n",
399
- "P(sonne | wolken): 0.25\n",
400
- "P(wolken | wolken): 0.125\n"
401
- ]
402
- },
403
- {
404
- "name": "stdout",
405
- "output_type": "stream",
406
- "text": [
407
- "\n",
408
- "Enter the emission probabilities:\n"
409
- ]
410
- },
411
- {
412
- "name": "stdin",
413
- "output_type": "stream",
414
- "text": [
415
- "P(tro | regen): 0.05\n",
416
- "P(etro | regen): 0.1\n",
417
- "P(efeu | regen): 0.35\n",
418
- "P(feu | regen): 0.5\n",
419
- "P(tro | sonne): 0.6\n",
420
- "P(etro | sonne): 0.2\n",
421
- "P(efeu | sonne): 0.15\n",
422
- "P(feu | sonne): 0.05\n",
423
- "P(tro | wolken): 0.25\n",
424
- "P(etro | wolken): 0.25\n",
425
- "P(efeu | wolken): 0.25\n",
426
- "P(feu | wolken): 0.25\n"
427
- ]
428
- },
429
- {
430
- "name": "stdout",
431
- "output_type": "stream",
432
- "text": [
433
- "\n",
434
- "Enter the initial state probabilities (comma-separated):\n"
435
- ]
436
- },
437
- {
438
- "name": "stdin",
439
- "output_type": "stream",
440
- "text": [
441
- "Enter initial probabilities for ['regen', 'sonne', 'wolken']: 1,1,1\n"
442
- ]
443
- },
444
- {
445
- "name": "stdout",
446
- "output_type": "stream",
447
- "text": [
448
- "\n",
449
- "Forward Matrix:\n",
450
- " [[5.00000000e-02 1.87500000e-02 1.47656250e-02 5.37597656e-03]\n",
451
- " [6.00000000e-01 7.50000000e-02 8.90625000e-03 5.43945313e-04]\n",
452
- " [2.50000000e-01 6.87500000e-02 1.09375000e-02 2.56103516e-03]]\n",
453
- "Probability of the observation sequence: 0.00848095703125\n"
454
- ]
455
- },
456
- {
457
- "data": {
458
- "image/png": "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",
459
- "text/plain": [
460
- "<Figure size 640x480 with 1 Axes>"
461
- ]
462
- },
463
- "metadata": {},
464
- "output_type": "display_data"
465
- }
466
- ],
467
- "source": [
468
- "import numpy as np\n",
469
- "import networkx as nx\n",
470
- "import matplotlib.pyplot as plt\n",
471
- "\n",
472
- "# Step 1: Define states and observations based on user input\n",
473
- "states = list(map(str.strip, input(\"Enter the states (comma-separated): \").split(',')))\n",
474
- "observations = list(map(str.strip, input(\"Enter the possible observations (comma-separated): \").split(',')))\n",
475
- "\n",
476
- "# Step 2: Get user input for the observation sequence\n",
477
- "observation_seq = list(map(str.strip, input(f\"Enter the observation sequence as space-separated names (options: {observations}): \").split()))\n",
478
- "\n",
479
- "# Step 3: Convert observation sequence to indices\n",
480
- "try:\n",
481
- " observation_indices = [observations.index(obs) for obs in observation_seq]\n",
482
- "except ValueError as e:\n",
483
- " print(f\"Error: {e}. Please make sure your observation sequence contains only valid options: {observations}.\")\n",
484
- " exit()\n",
485
- "\n",
486
- "# Step 4: Get user input for the transition matrix\n",
487
- "print(\"\\nEnter the state transition probabilities:\")\n",
488
- "transition_matrix = np.zeros((len(states), len(states)))\n",
489
- "for i in range(len(states)):\n",
490
- " for j in range(len(states)):\n",
491
- " transition_matrix[i, j] = float(input(f\"P({states[j]} | {states[i]}): \"))\n",
492
- "\n",
493
- "# Step 5: Get user input for the emission matrix\n",
494
- "print(\"\\nEnter the emission probabilities:\")\n",
495
- "emission_matrix = np.zeros((len(states), len(observations)))\n",
496
- "for i in range(len(states)):\n",
497
- " for j in range(len(observations)):\n",
498
- " emission_matrix[i, j] = float(input(f\"P({observations[j]} | {states[i]}): \"))\n",
499
- "\n",
500
- "# Step 6: Set initial state probabilities (ask the user to input them)\n",
501
- "initial_probabilities = np.zeros(len(states))\n",
502
- "print(\"\\nEnter the initial state probabilities (comma-separated):\")\n",
503
- "initial_probabilities = list(map(float, input(f\"Enter initial probabilities for {states}: \").split(',')))\n",
504
- "\n",
505
- "# Step 7: Forward Procedure\n",
506
- "def forward_procedure(observation_seq, transition_matrix, emission_matrix, initial_probabilities):\n",
507
- " num_states = len(transition_matrix)\n",
508
- " num_observations = len(observation_seq)\n",
509
- " \n",
510
- " # Initialize the forward matrix\n",
511
- " forward_matrix = np.zeros((num_states, num_observations))\n",
512
- " \n",
513
- " # Initialization step\n",
514
- " for i in range(num_states):\n",
515
- " forward_matrix[i, 0] = initial_probabilities[i] * emission_matrix[i, observation_seq[0]]\n",
516
- " \n",
517
- " # Recursion step\n",
518
- " for t in range(1, num_observations):\n",
519
- " for j in range(num_states):\n",
520
- " forward_matrix[j, t] = sum(forward_matrix[i, t - 1] * transition_matrix[i, j] for i in range(num_states)) * emission_matrix[j, observation_seq[t]]\n",
521
- " \n",
522
- " # Termination step\n",
523
- " prob_observation = sum(forward_matrix[i, num_observations - 1] for i in range(num_states))\n",
524
- " \n",
525
- " return forward_matrix, prob_observation\n",
526
- "\n",
527
- "# Step 8: Compute the forward matrix and the probability of the observation sequence\n",
528
- "forward_matrix, prob_observation = forward_procedure(observation_indices, transition_matrix, emission_matrix, initial_probabilities)\n",
529
- "\n",
530
- "# Display the results\n",
531
- "print(\"\\nForward Matrix:\\n\", forward_matrix)\n",
532
- "print(\"Probability of the observation sequence:\", prob_observation)\n",
533
- "\n",
534
- "# Step 9: Visualize the HMM\n",
535
- "G = nx.DiGraph()\n",
536
- "\n",
537
- "# Add nodes with state names\n",
538
- "for state in states:\n",
539
- " G.add_node(state, shape='circle')\n",
540
- "\n",
541
- "# Add edges with transition probabilities\n",
542
- "for i in range(len(states)):\n",
543
- " for j in range(len(states)):\n",
544
- " if transition_matrix[i, j] > 0:\n",
545
- " G.add_edge(states[i], states[j], weight=transition_matrix[i, j])\n",
546
- "\n",
547
- "# Draw the graph\n",
548
- "pos = nx.spring_layout(G)\n",
549
- "edges = G.edges(data=True)\n",
550
- "nx.draw(G, pos, with_labels=True, node_size=2000, node_color='lightblue', font_size=10, font_weight='bold', arrows=True)\n",
551
- "nx.draw_networkx_edge_labels(G, pos, edge_labels={(u, v): f'{d[\"weight\"]:.2f}' for u, v, d in edges})\n",
552
- "\n",
553
- "plt.title(\"Hidden Markov Model Network\")\n",
554
- "plt.show()\n"
555
- ]
556
- },
557
- {
558
- "cell_type": "code",
559
- "execution_count": 3,
560
- "id": "d95b96f8-271c-4a26-9b9c-5e23dccead23",
561
- "metadata": {},
562
- "outputs": [
563
- {
564
- "name": "stdin",
565
- "output_type": "stream",
566
- "text": [
567
- "Enter the states (comma-separated): cp,ip\n",
568
- "Enter the possible observations (comma-separated): lem,icet,cola\n",
569
- "Enter the observation sequence as space-separated names (options: ['lem', 'icet', 'cola']): lem icet cola\n"
570
- ]
571
- },
572
- {
573
- "name": "stdout",
574
- "output_type": "stream",
575
- "text": [
576
- "\n",
577
- "Enter the state transition probabilities:\n"
578
- ]
579
- },
580
- {
581
- "name": "stdin",
582
- "output_type": "stream",
583
- "text": [
584
- "P(cp | cp): 0.7\n",
585
- "P(ip | cp): 0.5\n",
586
- "P(cp | ip): 0.3\n",
587
- "P(ip | ip): 0.5\n"
588
- ]
589
- },
590
- {
591
- "name": "stdout",
592
- "output_type": "stream",
593
- "text": [
594
- "\n",
595
- "Enter the emission probabilities:\n"
596
- ]
597
- },
598
- {
599
- "name": "stdin",
600
- "output_type": "stream",
601
- "text": [
602
- "P(lem | cp): 0.3\n",
603
- "P(icet | cp): 0.1\n",
604
- "P(cola | cp): 0.6\n",
605
- "P(lem | ip): 0.2\n",
606
- "P(icet | ip): 0.7\n",
607
- "P(cola | ip): 0.1\n"
608
- ]
609
- },
610
- {
611
- "name": "stdout",
612
- "output_type": "stream",
613
- "text": [
614
- "\n",
615
- "Enter the initial state probabilities (comma-separated):\n"
616
- ]
617
- },
618
- {
619
- "name": "stdin",
620
- "output_type": "stream",
621
- "text": [
622
- "Enter initial probabilities for ['cp', 'ip']: 1.0,0.0\n"
623
- ]
624
- },
625
- {
626
- "name": "stdout",
627
- "output_type": "stream",
628
- "text": [
629
- "\n",
630
- "Forward Matrix:\n",
631
- " [[0.3 0.021 0.02772]\n",
632
- " [0. 0.105 0.0063 ]]\n",
633
- "Probability of the observation sequence: 0.034019999999999995\n"
634
- ]
635
- }
636
- ],
637
- "source": [
638
- "import numpy as np\n",
639
- "\n",
640
- "# Step 1: Define states and observations based on user input\n",
641
- "states = list(map(str.strip, input(\"Enter the states (comma-separated): \").split(',')))\n",
642
- "observations = list(map(str.strip, input(\"Enter the possible observations (comma-separated): \").split(',')))\n",
643
- "\n",
644
- "# Step 2: Get user input for the observation sequence\n",
645
- "observation_seq = list(map(str.strip, input(f\"Enter the observation sequence as space-separated names (options: {observations}): \").split()))\n",
646
- "\n",
647
- "# Step 3: Convert observation sequence to indices\n",
648
- "try:\n",
649
- " observation_indices = [observations.index(obs) for obs in observation_seq]\n",
650
- "except ValueError as e:\n",
651
- " print(f\"Error: {e}. Please make sure your observation sequence contains only valid options: {observations}.\")\n",
652
- " exit()\n",
653
- "\n",
654
- "# Step 4: Get user input for the transition matrix\n",
655
- "print(\"\\nEnter the state transition probabilities:\")\n",
656
- "transition_matrix = np.zeros((len(states), len(states)))\n",
657
- "for i in range(len(states)):\n",
658
- " for j in range(len(states)):\n",
659
- " transition_matrix[i, j] = float(input(f\"P({states[j]} | {states[i]}): \"))\n",
660
- "\n",
661
- "# Step 5: Get user input for the emission matrix\n",
662
- "print(\"\\nEnter the emission probabilities:\")\n",
663
- "emission_matrix = np.zeros((len(states), len(observations)))\n",
664
- "for i in range(len(states)):\n",
665
- " for j in range(len(observations)):\n",
666
- " emission_matrix[i, j] = float(input(f\"P({observations[j]} | {states[i]}): \"))\n",
667
- "\n",
668
- "# Step 6: Set initial state probabilities (ask the user to input them)\n",
669
- "initial_probabilities = np.zeros(len(states))\n",
670
- "print(\"\\nEnter the initial state probabilities (comma-separated):\")\n",
671
- "initial_probabilities = list(map(float, input(f\"Enter initial probabilities for {states}: \").split(',')))\n",
672
- "\n",
673
- "# Step 7: Forward Procedure\n",
674
- "def forward_procedure(observation_seq, transition_matrix, emission_matrix, initial_probabilities):\n",
675
- " num_states = len(transition_matrix)\n",
676
- " num_observations = len(observation_seq)\n",
677
- " \n",
678
- " # Initialize the forward matrix\n",
679
- " forward_matrix = np.zeros((num_states, num_observations))\n",
680
- " \n",
681
- " # Initialization step\n",
682
- " for i in range(num_states):\n",
683
- " forward_matrix[i, 0] = initial_probabilities[i] * emission_matrix[i, observation_seq[0]]\n",
684
- " \n",
685
- " # Recursion step\n",
686
- " for t in range(1, num_observations):\n",
687
- " for j in range(num_states):\n",
688
- " forward_matrix[j, t] = sum(forward_matrix[i, t - 1] * transition_matrix[i, j] for i in range(num_states)) * emission_matrix[j, observation_seq[t]]\n",
689
- " \n",
690
- " # Termination step\n",
691
- " prob_observation = sum(forward_matrix[i, num_observations - 1] for i in range(num_states))\n",
692
- " \n",
693
- " return forward_matrix, prob_observation\n",
694
- "\n",
695
- "# Step 8: Compute the forward matrix and the probability of the observation sequence\n",
696
- "forward_matrix, prob_observation = forward_procedure(observation_indices, transition_matrix, emission_matrix, initial_probabilities)\n",
697
- "\n",
698
- "# Display the results\n",
699
- "print(\"\\nForward Matrix:\\n\", forward_matrix)\n",
700
- "print(\"Probability of the observation sequence:\", prob_observation)"
701
- ]
702
- },
703
- {
704
- "cell_type": "code",
705
- "execution_count": 10,
706
- "id": "c6078aa1-2549-47b6-aa50-3659e2daf554",
707
- "metadata": {},
708
- "outputs": [
709
- {
710
- "name": "stdout",
711
- "output_type": "stream",
712
- "text": [
713
- "['Hello', 'this', 'is', 'a', 'check']\n"
714
- ]
715
- }
716
- ],
717
- "source": [
718
- "x = \"Hello this is a check\"\n",
719
- "print(x.split())"
720
- ]
721
- },
722
- {
723
- "cell_type": "code",
724
- "execution_count": null,
725
- "id": "9ace9f9a-7725-42c6-ae7a-f289c9eb81ac",
726
- "metadata": {},
727
- "outputs": [],
728
- "source": []
729
- }
730
- ],
731
- "metadata": {
732
- "kernelspec": {
733
- "display_name": "Python 3 (ipykernel)",
734
- "language": "python",
735
- "name": "python3"
736
- },
737
- "language_info": {
738
- "codemirror_mode": {
739
- "name": "ipython",
740
- "version": 3
741
- },
742
- "file_extension": ".py",
743
- "mimetype": "text/x-python",
744
- "name": "python",
745
- "nbconvert_exporter": "python",
746
- "pygments_lexer": "ipython3",
747
- "version": "3.11.7"
748
- }
749
- },
750
- "nbformat": 4,
751
- "nbformat_minor": 5
752
- }