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.
- noshot/data/ML TS XAI/ML/1. PCA - EDA/PCA-EDA.ipynb +207 -0
- noshot/data/ML TS XAI/ML/1. PCA - EDA/balance-scale.csv +626 -0
- noshot/data/ML TS XAI/ML/1. PCA - EDA/input.txt +625 -0
- noshot/data/ML TS XAI/ML/2. KNN Classifier/KNN.ipynb +287 -0
- noshot/data/ML TS XAI/ML/2. KNN Classifier/balance-scale.csv +626 -0
- noshot/data/ML TS XAI/ML/2. KNN Classifier/input.txt +625 -0
- noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/LDA.ipynb +83 -0
- noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/balance-scale.csv +626 -0
- noshot/data/ML TS XAI/ML/3. Linear Discriminant Analysis/input.txt +625 -0
- noshot/data/ML TS XAI/ML/4. Linear Regression/Linear-Regression.ipynb +117 -0
- noshot/data/ML TS XAI/ML/4. Linear Regression/machine-data.csv +210 -0
- noshot/data/ML TS XAI/ML/5. Logistic Regression/Logistic-Regression.ipynb +137 -0
- noshot/data/ML TS XAI/ML/5. Logistic Regression/wine-dataset.csv +179 -0
- noshot/data/ML TS XAI/ML/6. Bayesian Classifier/Bayesian.ipynb +129 -0
- noshot/data/ML TS XAI/ML/6. Bayesian Classifier/wine-dataset.csv +179 -0
- noshot/data/ML TS XAI/TS/1. EDA - Handling Time Series Data/Handling TS Data.ipynb +784 -0
- noshot/data/ML TS XAI/TS/1. EDA - Handling Time Series Data/raw_sales.csv +29581 -0
- noshot/data/ML TS XAI/TS/2. Feature Engineering/Feature Engineering-.ipynb +1445 -0
- noshot/data/ML TS XAI/TS/3. Temporal Relationships/Exploring Temporal Relationships.ipynb +603 -0
- noshot/data/ML TS XAI/TS/4. Up-Down-Sampling and Interploation/Up-Down-Sampling.ipynb +721 -0
- noshot/data/ML TS XAI/TS/4. Up-Down-Sampling and Interploation/shampoo_sales.csv +37 -0
- noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/Stationarity-Trend-Seasonality.ipynb +392 -0
- noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/daily-min-temperatures.csv +3651 -0
- noshot/data/ML TS XAI/TS/5. Stationarity - Trend - Seasonality/daily-total-female-births.csv +366 -0
- noshot/data/ML TS XAI/TS/6. Autocorrelation - Partial Autocorrelation/ACF-PACF.ipynb +175 -0
- noshot/data/ML TS XAI/TS/6. Autocorrelation - Partial Autocorrelation/daily-min-temperatures.csv +3651 -0
- {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/METADATA +2 -2
- noshot-0.1.9.dist-info/RECORD +35 -0
- noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(A) Breadth First Search.ipynb +0 -112
- noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(B) Depth First Search.ipynb +0 -111
- noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(C) Uniform Cost Search.ipynb +0 -134
- noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(D) Depth Limites Search.ipynb +0 -115
- noshot/data/ML TS XAI/AIDS/1. Implement Basic Search Strategies/(E) Iterative Deepening DFS.ipynb +0 -123
- noshot/data/ML TS XAI/AIDS/10. ANOVA/2_ANOVA.csv +0 -769
- noshot/data/ML TS XAI/AIDS/10. ANOVA/One Way ANOVA (Repeated Measure).ipynb +0 -126
- noshot/data/ML TS XAI/AIDS/10. ANOVA/One Way ANOVA.ipynb +0 -134
- noshot/data/ML TS XAI/AIDS/10. ANOVA/Sample 1 Way ANOVA Test.ipynb +0 -119
- noshot/data/ML TS XAI/AIDS/10. ANOVA/Two Way ANOVA.ipynb +0 -138
- noshot/data/ML TS XAI/AIDS/10. ANOVA/reaction_time.csv +0 -5
- noshot/data/ML TS XAI/AIDS/10. ANOVA/sample_data.csv +0 -16
- noshot/data/ML TS XAI/AIDS/10. ANOVA/sleep_deprivation.csv +0 -4
- noshot/data/ML TS XAI/AIDS/11. Linear Regression/3_Linear.csv +0 -4802
- noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression LAB.ipynb +0 -113
- noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression New- sklearn.ipynb +0 -118
- noshot/data/ML TS XAI/AIDS/11. Linear Regression/Linear Regression.ipynb +0 -148
- noshot/data/ML TS XAI/AIDS/11. Linear Regression/house_rate.csv +0 -22
- noshot/data/ML TS XAI/AIDS/12. Logistic Regression/Logistic Regression New- sklearn.ipynb +0 -128
- noshot/data/ML TS XAI/AIDS/12. Logistic Regression/Logistic Regression.ipynb +0 -145
- noshot/data/ML TS XAI/AIDS/12. Logistic Regression/default.csv +0 -1001
- noshot/data/ML TS XAI/AIDS/12. Logistic Regression/hours_scores_records.csv +0 -101
- noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(A) Astar.ipynb +0 -256
- noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(B) IDAstar.ipynb +0 -157
- noshot/data/ML TS XAI/AIDS/2. Implement A Star And MA Star/(C) SMAstar.ipynb +0 -178
- noshot/data/ML TS XAI/AIDS/3. Genetic Algorithm/Genetic.ipynb +0 -95
- noshot/data/ML TS XAI/AIDS/4. Simulated Annealing/Simulated Annealing.ipynb +0 -74
- noshot/data/ML TS XAI/AIDS/4. Simulated Annealing/Sudoku Simulated Annealing.ipynb +0 -103
- noshot/data/ML TS XAI/AIDS/5. Alpha Beta Pruning/AlphaBetaPruning.ipynb +0 -182
- noshot/data/ML TS XAI/AIDS/6. Consraint Satisfaction Problems (CSP)/(A) CSP House Allocation.ipynb +0 -120
- noshot/data/ML TS XAI/AIDS/6. Consraint Satisfaction Problems (CSP)/(B) CSP Map Coloring.ipynb +0 -125
- noshot/data/ML TS XAI/AIDS/7. Random Sampling/Random Sampling.ipynb +0 -73
- noshot/data/ML TS XAI/AIDS/7. Random Sampling/height_weight_bmi.csv +0 -8389
- noshot/data/ML TS XAI/AIDS/8. Z Test/Z Test Hash Function.ipynb +0 -141
- noshot/data/ML TS XAI/AIDS/8. Z Test/Z Test.ipynb +0 -151
- noshot/data/ML TS XAI/AIDS/8. Z Test/height_weight_bmi.csv +0 -8389
- noshot/data/ML TS XAI/AIDS/9. T Test/1_heart.csv +0 -304
- noshot/data/ML TS XAI/AIDS/9. T Test/Independent T Test.ipynb +0 -119
- noshot/data/ML TS XAI/AIDS/9. T Test/Paired T Test.ipynb +0 -118
- noshot/data/ML TS XAI/AIDS/9. T Test/T Test Hash Function.ipynb +0 -142
- noshot/data/ML TS XAI/AIDS/9. T Test/T Test.ipynb +0 -158
- noshot/data/ML TS XAI/AIDS/9. T Test/height_weight_bmi.csv +0 -8389
- noshot/data/ML TS XAI/AIDS/9. T Test/iq_test.csv +0 -0
- noshot/data/ML TS XAI/AIDS/Others (AllinOne)/All In One.ipynb +0 -4581
- noshot/data/ML TS XAI/CN/1. Chat Application/chat.java +0 -81
- noshot/data/ML TS XAI/CN/1. Chat Application/output.png +0 -0
- noshot/data/ML TS XAI/CN/1. Chat Application/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/LAN.tcl +0 -65
- noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/analysis.awk +0 -44
- noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/output.png +0 -0
- noshot/data/ML TS XAI/CN/10. Ethernet LAN IEEE 802.3/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/complexdcf.tcl +0 -229
- noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/output.png +0 -0
- noshot/data/ML TS XAI/CN/11. Wireless LAN IEEE 802.11/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/2. File Transfer/file_to_send.txt +0 -2
- noshot/data/ML TS XAI/CN/2. File Transfer/filetransfer.java +0 -119
- noshot/data/ML TS XAI/CN/2. File Transfer/output.png +0 -0
- noshot/data/ML TS XAI/CN/2. File Transfer/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/Client.class +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/MyServerImpl.class +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/MyServerIntf.class +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/Server.class +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/output.png +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/3. RMI (Remote Method Invocation)/rmi.java +0 -56
- noshot/data/ML TS XAI/CN/4. Wired Network/output.png +0 -0
- noshot/data/ML TS XAI/CN/4. Wired Network/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/4. Wired Network/wired.awk +0 -25
- noshot/data/ML TS XAI/CN/4. Wired Network/wired.tcl +0 -81
- noshot/data/ML TS XAI/CN/5. Wireless Network/output.png +0 -0
- noshot/data/ML TS XAI/CN/5. Wireless Network/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/5. Wireless Network/wireless.awk +0 -27
- noshot/data/ML TS XAI/CN/5. Wireless Network/wireless.tcl +0 -153
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/analysis.awk +0 -27
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/output.png +0 -0
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/sack.tcl +0 -86
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Sack And Vegas/vegas.tcl +0 -86
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/analysis.awk +0 -28
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/output.png +0 -0
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/reno.tcl +0 -78
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Congestion Control/Tahoe And Reno/tahoe.tcl +0 -79
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/analysis.awk +0 -27
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/flow.tcl +0 -163
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/TCP Flow Control/output.png +0 -0
- noshot/data/ML TS XAI/CN/6. TCP Flow And Congestion Control/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/DV.tcl +0 -111
- noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/LS.tcl +0 -106
- noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/analysis.awk +0 -36
- noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/output.png +0 -0
- noshot/data/ML TS XAI/CN/7. Link State And Distance Vector Routing/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/analysis.awk +0 -20
- noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/broadcast.tcl +0 -76
- noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/multicast.tcl +0 -103
- noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/output.png +0 -0
- noshot/data/ML TS XAI/CN/8. Multicast And Broadcast Routing/procedure.png +0 -0
- noshot/data/ML TS XAI/CN/9. DHCP/DHCP.java +0 -125
- noshot/data/ML TS XAI/CN/9. DHCP/output.png +0 -0
- noshot/data/ML TS XAI/CN/9. DHCP/procedure.png +0 -0
- noshot/data/ML TS XAI/NLP/NLP 1/1-Prereqs.py +0 -18
- noshot/data/ML TS XAI/NLP/NLP 1/2-Chi2test.py +0 -83
- noshot/data/ML TS XAI/NLP/NLP 1/2-T-test.py +0 -79
- noshot/data/ML TS XAI/NLP/NLP 1/3-WSD-nb.py +0 -53
- noshot/data/ML TS XAI/NLP/NLP 1/4-Hindle-Rooth.py +0 -53
- noshot/data/ML TS XAI/NLP/NLP 1/5-HMM-Trellis.py +0 -82
- noshot/data/ML TS XAI/NLP/NLP 1/6-HMM-Viterbi.py +0 -16
- noshot/data/ML TS XAI/NLP/NLP 1/7-PCFG-parsetree.py +0 -15
- noshot/data/ML TS XAI/NLP/NLP 1/Chi2test.ipynb +0 -285
- noshot/data/ML TS XAI/NLP/NLP 1/Hindle-Rooth.ipynb +0 -179
- noshot/data/ML TS XAI/NLP/NLP 1/Lab 10 - Text generator using LSTM.ipynb +0 -1461
- noshot/data/ML TS XAI/NLP/NLP 1/Lab 11 NMT.ipynb +0 -2307
- noshot/data/ML TS XAI/NLP/NLP 1/PCFG.ipynb +0 -134
- noshot/data/ML TS XAI/NLP/NLP 1/Prereqs.ipynb +0 -131
- noshot/data/ML TS XAI/NLP/NLP 1/T test.ipynb +0 -252
- noshot/data/ML TS XAI/NLP/NLP 1/TFIDF BOW.ipynb +0 -171
- noshot/data/ML TS XAI/NLP/NLP 1/Trellis.ipynb +0 -244
- noshot/data/ML TS XAI/NLP/NLP 1/WSD.ipynb +0 -645
- noshot/data/ML TS XAI/NLP/NLP 1/Word2Vec.ipynb +0 -93
- noshot/data/ML TS XAI/NLP/NLP 2/Lab01(tokenizer)/tokenizer.ipynb +0 -370
- noshot/data/ML TS XAI/NLP/NLP 2/Lab01(tokenizer)/training_tokenizer.txt +0 -6
- noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/exp0.ipynb +0 -274
- noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/lab2.ipynb +0 -905
- noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/test.txt +0 -1
- noshot/data/ML TS XAI/NLP/NLP 2/Lab02(stemming)/tokenizing.ipynb +0 -272
- noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/collocation.ipynb +0 -332
- noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/lab3.ipynb +0 -549
- noshot/data/ML TS XAI/NLP/NLP 2/Lab03(parse-tree)/nlp.txt +0 -1
- noshot/data/ML TS XAI/NLP/NLP 2/Lab04(collocation)/Lab4-NLP-Exp-2.ipynb +0 -817
- noshot/data/ML TS XAI/NLP/NLP 2/Lab04(collocation)/collocation.ipynb +0 -332
- noshot/data/ML TS XAI/NLP/NLP 2/Lab05(WSD)/NLP-Lab-5-Exp3.ipynb +0 -231
- noshot/data/ML TS XAI/NLP/NLP 2/Lab05(WSD)/word-sense-disambiguation.ipynb +0 -507
- noshot/data/ML TS XAI/NLP/NLP 2/Lab06(additional-exercise)/lab6.ipynb +0 -134
- noshot/data/ML TS XAI/NLP/NLP 2/Lab07(HMM,Viterbi)/NLP Exp 4.ipynb +0 -255
- noshot/data/ML TS XAI/NLP/NLP 2/Lab07(HMM,Viterbi)/NLP_Exp_5.ipynb +0 -159
- noshot/data/ML TS XAI/NLP/NLP 2/Lab08(PCFG)/PCFG.ipynb +0 -282
- noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/Lab 9 - MLP classifier.ipynb +0 -670
- noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/MLP-alternative-code.ipynb +0 -613
- noshot/data/ML TS XAI/NLP/NLP 2/Lab09-Hindle-rooth&MLP/hindle-rooth-algorithm.ipynb +0 -74
- noshot/data/ML TS XAI/NLP/NLP 2/Lab10(LSTM)/Lab_10_Text_generator_using_LSTM.ipynb +0 -480
- noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/Machine-translation.ipynb +0 -445
- noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/Viterbi-PCFG.ipynb +0 -105
- noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/corpora_tools.py +0 -87
- noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/data_utils.py +0 -11
- noshot/data/ML TS XAI/NLP/NLP 2/Lab11(Viterbi-PCFG,Machine-translation)/train_translator.py +0 -83
- noshot/data/ML TS XAI/NLP/NLP 2/Lab12(Information-Extraction)/Information_Extraction.ipynb +0 -201
- noshot/data/ML TS XAI/NLP/NLP 3/Backtrack-without-Verbitri.ipynb +0 -185
- noshot/data/ML TS XAI/NLP/NLP 3/Backward-Procedure.ipynb +0 -597
- noshot/data/ML TS XAI/NLP/NLP 3/Bag_of.ipynb +0 -1422
- noshot/data/ML TS XAI/NLP/NLP 3/CYK-algorithm.ipynb +0 -1067
- noshot/data/ML TS XAI/NLP/NLP 3/Forward-Procedure.ipynb +0 -477
- noshot/data/ML TS XAI/NLP/NLP 3/LSTM.ipynb +0 -1290
- noshot/data/ML TS XAI/NLP/NLP 3/Lab 10 - Text generator using LSTM.ipynb +0 -1461
- noshot/data/ML TS XAI/NLP/NLP 3/Lab 11 NMT.ipynb +0 -2307
- noshot/data/ML TS XAI/NLP/NLP 3/NLP-LAB-4.ipynb +0 -216
- noshot/data/ML TS XAI/NLP/NLP 3/NLP-LAB-5.ipynb +0 -216
- noshot/data/ML TS XAI/NLP/NLP 3/abc.txt +0 -6
- noshot/data/ML TS XAI/NLP/NLP 3/ex-1-nltk.ipynb +0 -711
- noshot/data/ML TS XAI/NLP/NLP 3/ex-2-nlp.ipynb +0 -267
- noshot/data/ML TS XAI/NLP/NLP 3/exp8&9.ipynb +0 -305
- noshot/data/ML TS XAI/NLP/NLP 3/hind.ipynb +0 -287
- noshot/data/ML TS XAI/NLP/NLP 3/lab66.ipynb +0 -752
- noshot/data/ML TS XAI/NLP/NLP 3/leb_3.ipynb +0 -612
- noshot/data/ML TS XAI/NLP/NLP 3/naive_bayes_classifier.pkl +0 -0
- noshot/data/ML TS XAI/NLP/NLP 3/nlp_leb_1.ipynb +0 -3008
- noshot/data/ML TS XAI/NLP/NLP 3/nlp_leb_2.ipynb +0 -3095
- noshot/data/ML TS XAI/NLP/NLP 3/nlplab-9.ipynb +0 -295
- noshot/data/ML TS XAI/NLP/NLP 3/nltk-ex-4.ipynb +0 -506
- noshot/data/ML TS XAI/NLP/NLP 3/text1.txt +0 -48
- noshot/data/ML TS XAI/NLP/NLP 3/text2.txt +0 -8
- noshot/data/ML TS XAI/NLP/NLP 3/text3.txt +0 -48
- noshot/data/ML TS XAI/NLP/NLP 3/translation-rnn.ipynb +0 -812
- noshot/data/ML TS XAI/NLP/NLP 3/word2vector.ipynb +0 -173
- noshot/data/ML TS XAI/NLP/NLP 4/Backward Procedure Algorithm.ipynb +0 -179
- noshot/data/ML TS XAI/NLP/NLP 4/Chi Square Collocation.ipynb +0 -208
- noshot/data/ML TS XAI/NLP/NLP 4/Collocation (T test).ipynb +0 -188
- noshot/data/ML TS XAI/NLP/NLP 4/Experiment 1.ipynb +0 -437
- noshot/data/ML TS XAI/NLP/NLP 4/Forward Procedure Algorithm.ipynb +0 -132
- noshot/data/ML TS XAI/NLP/NLP 4/Hindle Rooth.ipynb +0 -414
- noshot/data/ML TS XAI/NLP/NLP 4/MachineTranslation.ipynb +0 -368
- noshot/data/ML TS XAI/NLP/NLP 4/Multi Layer Perceptron using MLPClassifier.ipynb +0 -86
- noshot/data/ML TS XAI/NLP/NLP 4/Multi Layer Perceptron using Tensorflow.ipynb +0 -112
- noshot/data/ML TS XAI/NLP/NLP 4/PCFG Inside Probability.ipynb +0 -451
- noshot/data/ML TS XAI/NLP/NLP 4/Text Generation using LSTM.ipynb +0 -297
- noshot/data/ML TS XAI/NLP/NLP 4/Viterbi.ipynb +0 -310
- noshot/data/ML TS XAI/NLP/NLP 4/Word Sense Disambiguation.ipynb +0 -335
- noshot/data/ML TS XAI/NLP/NLP 5/10.Text Generation using LSTM.ipynb +0 -316
- noshot/data/ML TS XAI/NLP/NLP 5/11.Machine Translation.ipynb +0 -868
- noshot/data/ML TS XAI/NLP/NLP 5/2.T and Chi2 Test.ipynb +0 -204
- noshot/data/ML TS XAI/NLP/NLP 5/3.Word Sense Diambiguation.ipynb +0 -234
- noshot/data/ML TS XAI/NLP/NLP 5/4.Hinddle and Rooth.ipynb +0 -128
- noshot/data/ML TS XAI/NLP/NLP 5/5.Forward and Backward.ipynb +0 -149
- noshot/data/ML TS XAI/NLP/NLP 5/6.Viterbi.ipynb +0 -111
- noshot/data/ML TS XAI/NLP/NLP 5/7.PCFG Parse Tree.ipynb +0 -134
- noshot/data/ML TS XAI/NLP/NLP 5/7.PCFG using cyk.ipynb +0 -101
- noshot/data/ML TS XAI/NLP/NLP 5/8.Bag of words and TF-IDF.ipynb +0 -310
- noshot/data/ML TS XAI/NLP/NLP 5/9.Word2Vector.ipynb +0 -78
- noshot/data/ML TS XAI/NLP/NLP 5/NLP ALL In One.ipynb +0 -2619
- noshot/data/ML TS XAI/NLP/NLP 5/sample1.txt +0 -15
- noshot/data/ML TS XAI/NLP/NLP 5/sample2.txt +0 -4
- noshot/data/ML TS XAI/NLP/NLP 5/word2vec_model.bin +0 -0
- noshot/data/ML TS XAI/NLP/NLP 6/1. Tokenize, Tagging, NER, Parse Tree.ipynb +0 -312
- noshot/data/ML TS XAI/NLP/NLP 6/2. T Test and Chi2 Test.ipynb +0 -185
- noshot/data/ML TS XAI/NLP/NLP 6/3. Naive Bayes WSD.ipynb +0 -199
- noshot/data/ML TS XAI/NLP/NLP 6/4. Hinddle and Rooth.ipynb +0 -151
- noshot/data/ML TS XAI/NLP/NLP 6/5 and 6 FWD, BWD, Viterbi.ipynb +0 -164
- noshot/data/ML TS XAI/NLP/NLP 6/7. PCFG using CYK.ipynb +0 -383
- noshot/data/ML TS XAI/NLP/NLP 6/8. BOW and TF-IDF.ipynb +0 -252
- noshot/data/ML TS XAI/Ubuntu CN Lab.iso +0 -0
- noshot-0.1.7.dist-info/RECORD +0 -216
- {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/LICENSE.txt +0 -0
- {noshot-0.1.7.dist-info → noshot-0.1.9.dist-info}/WHEEL +0 -0
- {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+vr5VUL25CJQAAACSJk6cqGeffVaffvqpxowZU6mvPXfuXN1///0aMGCApk+ffl3h1J4RKAEAgMvbuHGjOnfurL/85S+aMGFClRzjhx9+0NChQ/X+++/rr3/9a5UcwywESgAA4NIKCwt1yy23yMPDQ6tXr1bNmjUvua/NMJRXVKJimyGbce7LzWKRm8UidzeLfDxqyO0y3cdnn31WH374oZYtW6YuXbpUxemYgkAJAABc2tSpUzVq1Cht2LBB7du3L91uMwydPlus7LNFyi4oUmZ+kU6fLdLllta4SQqo6aHa3h4K8vJQUE0PBdR0Lw2ZRUVF6ty5s/z9/WW1Wp1m6JtACQAAXJbNZlO7du10ww03lF5zMjO/UHuz83ToTL5s/0tJFknXEpgu3N/NIjXy91Z4LR/V8vLU3LlzFRcXp6SkJPXu3bsSz8Y8BEoAAOCy4uPjNXDgQFlTl6pJu47ak5WrU2eLrzlAXsn51wus6a7wIB/dPyBGNdwsWrZsWSUexTwESgAA4LJGPvywgm5so15Dh6vYVn2RyCgp1g9ffKR/PPEn3dT8xmo7blUhUAIAAJd0IrdAP6zapHqhobJYqv9eLzZbiUry89S3VTPV9vas9uNXJgIlAABwKSU2Q1tPnNGuzByVlJSohon32raVlMitRg01r+Wr1nX9VcPNMRfpECgBAIDLyMwv1Nqj2cotKjG7lHJ8PWqoU4Mgh+xWEigBAIBLOHwmX2uOZEuq3AU3leV8b7JzwyCF+nubWsu1IlACAACnty87T+uPnTK7jKvWMSRQzQJ9zC7jqlX/DFQAAIBq5GhhUpLWp5/SvlN5Zpdx1QiUAADAaR0+k+9wYfK89emndPhMvtllXBUCJQAAcEqZ+YWlcyYd1Zoj2crMLzS7jCsiUAIAAKdTYjO09mi22WVUirVHs1VSjRddvx4ESgAA4HS2njij3KISu1zNfS0MSblFJdp64ozZpVwWgRIAADiVk/mF2pWVa3YZlWpXVq5dD30TKAEAgNMosRladzRbjnm/mUuzyL6HvgmUAADAaWzPzHGKoe7fOz/0vT0zx+xSLopACQAAnEKJzdAeJxvq/r09Wbl22aUkUAIAAKdw6Ey+iu0wbFWmYpuhQ3Z4bUoCJQAAcAq7nbw7eZ49nieBEgAAOLzM/EKdOltsdhnV4tTZYrtb8U2gBAAADm9vdp7Trey+FIvOna89IVACAACHZjPOzSt07tmT/8fQufmiNsN+zphACQAAHNrps8Vy8rU45dgM6YwdDfETKAEAgEPLPltkdgmmyLKj8yZQAgAAh5ZdUOQy8yfPs+jcedsLAiUAAHBomflFLjN/8jxD587bXribXQAAAMD1shmGTlXx0K9hGEr47islzZymw3v3yK1GDTUKb67Rr72jeV/9R0tmz1CbTl11e8wAzZn8mU6dPKm2Xbpp9GvvqG6D0Cqr6/TZItkMQ24W8/uzBEoAAOCw8qrhvt1fvvE3LZg2RZLkH1RLQfWCtW/7VmUcPli6z86N67Vr868KDm2szGPp+nVpiv75+MN6Z9ZCWaoo8Nl07vz9PM2Pcwx5AwAAh1XVt1rMOHRQC7+dKknq0neA/p36q96fm6JJ1l8U3qZd6X4lJcX658wF+mC+VY/+fbwkae/WzdqwbEmV1mcvt5okUAIAAIdV1ddi3P3bBhn/O0bcqD/Jw9NTkhRYu06Z4eymLVqpSfMWkqQegwaXbt+/c1uV1mcv16IkUAIAAIdlL4HKYtI6c3s5fwIlAABwWFW9IOXGth1K50DO++o/Kio8dw/tM1mZOpl+pHS//Tu36cCuHZKk5fE/l25velOrKq3PHhbkSCzKAQAADqyqA1Vwo8aKHTZSC6ZN0cqEedqyZoWC6gbr6P40PT3x09L9PDw99cLQ/gpu1ERH9u6WJIW1aqMOPaKqtD57CZR0KAEAgMNyd6v6QPXI397Qo39/S2Gt2qggL08Zhw+oaYtWCg5tXLpPeJv2GvXSayrIy1UNdw+17x6p5z+eUmUrvM+rjvO/GnQoAQCAw/LxqCGLVKWXDrJYLIodNlKxw0Zedr+Yex9QzL0PVGElZbnp3PnbAzqUAADAYblZLAqs6WF2GaYIqOnBkDcAAEBlqO3t4ZL38q7tbT9B2mIYdrLeHAAA4DrsO5Wn9emnzC6j2nUMCVSzQB+zy5BEhxIAADi4IBcd8q5lR+dNoAQAAA4toKa77GSxc7Vxs0j+Ne1nbTWBEgAAODQ3i0WN/L1dZh6lRVIjf2+7WZAjESgBAIATuCHIp0ovHWRPDEnhtexj7uR5BEoAAODwant7KtCOhoCrUmBNd9Xy8jS7jDIIlAAAwCncWMvX7BKqhT2eJ4ESAAA4hUb+3nZzK8Kq4u52br6ovSFQAgAAp1DDzaJwO+zeVabwWr6qYYehmUAJAACcRsvafvL93/29nYlFkq9HDbWs7Wd2KRdFoAQAAE6jhptFN3pJNsNmdimVypDUqUGQXXYnJck1lkMBAACnk5ubq40bN2rbtm3atm2btm7dqlWrVikrK0sjnv+77hj1mCx2dK3Gimhey1e1ve1rZfeFCJQAAMAh3XHHHUpJSZEkeXh4qKioqPSxW0Lrys/TXXlFJQ59fUqLJB+PGmpd19/sUi6LIW8AAOCQhg0bVvr/LwyTPXv21F+f/Is6NQgyoarKZ89D3edZDMNw5OAOAABclGEYuvHGG7V3794y21etWqUuXbpIkg6fydfqI9kmVFc5ujQMUqgdXibo9+hQAgAAh3PkyJHSMOnm5iY3Nze5u7srLi6uNExKUqi/tzqGBJpY6fXrGBLoEGFSIlACAAAH8+WXX6pp06bau3evHn30US1atEiGYaikpERvvfVWuf2bBfo4XKjsGBKoZoH2db/uy2FRDgAAcAiFhYUaOHCgkpKS5Ovrq4SEBPXq1UuS9OGHH+r06dNq06bNRZ/bLNBHHm4Wrfnf8Lc9zvc7P0uys4MMc1+IOZQAAMDurVy5Uv3799epU6fUvXt3JSYmysfn2jt4mfmFWns0W7lFJVVQZcX4etRQpwZBdn15oEthyBsAANi1p59+Wt27d1dOTo4+/PBDLVu27LrCpCTV9vZUn2b11Px/t2g0e+30+eM3r+WrPs3qOWSYlOhQAgAAO5Wenq6IiAjt2rVLjRs3ltVqVVhYWKW9/sn8Qq0zuVvpyF3JC9GhBAAAduerr75SkyZNtGvXLo0aNUr79u2r1DApSXX+161sUcdP7tV8nUd3N4ta1PFz6K7khehQAgAAu1FYWKi4uDglJCTIx8dHs2fPVt++fav8uCU2Q4fO5Gt3Vq5OnS2WRZW7cOf86wXVdFd4LV818ve2+4uVXwsCJQAAsAtr165VTEyMsrOz1bVrVyUlJV33XMmKyMwv1N7sPB06ky/b/1LStQbMC/d3s0iN/L0VXstHtbwcvxt5MQRKAABguueee07vvfeeLBaL3nvvPT311FNmlySbYejM2WJlnS1SdkGRMvOLdPpskWyXeY6bpICaHqrt7aEgLw/Vqukh/5rucrM4TzfyYgiUAADANBkZGYqIiNCOHTsUGhoqq9Wq8PBws8u6JJthKK+oRMU2Qzbj3JebxSI3i0Xubhb5eNRw+vB4MSzKAQAApvjmm2/UqFEj7dixQyNGjNCBAwfsOkxKkpvFIj9PdwV5eai2t6fq+tRUbW9PBXl5yM/T+TuRl8KdcgAAQLUqLi5WXFycFixYIB8fH/3888+KjY01uyxUAIESAABUm3Xr1ikmJkZZWVnq3LmzFi9eLD8/P7PLQgUx5A0AAKrFSy+9pM6dO+vUqVOaMGGCVq9eTZh0EnQoAQBAlcrIyFBkZKS2b9+uBg0ayGq1qnnz5maXhUpEhxIAAFSZ7777To0bN9b27ds1fPhwHTp0iDDphOhQAgCASldcXKwhQ4Zo3rx58vb21vz58zVgwACzy0IVIVACAIBKtWHDBvXu3VuZmZm69dZblZycrICAALPLQhViyBsAAFSal19+WR07dlR2drbGjx+vdevWESZdAB1KAABQYSdOnFBUVJS2bNmikJAQLVmyRC1atDC7LFQTOpQAAKBCZsyYodDQUG3ZskX333+/Dh8+TJh0MXQoAQDAdSkuLtY999yjOXPmyMvLS3PmzFFcXJzZZcEEBEoAAHDNNm3apF69eunkyZPq2LGjUlJSmCvpwhjyBgAA1+TVV19Vhw4dlJWVpTfeeEO//PILYdLF0aEEAABXJTMzU1FRUdq8ebOCg4OVnJysNm3amF0W7AAdSgAAcEWzZs1Sw4YNtXnzZg0dOlRHjx4lTKIUgRIAAFySzWbT3XffrXvuuUeS9OOPP2rGjBlycyNC4P8w5A0AAC5qy5Ytio6O1vHjx9W+fXstWbJEQUFBZpcFO8Q/LwAAQDmvvfaabr75Zp04cUKvvvqqNmzYQJjEJdGhBAAApbKzsxUVFaWNGzeqXr16Sk5OVtu2bc0uC3aODiUAAJAkzZkzRw0aNNDGjRt11113KT09nTCJq0KgBADAxdlsNv3hD3/Q4MGDZRiGZs6cqVmzZrHwBleNIW8AAFzYtm3bFBUVpYyMDN18881asmSJateubXZZcDD80wMAABc1fvx4tW3bVsePH9e4ceO0adMmwiSuCx1KAABczOnTpxUdHa3169erTp06SkpKUocOHcwuCw6MDiUAAC5k3rx5ql+/vtavX68777xT6enphElUGIESAAAXYLPZNGzYMN1xxx2y2Wz6/vvvNXv2bLm7M1iJiuNTBACAk9uxY4eioqKUnp6u1q1by2q1qm7dumaXBSdChxIAACf2zjvvqHXr1jp27JheeuklbdmyhTCJSkeHEgAAJ5STk6Po6GitW7dOtWvX1qJFi9SxY0ezy4KTokMJAICTWbBggYKDg7Vu3ToNHDhQx44dI0yiShEoAQBwEjabTQ899JAGDBigkpISffPNN5o3bx4Lb1Dl+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
|
-
}
|