From a32635c40089e1d82de3709cbc7e04a7050308ac Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 18:48:59 +0530 Subject: [PATCH 01/99] first --- contrib/machine-learning/Random_Forest.md | 175 ++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 contrib/machine-learning/Random_Forest.md diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md new file mode 100644 index 0000000..3506a34 --- /dev/null +++ b/contrib/machine-learning/Random_Forest.md @@ -0,0 +1,175 @@ +Random Forest +Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). + +Table of Contents +Introduction +How Random Forest Works +Advantages and Disadvantages +Hyperparameters +Code Examples +Classification Example +Feature Importance +Hyperparameter Tuning +Regression Example +Conclusion +References +Introduction +Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. + +How Random Forest Works +Bootstrap Sampling: +Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. +Decision Trees: +Multiple decision trees are trained on these subsets. +Feature Selection: +At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. +Voting/Averaging: +For classification, the mode of the classes predicted by individual trees is taken (majority vote). +For regression, the average of the outputs of the individual trees is taken. +Detailed Working Mechanism +Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. +Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. +Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. +Advantages and Disadvantages +Advantages +Robustness: Reduces overfitting and generalizes well due to the law of large numbers. +Accuracy: Often provides high accuracy because of the ensemble method. +Versatility: Can be used for both classification and regression tasks. +Handles Missing Values: Can handle missing data better than many other algorithms. +Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. +Disadvantages +Complexity: More complex than individual decision trees, making interpretation difficult. +Computational Cost: Requires more computational resources due to multiple trees. +Training Time: Can be slow to train compared to simpler models, especially with large datasets. +Hyperparameters +Key Hyperparameters +n_estimators: The number of trees in the forest. +max_features: The number of features to consider when looking for the best split. +max_depth: The maximum depth of the tree. +min_samples_split: The minimum number of samples required to split an internal node. +min_samples_leaf: The minimum number of samples required to be at a leaf node. +bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. +Tuning Hyperparameters +Hyperparameter tuning can significantly improve the performance of a Random Forest model. Common techniques include Grid Search and Random Search. + +Code Examples +Classification Example +Below is a simple example of using Random Forest for a classification task with the Iris dataset. + +python +Copy code +import numpy as np +import pandas as pd +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score, classification_report + +# Load dataset +iris = load_iris() +X, y = iris.data, iris.target + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize Random Forest model +clf = RandomForestClassifier(n_estimators=100, random_state=42) + +# Train the model +clf.fit(X_train, y_train) + +# Make predictions +y_pred = clf.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +print("Classification Report:\n", classification_report(y_test, y_pred)) +Feature Importance +Random Forest provides a way to measure the importance of each feature in making predictions. + +python +Copy code +import matplotlib.pyplot as plt + +# Get feature importances +importances = clf.feature_importances_ +indices = np.argsort(importances)[::-1] + +# Print feature ranking +print("Feature ranking:") +for f in range(X.shape[1]): + print(f"{f + 1}. Feature {indices[f]} ({importances[indices[f]]})") + +# Plot the feature importances +plt.figure() +plt.title("Feature importances") +plt.bar(range(X.shape[1]), importances[indices], align='center') +plt.xticks(range(X.shape[1]), indices) +plt.xlim([-1, X.shape[1]]) +plt.show() +Hyperparameter Tuning +Using Grid Search for hyperparameter tuning. + +python +Copy code +from sklearn.model_selection import GridSearchCV + +# Define the parameter grid +param_grid = { + 'n_estimators': [100, 200, 300], + 'max_features': ['auto', 'sqrt', 'log2'], + 'max_depth': [4, 6, 8, 10, 12], + 'criterion': ['gini', 'entropy'] +} + +# Initialize the Grid Search model +grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2) + +# Fit the model +grid_search.fit(X_train, y_train) + +# Print the best parameters +print("Best parameters found: ", grid_search.best_params_) +Regression Example +Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. + +python +Copy code +import numpy as np +import pandas as pd +from sklearn.datasets import load_boston +from sklearn.ensemble import RandomForestRegressor +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error, r2_score + +# Load dataset +boston = load_boston() +X, y = boston.data, boston.target + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize Random Forest model +regr = RandomForestRegressor(n_estimators=100, random_state=42) + +# Train the model +regr.fit(X_train, y_train) + +# Make predictions +y_pred = regr.predict(X_test) + +# Evaluate the model +mse = mean_squared_error(y_test, y_pred) +r2 = r2_score(y_test, y_pred) +print(f"Mean Squared Error: {mse:.2f}") +print(f"R^2 Score: {r2:.2f}") +Conclusion +Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. + +References +Scikit-learn Random Forest Documentation +Wikipedia: Random Forest +Machine Learning Mastery: Introduction to Random Forest +Kaggle: Random Forest Guide +Towards Data Science: Understanding Random Forests \ No newline at end of file From 9e1a20de440dc20bd465e20fe2b0709241ac3595 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:19:52 +0530 Subject: [PATCH 02/99] second --- contrib/machine-learning/Random_Forest.md | 97 ++++++++++++----------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index 3506a34..8c62255 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -1,7 +1,8 @@ -Random Forest +# Random Forest + Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). -Table of Contents +## Table of Contents Introduction How Random Forest Works Advantages and Disadvantages @@ -13,51 +14,54 @@ Hyperparameter Tuning Regression Example Conclusion References -Introduction + +## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. -How Random Forest Works -Bootstrap Sampling: -Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. -Decision Trees: -Multiple decision trees are trained on these subsets. -Feature Selection: -At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. -Voting/Averaging: +## How Random Forest Works +### 1. Bootstrap Sampling: +* Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. +### 2. Decision Trees: +* Multiple decision trees are trained on these subsets. +### 3. Feature Selection: +* At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. +### 4. Voting/Averaging: For classification, the mode of the classes predicted by individual trees is taken (majority vote). For regression, the average of the outputs of the individual trees is taken. -Detailed Working Mechanism -Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. -Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. -Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. -Advantages and Disadvantages -Advantages -Robustness: Reduces overfitting and generalizes well due to the law of large numbers. -Accuracy: Often provides high accuracy because of the ensemble method. -Versatility: Can be used for both classification and regression tasks. -Handles Missing Values: Can handle missing data better than many other algorithms. -Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. -Disadvantages -Complexity: More complex than individual decision trees, making interpretation difficult. -Computational Cost: Requires more computational resources due to multiple trees. -Training Time: Can be slow to train compared to simpler models, especially with large datasets. -Hyperparameters -Key Hyperparameters -n_estimators: The number of trees in the forest. -max_features: The number of features to consider when looking for the best split. -max_depth: The maximum depth of the tree. -min_samples_split: The minimum number of samples required to split an internal node. -min_samples_leaf: The minimum number of samples required to be at a leaf node. -bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. -Tuning Hyperparameters +### Detailed Working Mechanism +* #### Step 1: Bootstrap Sampling: + Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. +* #### Step 2: Tree Construction: + Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. +#### Step 3: Aggregation: + For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. +### Advantages and Disadvantages +#### Advantages +* Robustness: Reduces overfitting and generalizes well due to the law of large numbers. +* Accuracy: Often provides high accuracy because of the ensemble method. +* Versatility: Can be used for both classification and regression tasks. +* Handles Missing Values: Can handle missing data better than many other algorithms. +* Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. +#### Disadvantages +* Complexity: More complex than individual decision trees, making interpretation difficult. +* Computational Cost: Requires more computational resources due to multiple trees. +* Training Time: Can be slow to train compared to simpler models, especially with large datasets. +### Hyperparameters +#### Key Hyperparameters +* n_estimators: The number of trees in the forest. +* max_features: The number of features to consider when looking for the best split. +* max_depth: The maximum depth of the tree. +* min_samples_split: The minimum number of samples required to split an internal node. +* min_samples_leaf: The minimum number of samples required to be at a leaf node. +* bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. +##### Tuning Hyperparameters Hyperparameter tuning can significantly improve the performance of a Random Forest model. Common techniques include Grid Search and Random Search. -Code Examples -Classification Example +### Code Examples +#### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -python -Copy code +''' import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -85,11 +89,14 @@ y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy * 100:.2f}%") print("Classification Report:\n", classification_report(y_test, y_pred)) -Feature Importance + +''' + +#### Feature Importance Random Forest provides a way to measure the importance of each feature in making predictions. -python -Copy code + +''' import matplotlib.pyplot as plt # Get feature importances @@ -108,11 +115,11 @@ plt.bar(range(X.shape[1]), importances[indices], align='center') plt.xticks(range(X.shape[1]), indices) plt.xlim([-1, X.shape[1]]) plt.show() -Hyperparameter Tuning +''' +#### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -python -Copy code +''' from sklearn.model_selection import GridSearchCV # Define the parameter grid From d138b0e6252f0cf28be7e014f8625352c4e90dd1 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:23:51 +0530 Subject: [PATCH 03/99] third --- contrib/machine-learning/Random_Forest.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index 8c62255..a3672d0 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -61,7 +61,7 @@ Hyperparameter tuning can significantly improve the performance of a Random Fore #### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -''' +``` import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -69,6 +69,7 @@ from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report + # Load dataset iris = load_iris() X, y = iris.data, iris.target @@ -90,13 +91,13 @@ accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy * 100:.2f}%") print("Classification Report:\n", classification_report(y_test, y_pred)) -''' +``` #### Feature Importance Random Forest provides a way to measure the importance of each feature in making predictions. -''' +``` import matplotlib.pyplot as plt # Get feature importances @@ -115,11 +116,11 @@ plt.bar(range(X.shape[1]), importances[indices], align='center') plt.xticks(range(X.shape[1]), indices) plt.xlim([-1, X.shape[1]]) plt.show() -''' +``` #### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -''' +``` from sklearn.model_selection import GridSearchCV # Define the parameter grid @@ -138,11 +139,11 @@ grid_search.fit(X_train, y_train) # Print the best parameters print("Best parameters found: ", grid_search.best_params_) -Regression Example +``` +#### Regression Example Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. -python -Copy code +``` import numpy as np import pandas as pd from sklearn.datasets import load_boston @@ -171,10 +172,11 @@ mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R^2 Score: {r2:.2f}") -Conclusion +``` +### Conclusion Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. -References +### References Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest From 834aade79acb60eb6cfc8dae1731ac93f794c2b6 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:41:22 +0530 Subject: [PATCH 04/99] third --- contrib/machine-learning/Random_Forest.md | 36 +++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index a3672d0..d2d7f5c 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -2,18 +2,30 @@ Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). -## Table of Contents -Introduction -How Random Forest Works -Advantages and Disadvantages -Hyperparameters -Code Examples -Classification Example -Feature Importance -Hyperparameter Tuning -Regression Example -Conclusion -References + +- [Random Forest](#random-forest) + - [Introduction](#introduction) + - [How Random Forest Works](#how-random-forest-works) + - [1. Bootstrap Sampling:](#1-bootstrap-sampling) + - [2. Decision Trees:](#2-decision-trees) + - [3. Feature Selection:](#3-feature-selection) + - [4. Voting/Averaging:](#4-votingaveraging) + - [Detailed Working Mechanism](#detailed-working-mechanism) + - [Step 3: Aggregation:](#step-3-aggregation) + - [Advantages and Disadvantages](#advantages-and-disadvantages) + - [Advantages](#advantages) + - [Disadvantages](#disadvantages) + - [Hyperparameters](#hyperparameters) + - [Key Hyperparameters](#key-hyperparameters) + - [Tuning Hyperparameters](#tuning-hyperparameters) + - [Code Examples](#code-examples) + - [Classification Example](#classification-example) + - [Feature Importance](#feature-importance) + - [Hyperparameter Tuning](#hyperparameter-tuning) + - [Regression Example](#regression-example) + - [Conclusion](#conclusion) + - [References](#references) + ## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. From 0185122fb9ae4aada0feff6cd45f1e688644ad1c Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:48:33 +0530 Subject: [PATCH 05/99] fourth --- .vscode/settings.json | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file From 91a2b6d4b81bc46098d6c5007a45b0d0df3b572e Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 21:22:06 +0530 Subject: [PATCH 06/99] Added Random Forest --- contrib/machine-learning/Random_Forest.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index d2d7f5c..59c44ef 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -23,8 +23,8 @@ Random Forest is a versatile machine learning algorithm capable of performing bo - [Feature Importance](#feature-importance) - [Hyperparameter Tuning](#hyperparameter-tuning) - [Regression Example](#regression-example) - - [Conclusion](#conclusion) - - [References](#references) + - [Conclusion](#conclusion) + - [References](#references) ## Introduction @@ -185,10 +185,10 @@ r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R^2 Score: {r2:.2f}") ``` -### Conclusion +## Conclusion Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. -### References +## References Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest From cb5fcb4953a9b0a181479fc4b434c64123280497 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Thu, 30 May 2024 10:56:55 +0530 Subject: [PATCH 07/99] Added stacks.md --- contrib/ds-algorithms/stacks.md | 131 ++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md new file mode 100644 index 0000000..f9f662b --- /dev/null +++ b/contrib/ds-algorithms/stacks.md @@ -0,0 +1,131 @@ +# STACKS IN PYTHON +In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: *PUSH* which inserts an element on top of the stack and *POP* which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. + +**POINTS TO BE REMEMBERED :-** +- A stack is a collection of data items that can be accessed at only one end, called *TOP*. +- Items can be inserted and deleted in a stack only at the *TOP*. +- The last item inserted in a stack is the first one to be deleted. +- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. + +## REAL LIFE EXAMPLES OF STACKS + +**PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. + +**PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. + +**BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. + +## APPLICATIONS OF STACKS + +Stacks are widely used in Computer Science: +- *Function call* management +- Maintaining the *UNDO* list for the application +- Web browser *history management* +- Evaluating expressions +- Checking the nesting of parentheses in an expression +- *Backtracking* algorithms (Recursion) + +Understanding these applications is essential for Software Development. + +## OPERATIONS ON A STACK + +Key operations on a stack include: +- **PUSH** - It is the process of inserting a new element on the top of a stack. +- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. +- **POP** - It is the process of deleting an element from the top of a stack. +- **UNDERFLOW** - A situation when we are popping item from an empty stack. +- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* +- **ISEMPTY** - It is the function which return true if stack is empty else false. +- **SHOW** -Displaying stack items. + +## IMPLEMENTING STACKS IN PYTHON + +```python +def isEmpty(S): + + if len(S) == 0: + return True + + else: + + return False + +def Push(S, item): + S.append(item) + +def Pop(S): + + if isEmpty(S): + return "Underflow" + + else: + val = S.pop() + return val + +def Peek(S): + + if isEmpty(S): + return "Underflow" + + else: + top = len(S) - 1 + return S[top] + +def Show(S): + + if isEmpty(S): + print("Sorry, No items in Stack") + + else: + print("(Top)", end=' ') + t = len(S) - 1 + while t >= 0: + print(S[t], "<", end=' ') + t -= 1 + print() +``` + +This code defines a stack data structure along with functions to manipulate it. To provide output, we would need to use these functions to interact with the stack. + +Here's an example: +```python +stack = [] + +Push(stack, 5) +Push(stack, 10) +Push(stack, 15) + +print("Stack after Push operations:") +Show(stack) + +print("Peek operation:", Peek(stack)) + +print("Pop operation:", Pop(stack)) + +print("Stack after Pop operation:") +Show(stack) +``` + +This would output: + +``` +Stack after Push operations: + +(Top) 15 < 10 < 5 < + +Peek operation: 15 + +Pop operation: 15 + +Stack after Pop operation: + +(Top) 10 < 5 < +``` + +## Complexity Analysis + +- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. +- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). +- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. + + From 79017403f82fe8cd5e1737ff573eab8506a7fffa Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Thu, 30 May 2024 10:58:36 +0530 Subject: [PATCH 08/99] Update index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index c61ca0b..783f982 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -9,3 +9,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Stacks in Python](stacks.md) From 3ba006417ca0b66db7c42647398a94b05c4bf99c Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Thu, 30 May 2024 17:30:59 +0530 Subject: [PATCH 09/99] understanding cnn from scratch --- contrib/machine-learning/IntroToCNNs.md | 453 ++++++++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 454 insertions(+) create mode 100644 contrib/machine-learning/IntroToCNNs.md diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md new file mode 100644 index 0000000..5f81ace --- /dev/null +++ b/contrib/machine-learning/IntroToCNNs.md @@ -0,0 +1,453 @@ +# Understanding Convolutional Neural Networks (CNN) + +## Table of Contents +
+Click to expand + +- [Introduction](#introduction) +- [CNN Architecture](#cnn-architecture) + -
+ Convolutional Layer + + - [Input Shape](#input-shape) + - [Stride](#strides) + - [Padding](#padding) + - [Filter](#filters) + - [Output](#output) + +
+ +- [Pooling Layer](#pooling-layer) +- [Flatten Layer](#flatten-layer) +- [Dropout Layer](#dropout-layer) + +- [Implementation](#implementation) + +
+ +## Introduction + +Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. + +### Why CNNs are Superior to Traditional Neural Networks + +1. **Localized Receptive Fields**: + - CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. + +2. **Parameter Sharing**: + - In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. + +3. **Translation Invariance**: + - Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. + +4. **Hierarchical Feature Learning**: + - CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. + +### Use Cases of CNNs + +- **Image Classification**: Identifying objects within an image (e.g., classifying a picture as containing a cat or a dog). +- **Object Detection**: Detecting and locating objects within an image (e.g., finding faces in a photo). +- **Image Segmentation**: Partitioning an image into segments or regions (e.g., dividing an image into different objects and background). +- **Medical Imaging**: Analyzing medical scans like MRI, CT, and X-rays for diagnosis. + +> This guide will walk you through the fundamentals of CNNs and their implementation in Python. We'll build a simple CNN from scratch, explaining each component to help you understand how CNNs process images and extract features. + +### Let's start by understanding the basic architecture of CNNs. + +## CNN Architecture + +Convolution layers, pooling layers, and fully connected layers are just a few of the many building blocks that CNNs use to automatically and adaptively learn spatial hierarchies of information through backpropagation. + +### Convolutional Layer +The convolutional layer is the core building block of a CNN. The layer's parameters consist of a set of learnable filters (or kernels), which have a small receptive field but extend through the full depth of the input volume. + +#### Input Shape +The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). +
+ + + + + + + + + + + +
1 and 0
10111
10101
10101
10101
10101
10101
10111
+ + + + + + + + + + + +
9
01110
01010
01110
00010
00010
00010
00010
+
+ +- The input matrix represents a simplified binary image of handwritten digits, +where '1' denotes the presence of ink and '0' represents the absence of ink. + +- The first matrix shows the represnetation of 1 and 0, which can be depicted as a vertical line and a closed loop. + +- The second matrix represents 9, combining the loop and line. + +
+ +#### Strides +The step size with which the filter moves across the input image. +
+ + + + + + + + + + + +
3
011 + 10
010 + 10
01110
00010
000 + 10
000 + 10
00010
+ + + + + + + + + + + +
2
01 + 110
01 + 010
01110
00 + 010
00 + 010
00010
00010
+
+ +- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. + +- A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. + +- However, with larger strides (like 3 or 2 in this example), the filter may not cover all elements, potentially missing some information. + +- While this might seem like a drawback, higher strides are often used to reduce computational cost and decrease the output size, which can be beneficial in speeding up the training process and preventing overfitting. + +
+ +#### Padding +Determines whether the output size is the same as the input size ('same') or reduced ('valid'). +
+ + + + + + + + + + + + + +
padding='same'
0000000
0011100
0010100
0011100
0000100
0000100
0000100
0000100
0000000
+ + + + + + + + + + + +
padding='valid'
01110
01010
01110
00010
00010
00010
00010
+
+ +- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. + +- Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. + +
+ +#### Filters +Small matrices that slide over the input data to extract features. +
+ + + + + + + +
closed loop
111
101
111
+ + + + + + + +
vertical line
010
010
010
+ + + + + + + +
both diagonals
101
010
101
+
+ +- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. + +- The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. + +- The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'. + +
+ +#### Output +A set of feature maps that represent the presence of different features in the input. +
+ + + + + + + + + +
('valid', 1)
404
25-3
25-3
032
032
+ + + + + + + + + + + +
('same', 1)
22422
34843
22533
12533
00323
00323
00212
+ + + + + + + +
('valid', 2)
44
23
02
+
+ +- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. + +- By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. + +- Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. + +
+ +### Pooling Layer +Pooling layers reduce the dimensionality of each feature map while retaining the most critical information. The most common form of pooling is max pooling. +- **Input Shape:** The dimensions of the feature map from the convolutional layer. +- **Pooling Size:** The size of the pooling window (e.g., 2x2). +- **Strides:** The step size for the pooling operation. +- **Output:** A reduced feature map highlighting the most important features. +
+ + + + + + + + + + +
((2,2), 1)
4884
4884
2553
2553
0333
0333
+ + + + + + + +
((3,3) 2)
88
55
33
+
+ +- The high values (8) indicate that the "closed loop" filter found a strong match in those regions. + +- First matrix of size 6x4 represents a downsampled version of the input. + +- While the second matrix with 3x2, resulting in more aggressive downsampling. + + +
+ +### Flatten Layer +The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. +- **Input Shape:** The 2D feature maps from the previous layer. +- **Output:** A 1D vector that represents the same data in a flattened format. +
+ + + + + + + + + + +
After max pooling (with kernel size = 3 and stride = 1)
888888555555333
+
+ +
+ +### Dropout Layer +Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. +- **Input Shape:** The data from the previous layer. +- **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). +- **Output:** The same shape as the input, with some units set to zero. +
+ + + + + +
dropout rate = 0.3
880800 505055 033
+
+ +- The updated 0 values represents the dropped units. + +## Implementation + +Below is the implementation of a simple CNN in Python. Each function within the `CNN` class corresponds to a layer in the network. + +```python +import numpy as np + +class CNN: + def __init__(self): + pass + + def convLayer(self, input_shape, channels, strides, padding, filter_size): + height, width = input_shape + input_shape_with_channels = (height, width, channels) + print("Input Shape (with channels):", input_shape_with_channels) + + # Generate random input and filter matrices + input_matrix = np.random.randint(0, 10, size=input_shape_with_channels) + filter_matrix = np.random.randint(0, 5, size=(filter_size[0], filter_size[1], channels)) + + print("\nInput Matrix:\n", input_matrix[:, :, 0]) + print("\nFilter Matrix:\n", filter_matrix[:, :, 0]) + + padding = padding.lower() + + if padding == 'same': + # Calculate padding needed for each dimension + pad_height = filter_size[0] // 2 + pad_width = filter_size[1] // 2 + + # Apply padding to the input matrix + input_matrix = np.pad(input_matrix, ((pad_height, pad_height), (pad_width, pad_width), (0, 0)), mode='constant') + + # Adjust height and width to consider the padding + height += 2 * pad_height + width += 2 * pad_width + + elif padding == 'valid': + pass + + else: + return "Invalid Padding!!" + + # Output dimensions + conv_height = (height - filter_size[0]) // strides[0] + 1 + conv_width = (width - filter_size[1]) // strides[1] + 1 + + output_matrix = np.zeros((conv_height, conv_width, channels)) + + # Convolution Operation + for i in range(0, height - filter_size[0] + 1, strides[0]): + for j in range(0, width - filter_size[1] + 1, strides[1]): + receptive_field = input_matrix[i:i + filter_size[0], j:j + filter_size[1], :] + output_matrix[i // strides[0], j // strides[1], :] = np.sum(receptive_field * filter_matrix, axis=(0, 1, 2)) + + return output_matrix + + def maxPooling(self, input_matrix, pool_size=(2, 2), strides_pooling=(2, 2)): + input_height, input_width, input_channels = input_matrix.shape + pool_height, pool_width = pool_size + stride_height, stride_width = strides_pooling + + # Calculate output dimensions + pooled_height = (input_height - pool_height) // stride_height + 1 + pooled_width = (input_width - pool_width) // stride_width + 1 + + # Initialize output + pooled_matrix = np.zeros((pooled_height, pooled_width, input_channels)) + + # Perform max pooling + for c in range(input_channels): + for i in range(0, input_height - pool_height + 1, stride_height): + for j in range(0, input_width - pool_width + 1, stride_width): + patch = input_matrix[i:i + pool_height, j:j + pool_width, c] + pooled_matrix[i // stride_height, j // stride_width, c] = np.max(patch) + + return pooled_matrix + + def flatten(self, input_matrix): + return input_matrix.flatten() + + def dropout(self, input_matrix, dropout_rate=0.5): + assert 0 <= dropout_rate < 1, "Dropout rate must be in [0, 1)." + dropout_mask = np.random.binomial(1, 1 - dropout_rate, size=input_matrix.shape) + return input_matrix * dropout_mask +``` + +Run the below command to generate output, based on random input and filter matrices. + +```python +input_shape = (5, 5) +channels = 1 +strides = (1, 1) +padding = 'valid' +filter_size = (3, 3) + +cnn_model = CNN() + +conv_output = cnn_model.convLayer(input_shape, channels, strides, padding, filter_size) +print("\nConvolution Output:\n", conv_output[:, :, 0]) + +pool_size = (2, 2) +strides_pooling = (1, 1) + +maxPool_output = cnn_model.maxPooling(conv_output, pool_size, strides_pooling) +print("\nMax Pooling Output:\n", maxPool_output[:, :, 0]) + +flattened_output = cnn_model.flatten(maxPool_output) +print("\nFlattened Output:\n", flattened_output) + +dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) +print("\nDropout Output:\n", dropout_output) +``` + +Feel free to play around with the parameters! \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 94ca1e2..ea8b5cb 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,3 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) +- [Introduction To Convolutional Neural Networks (CNNs)](IntroToCNNs.md) From f89ffbd58c0082f8533064aa864483799a9c1751 Mon Sep 17 00:00:00 2001 From: Aman Barthwal Date: Thu, 30 May 2024 17:41:16 +0530 Subject: [PATCH 10/99] Update IntroToCNNs.md --- contrib/machine-learning/IntroToCNNs.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 5f81ace..7c0812f 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -63,7 +63,8 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
+
+

@@ -76,6 +77,8 @@ The dimensions of the input image, including the number of channels (e.g., 3 for
1 and 0
10111
+

+

@@ -88,6 +91,7 @@ The dimensions of the input image, including the number of channels (e.g., 3 for
9
00010
+

- The input matrix represents a simplified binary image of handwritten digits, @@ -450,4 +454,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! \ No newline at end of file +Feel free to play around with the parameters! From d9ab12136329bf485af34a2dbf31fa8e933a9ebe Mon Sep 17 00:00:00 2001 From: Aman Barthwal Date: Thu, 30 May 2024 17:42:51 +0530 Subject: [PATCH 11/99] Update IntroToCNNs.md --- contrib/machine-learning/IntroToCNNs.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 7c0812f..802cfdb 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -25,6 +25,22 @@ + + +
Table 1 Heading 1 Table 1 Heading 2
+ +|Table 1| Middle | Table 2| +|--|--|--| +|a| not b|and c | + + + +|b|1|2|3| +|--|--|--|--| +|a|s|d|f| + +
+ ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. From 1d01704f40d48be974079d84a7511d281caab497 Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Thu, 30 May 2024 23:59:27 +0530 Subject: [PATCH 12/99] replaced tables with images --- contrib/machine-learning/IntroToCNNs.md | 230 ++---------------- .../machine-learning/assets/cnn-dropout.png | Bin 0 -> 28288 bytes .../machine-learning/assets/cnn-filters.png | Bin 0 -> 38260 bytes .../machine-learning/assets/cnn-flattened.png | Bin 0 -> 33305 bytes .../assets/cnn-input_shape.png | Bin 0 -> 54890 bytes .../machine-learning/assets/cnn-ouputs.png | Bin 0 -> 94050 bytes .../machine-learning/assets/cnn-padding.png | Bin 0 -> 98306 bytes .../machine-learning/assets/cnn-pooling.png | Bin 0 -> 79460 bytes .../machine-learning/assets/cnn-strides.png | Bin 0 -> 75501 bytes 9 files changed, 19 insertions(+), 211 deletions(-) create mode 100644 contrib/machine-learning/assets/cnn-dropout.png create mode 100644 contrib/machine-learning/assets/cnn-filters.png create mode 100644 contrib/machine-learning/assets/cnn-flattened.png create mode 100644 contrib/machine-learning/assets/cnn-input_shape.png create mode 100644 contrib/machine-learning/assets/cnn-ouputs.png create mode 100644 contrib/machine-learning/assets/cnn-padding.png create mode 100644 contrib/machine-learning/assets/cnn-pooling.png create mode 100644 contrib/machine-learning/assets/cnn-strides.png diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 802cfdb..f832980 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -25,22 +25,6 @@ - - -
Table 1 Heading 1 Table 1 Heading 2
- -|Table 1| Middle | Table 2| -|--|--|--| -|a| not b|and c | - - - -|b|1|2|3| -|--|--|--|--| -|a|s|d|f| - -
- ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. @@ -79,35 +63,8 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
-

- - - - - - - - - - - -
1 and 0
10111
10101
10101
10101
10101
10101
10111
-

-

- - - - - - - - - - - -
9
01110
01010
01110
00010
00010
00010
00010
-

+
+
- The input matrix represents a simplified binary image of handwritten digits, @@ -121,39 +78,8 @@ where '1' denotes the presence of ink and '0' represents the absence of ink. #### Strides The step size with which the filter moves across the input image. -
- - - - - - - - - - - -
3
011 - 10
010 - 10
01110
00010
000 - 10
000 - 10
00010
- - - - - - - - - - - -
2
01 - 110
01 - 010
01110
00 - 010
00 - 010
00010
00010
+
+
- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. @@ -168,33 +94,8 @@ The step size with which the filter moves across the input image. #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid'). -
- - - - - - - - - - - - - -
padding='same'
0000000
0011100
0010100
0011100
0000100
0000100
0000100
0000100
0000000
- - - - - - - - - - - -
padding='valid'
01110
01010
01110
00010
00010
00010
00010
+
+
- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. @@ -205,31 +106,8 @@ Determines whether the output size is the same as the input size ('same') or red #### Filters Small matrices that slide over the input data to extract features. -
- - - - - - - -
closed loop
111
101
111
- - - - - - - -
vertical line
010
010
010
- - - - - - - -
both diagonals
101
010
101
+
+
- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. @@ -242,37 +120,8 @@ Small matrices that slide over the input data to extract features. #### Output A set of feature maps that represent the presence of different features in the input. -
- - - - - - - - - -
('valid', 1)
404
25-3
25-3
032
032
- - - - - - - - - - - -
('same', 1)
22422
34843
22533
12533
00323
00323
00212
- - - - - - - -
('valid', 2)
44
23
02
+
+
- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. @@ -289,69 +138,29 @@ Pooling layers reduce the dimensionality of each feature map while retaining the - **Pooling Size:** The size of the pooling window (e.g., 2x2). - **Strides:** The step size for the pooling operation. - **Output:** A reduced feature map highlighting the most important features. -
- - - - - - - - - - -
((2,2), 1)
4884
4884
2553
2553
0333
0333
- - - - - - - -
((3,3) 2)
88
55
33
+
+
- The high values (8) indicate that the "closed loop" filter found a strong match in those regions. - - First matrix of size 6x4 represents a downsampled version of the input. - - While the second matrix with 3x2, resulting in more aggressive downsampling. - -
- ### Flatten Layer The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. - **Input Shape:** The 2D feature maps from the previous layer. - **Output:** A 1D vector that represents the same data in a flattened format. -
- - - - - - - - - - -
After max pooling (with kernel size = 3 and stride = 1)
888888555555333
+
+
-
- ### Dropout Layer Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. - **Input Shape:** The data from the previous layer. - **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). - **Output:** The same shape as the input, with some units set to zero. -
- - - - - -
dropout rate = 0.3
880800 505055 033
+
+
- The updated 0 values represents the dropped units. @@ -402,9 +211,8 @@ class CNN: # Output dimensions conv_height = (height - filter_size[0]) // strides[0] + 1 conv_width = (width - filter_size[1]) // strides[1] + 1 - output_matrix = np.zeros((conv_height, conv_width, channels)) - + # Convolution Operation for i in range(0, height - filter_size[0] + 1, strides[0]): for j in range(0, width - filter_size[1] + 1, strides[1]): @@ -443,7 +251,7 @@ class CNN: return input_matrix * dropout_mask ``` -Run the below command to generate output, based on random input and filter matrices. +Run the below command to generate output with random input and filter matrices, depending on the given size. ```python input_shape = (5, 5) @@ -470,4 +278,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! +Feel free to play around with the parameters! \ No newline at end of file diff --git a/contrib/machine-learning/assets/cnn-dropout.png b/contrib/machine-learning/assets/cnn-dropout.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb18f9567de980472ceb8cbdd7aaa1130ba7231 GIT binary patch literal 28288 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 Wl5qCa5HSBmr=h0%JMPBahyMbWFn6v1 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-filters.png b/contrib/machine-learning/assets/cnn-filters.png new file mode 100644 index 0000000000000000000000000000000000000000..463ca60003a60f2637d95e9dd0caa92db550ae97 GIT binary patch literal 38260 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

C}&V{e*Tl_n=cCi*Am#{)R^RmrYse{u_3`mpby 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 _pbkH-fS=}@8**(x!%2OfVRSW+1FE+ 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-input_shape.png b/contrib/machine-learning/assets/cnn-input_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..34379f1db595776f40f5598108a896f5d973f8a1 GIT binary patch literal 54890 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-ouputs.png b/contrib/machine-learning/assets/cnn-ouputs.png new file mode 100644 index 0000000000000000000000000000000000000000..279722659207e9add1d851556189994dae0e1ee4 GIT binary patch literal 94050 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-padding.png b/contrib/machine-learning/assets/cnn-padding.png new file mode 100644 index 0000000000000000000000000000000000000000..a441b2b96e0ec075fb0c2e2e81cf21bc33ed4388 GIT binary patch literal 98306 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 z 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 Q5Adh1s(m$2+2Yav0-xBKjsO4v literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-pooling.png b/contrib/machine-learning/assets/cnn-pooling.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ada5cff41c3b35ecc515bde1f3a6311f2d4787 GIT binary patch literal 79460 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 G#{U8{`h7M4 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-strides.png b/contrib/machine-learning/assets/cnn-strides.png new file mode 100644 index 0000000000000000000000000000000000000000..26339a9fa6fda4afbc7c2c6d3271326753c86957 GIT binary patch literal 75501 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 H_w@e&&uRUj literal 0 HcmV?d00001 From 814aeadcbb77f6b19eca81599c12d81ee113499c Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Fri, 31 May 2024 02:32:02 +0530 Subject: [PATCH 13/99] added formulas --- contrib/machine-learning/IntroToCNNs.md | 55 +++++++++---------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index f832980..fb9027a 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -26,25 +26,15 @@ ## Introduction - Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. ### Why CNNs are Superior to Traditional Neural Networks - -1. **Localized Receptive Fields**: - - CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. - -2. **Parameter Sharing**: - - In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. - -3. **Translation Invariance**: - - Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. - -4. **Hierarchical Feature Learning**: - - CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. +1. **Localized Receptive Fields**: CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. +2. **Parameter Sharing**: In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. +3. **Translation Invariance**: Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. +4. **Hierarchical Feature Learning**: CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. ### Use Cases of CNNs - - **Image Classification**: Identifying objects within an image (e.g., classifying a picture as containing a cat or a dog). - **Object Detection**: Detecting and locating objects within an image (e.g., finding faces in a photo). - **Image Segmentation**: Partitioning an image into segments or regions (e.g., dividing an image into different objects and background). @@ -55,7 +45,6 @@ Convolutional Neural Networks (CNNs) are a specialized type of artificial neural ### Let's start by understanding the basic architecture of CNNs. ## CNN Architecture - Convolution layers, pooling layers, and fully connected layers are just a few of the many building blocks that CNNs use to automatically and adaptively learn spatial hierarchies of information through backpropagation. ### Convolutional Layer @@ -67,31 +56,22 @@ The dimensions of the input image, including the number of channels (e.g., 3 for

-- The input matrix represents a simplified binary image of handwritten digits, -where '1' denotes the presence of ink and '0' represents the absence of ink. - +- The input matrix is a binary image of handwritten digits, +where '1' marks the pixels containing the digit (ink/grayscale area) and '0' marks the background pixels (empty space). - The first matrix shows the represnetation of 1 and 0, which can be depicted as a vertical line and a closed loop. - - The second matrix represents 9, combining the loop and line. -
- #### Strides The step size with which the filter moves across the input image.
-- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. - +- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of (3,3) and (2,2). - A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. - - However, with larger strides (like 3 or 2 in this example), the filter may not cover all elements, potentially missing some information. - - While this might seem like a drawback, higher strides are often used to reduce computational cost and decrease the output size, which can be beneficial in speeding up the training process and preventing overfitting. -
- #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid').
@@ -99,10 +79,8 @@ Determines whether the output size is the same as the input size ('same') or red
- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. - - Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. - -
+- Padding value can be determined by $ ( f - 1 ) \over 2 $, where f isfilter size #### Filters Small matrices that slide over the input data to extract features. @@ -111,9 +89,7 @@ Small matrices that slide over the input data to extract features.
- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. - - The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. - - The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'.
@@ -125,12 +101,21 @@ A set of feature maps that represent the presence of different features in the i
- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. - - By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. - - Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. +- The output dimension of a CNN model is given by, $$ n_{out} = { n_{in} + (2 \cdot p) - k \over s } $$ +where,
+ nin = number of input features
+ p = padding
+ k = kernel size
+ s = stride -
+- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ +
where,
+ nc = number of input channels
+ k x k = kernel size
+ f = number of filters
+ an additional f is added for bias ### Pooling Layer Pooling layers reduce the dimensionality of each feature map while retaining the most critical information. The most common form of pooling is max pooling. From 21612e4b81468a127feea94ee419d22efcb1133c Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 07:58:39 +0530 Subject: [PATCH 14/99] Update index.md --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..e3a8f0b 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +- [Grid Search](grid-search.md) From a953122b2681a430e0805de2031f5c20af2ee8cc Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 07:59:40 +0530 Subject: [PATCH 15/99] Create grid-search.md --- contrib/machine-learning/grid-search.md | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 contrib/machine-learning/grid-search.md diff --git a/contrib/machine-learning/grid-search.md b/contrib/machine-learning/grid-search.md new file mode 100644 index 0000000..3bf53ff --- /dev/null +++ b/contrib/machine-learning/grid-search.md @@ -0,0 +1,68 @@ +# Grid Search + +Grid Search is a hyperparameter tuning technique in Machine Learning that helps to find the best combination of hyperparameters for a given model. It works by defining a grid of hyperparameters and then training the model with all the possible combinations of hyperparameters to find the best performing set. +The Grid Search Method considers some hyperparameter combinations and selects the one returning a lower error score. This method is specifically useful when there are only some hyperparameters in order to optimize. However, it is outperformed by other weighted-random search methods when the Machine Learning model grows in complexity. + +## Implementation + +Before applying Grid Searching on any algorithm, Data is used to divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. +Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accurac +Let us consider that the model accepts the below three parameters in the form of input: +1. Number of hidden layers [2, 4] +2. Number of neurons in every layer [5, 10] +3. Number of epochs [10, 50] + +If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be [2, 5, 10]. Finding such combinations manually would be a headache. +Now, suppose that we had ten different parameters as input, and we would like to try out five possible values for each and every parameter. It would need manual input from the programmer's end every time we like to alter the value of a parameter, re-execute the code, and keep a record of the outputs for every combination of the parameters. +Grid Search automates that process, as it accepts the possible value for every parameter and executes the code in order to try out each and every possible combination outputs the result for the combinations and outputs the combination having the best accuracy. +Higher values of C tell the model, the training data resembles real world information, place a greater weight on the training data. While lower values of C do the opposite. + +## Explaination of the Code + +The code provided performs hyperparameter tuning for a Logistic Regression model using a manual grid search approach. It evaluates the model's performance for different values of the regularization strength hyperparameter C on the Iris dataset. +1. datasets from sklearn is imported to load the Iris dataset. +2. LogisticRegression from sklearn.linear_model is imported to create and fit the logistic regression model. +3. The Iris dataset is loaded, with X containing the features and y containing the target labels. +4. A LogisticRegression model is instantiated with max_iter=10000 to ensure convergence during the fitting process, as the default maximum iterations (100) might not be sufficient. +5. A list of different values for the regularization strength C is defined. The hyperparameter C controls the regularization strength, with smaller values specifying stronger regularization. +6. An empty list scores is initialized to store the model's performance scores for different values of C. +7. A for loop iterates over each value in the C list: +8. logit.set_params(C=choice) sets the C parameter of the logistic regression model to the current value in the loop. +9. logit.fit(X, y) fits the logistic regression model to the entire Iris dataset (this is typically done on training data in a real scenario, not the entire dataset). +10. logit.score(X, y) calculates the accuracy of the fitted model on the dataset and appends this score to the scores list. +11. After the loop, the scores list is printed, showing the accuracy for each value of C. + +## Python Code + +from sklearn import datasets + +from sklearn.linear_model import LogisticRegression + +iris = datasets.load_iris() + +X = iris['data'] + +y = iris['target'] + +logit = LogisticRegression(max_iter = 10000) + +C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + +scores = [] + +for choice in C: + + logit.set_params(C=choice) + + logit.fit(X, y) + + scores.append(logit.score(X, y)) + +print(scores) + +## Results + +[0.9666666666666667, 0.9666666666666667, 0.9733333333333334, 0.9733333333333334, 0.98, 0.98, 0.9866666666666667, 0.9866666666666667] + +We can see that the lower values of C performed worse than the base parameter of 1. However, as we increased the value of C to 1.75 the model experienced increased accuracy. +It seems that increasing C beyond this amount does not help increase model accuracy. From 50d2b654e03d777ef20c20a210732a9b1a44c54e Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:05:09 +0530 Subject: [PATCH 16/99] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 32261d6..a8416a8 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,3 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) +- [Box Plots in Matplotlib](matplotlib-box-plots.md) From c54f6128e9cdee0834d265c7b6ca7a42a105c540 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:06:46 +0530 Subject: [PATCH 17/99] Create matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 contrib/plotting-visualization/matplotlib-box-plots.md diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md new file mode 100644 index 0000000..323b5a4 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -0,0 +1,104 @@ +# Box Plot + +A box plot represents the distribution of a dataset in a graph. It displays the summary statistics of a dataset, including the minimum, first quartile (Q1), median (Q2), third quartile (Q3), and maximum. The box represents the interquartile range (IQR) between the first and third quartiles, while whiskers extend from the box to the minimum and maximum values. Outliers, if present, may be displayed as individual points beyond the whiskers. + +For example - Imagine you have the exam scores of students from three classes. A box plot is a way to show how these scores are spread out. + +## Key Ranges in Data Distribution + +The data can be distributed between five key ranges, which are as follows - +1. Minimum: Q1-1.5*IQR +2. 1st quartile (Q1): 25th percentile +3. Median: 50th percentile +4. 3rd quartile(Q3): 75th percentile +5. Maximum: Q3+1.5*IQR + +## Purpose of Box Plots + +We can create the box plot of the data to determine the following- +1. The number of outliers in a dataset +2. Is the data skewed or not (skewness is a measure of asymmetry of the distribution) +3. The range of the data + +## Creating Box Plots using Matplotlib + +By using inbuilt funtion boxplot() of pyplot module of matplotlib - + +Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths=none) + +1. data: The data should be an array or sequence of arrays which will be plotted. +2. notch: This parameter accepts only Boolean values, either true or false. +3. vert: This attribute accepts a Boolean value. If it is set to true, then the graph will be vertical. Otherwise, it will be horizontal. +4. position: It accepts the array of integers which defines the position of the box. +5. widths: It accepts the array of integers which defines the width of the box. +6. patch_artist: this parameter accepts Boolean values, either true or false, and this is an optional parameter. +7. labels: This accepts the strings which define the labels for each data point +8. meanline: It accepts a boolean value, and it is optional. +9. order: It sets the order of the boxplot. +10. bootstrap: It accepts the integer value, which specifies the range of the notched boxplot. + +## Implementation of Box Plot in Python + +### Import libraries +import matplotlib.pyplot as plt +import numpy as np + +### Creating dataset +np.random.seed(10) +data = np.random.normal(100, 20, 200) +fig = plt.figure(figsize =(10, 7)) + +### Creating plot +plt.boxplot(data) + +### show plot +plt.show() + +### Implementation of Multiple Box Plot in Python +import matplotlib.pyplot as plt +import numpy as np +np.random.seed(10) +dataSet1 = np.random.normal(100, 10, 220) +dataSet2 = np.random.normal(80, 20, 200) +dataSet3 = np.random.normal(60, 35, 220) +dataSet4 = np.random.normal(50, 40, 200) +dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] +figure = plt.figure(figsize =(10, 7)) +ax = figure.add_axes([0, 0, 1, 1]) +bp = ax.boxplot(dataSet) +plt.show() + +### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) +import matplotlib.pyplot as plt +import numpy as np + +### Data for monthly sales +product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] +product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] +product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] + +### Introducing outliers +product_A_sales.extend([300, 80]) +product_B_sales.extend([50, 300]) +product_C_sales.extend([70, 250]) + +### Creating a box plot with outliers +plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') +plt.title('Monthly Sales Performance by Product with Outliers') +plt.xlabel('Products') +plt.ylabel('Sales') +plt.show() + +### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) +import matplotlib.pyplot as plt +import numpy as np +class_A_scores = [75, 80, 85, 90, 95] +class_B_scores = [70, 75, 80, 85, 90] +class_C_scores = [65, 70, 75, 80, 85] + +### Creating a grouped box plot +plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) +plt.title('Exam Scores by Class') +plt.xlabel('Classes') +plt.ylabel('Scores') +plt.show() From c3f715e98321ff5afe0fb50d5dd80e7ec7366a59 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:09:21 +0530 Subject: [PATCH 18/99] Update matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md index 323b5a4..4d76243 100644 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -40,60 +40,97 @@ Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths ## Implementation of Box Plot in Python ### Import libraries + import matplotlib.pyplot as plt + import numpy as np ### Creating dataset + np.random.seed(10) + data = np.random.normal(100, 20, 200) + fig = plt.figure(figsize =(10, 7)) ### Creating plot + plt.boxplot(data) ### show plot + plt.show() ### Implementation of Multiple Box Plot in Python + import matplotlib.pyplot as plt + import numpy as np + np.random.seed(10) + dataSet1 = np.random.normal(100, 10, 220) -dataSet2 = np.random.normal(80, 20, 200) + +dataSet2 = np.random.normal(80, 20, 200) + dataSet3 = np.random.normal(60, 35, 220) + dataSet4 = np.random.normal(50, 40, 200) + dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] + figure = plt.figure(figsize =(10, 7)) + ax = figure.add_axes([0, 0, 1, 1]) + bp = ax.boxplot(dataSet) + plt.show() ### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) + import matplotlib.pyplot as plt + import numpy as np ### Data for monthly sales + product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] + product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] + product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] ### Introducing outliers + product_A_sales.extend([300, 80]) + product_B_sales.extend([50, 300]) + product_C_sales.extend([70, 250]) ### Creating a box plot with outliers + plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') + plt.title('Monthly Sales Performance by Product with Outliers') + plt.xlabel('Products') + plt.ylabel('Sales') + plt.show() ### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) + import matplotlib.pyplot as plt + import numpy as np + class_A_scores = [75, 80, 85, 90, 95] + class_B_scores = [70, 75, 80, 85, 90] + class_C_scores = [65, 70, 75, 80, 85] ### Creating a grouped box plot From d552e04ded85206b731474e0e272f1701641c13a Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:09:57 +0530 Subject: [PATCH 19/99] Update matplotlib-box-plots.md --- contrib/plotting-visualization/matplotlib-box-plots.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md index 4d76243..1780cab 100644 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -134,8 +134,13 @@ class_B_scores = [70, 75, 80, 85, 90] class_C_scores = [65, 70, 75, 80, 85] ### Creating a grouped box plot + plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) + plt.title('Exam Scores by Class') + plt.xlabel('Classes') + plt.ylabel('Scores') + plt.show() From 208ff1ea06192dc51ebc45f1e32b29a185d4b561 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:13:42 +0530 Subject: [PATCH 20/99] Delete contrib/plotting-visualization/matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 146 ------------------ 1 file changed, 146 deletions(-) delete mode 100644 contrib/plotting-visualization/matplotlib-box-plots.md diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md deleted file mode 100644 index 1780cab..0000000 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ /dev/null @@ -1,146 +0,0 @@ -# Box Plot - -A box plot represents the distribution of a dataset in a graph. It displays the summary statistics of a dataset, including the minimum, first quartile (Q1), median (Q2), third quartile (Q3), and maximum. The box represents the interquartile range (IQR) between the first and third quartiles, while whiskers extend from the box to the minimum and maximum values. Outliers, if present, may be displayed as individual points beyond the whiskers. - -For example - Imagine you have the exam scores of students from three classes. A box plot is a way to show how these scores are spread out. - -## Key Ranges in Data Distribution - -The data can be distributed between five key ranges, which are as follows - -1. Minimum: Q1-1.5*IQR -2. 1st quartile (Q1): 25th percentile -3. Median: 50th percentile -4. 3rd quartile(Q3): 75th percentile -5. Maximum: Q3+1.5*IQR - -## Purpose of Box Plots - -We can create the box plot of the data to determine the following- -1. The number of outliers in a dataset -2. Is the data skewed or not (skewness is a measure of asymmetry of the distribution) -3. The range of the data - -## Creating Box Plots using Matplotlib - -By using inbuilt funtion boxplot() of pyplot module of matplotlib - - -Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths=none) - -1. data: The data should be an array or sequence of arrays which will be plotted. -2. notch: This parameter accepts only Boolean values, either true or false. -3. vert: This attribute accepts a Boolean value. If it is set to true, then the graph will be vertical. Otherwise, it will be horizontal. -4. position: It accepts the array of integers which defines the position of the box. -5. widths: It accepts the array of integers which defines the width of the box. -6. patch_artist: this parameter accepts Boolean values, either true or false, and this is an optional parameter. -7. labels: This accepts the strings which define the labels for each data point -8. meanline: It accepts a boolean value, and it is optional. -9. order: It sets the order of the boxplot. -10. bootstrap: It accepts the integer value, which specifies the range of the notched boxplot. - -## Implementation of Box Plot in Python - -### Import libraries - -import matplotlib.pyplot as plt - -import numpy as np - -### Creating dataset - -np.random.seed(10) - -data = np.random.normal(100, 20, 200) - -fig = plt.figure(figsize =(10, 7)) - -### Creating plot - -plt.boxplot(data) - -### show plot - -plt.show() - -### Implementation of Multiple Box Plot in Python - -import matplotlib.pyplot as plt - -import numpy as np - -np.random.seed(10) - -dataSet1 = np.random.normal(100, 10, 220) - -dataSet2 = np.random.normal(80, 20, 200) - -dataSet3 = np.random.normal(60, 35, 220) - -dataSet4 = np.random.normal(50, 40, 200) - -dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] - -figure = plt.figure(figsize =(10, 7)) - -ax = figure.add_axes([0, 0, 1, 1]) - -bp = ax.boxplot(dataSet) - -plt.show() - -### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) - -import matplotlib.pyplot as plt - -import numpy as np - -### Data for monthly sales - -product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] - -product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] - -product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] - -### Introducing outliers - -product_A_sales.extend([300, 80]) - -product_B_sales.extend([50, 300]) - -product_C_sales.extend([70, 250]) - -### Creating a box plot with outliers - -plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') - -plt.title('Monthly Sales Performance by Product with Outliers') - -plt.xlabel('Products') - -plt.ylabel('Sales') - -plt.show() - -### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) - -import matplotlib.pyplot as plt - -import numpy as np - -class_A_scores = [75, 80, 85, 90, 95] - -class_B_scores = [70, 75, 80, 85, 90] - -class_C_scores = [65, 70, 75, 80, 85] - -### Creating a grouped box plot - -plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) - -plt.title('Exam Scores by Class') - -plt.xlabel('Classes') - -plt.ylabel('Scores') - -plt.show() From dd24cd3a2e82ef40f55ead219868947afdfc12c6 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:14:00 +0530 Subject: [PATCH 21/99] Update index.md --- contrib/plotting-visualization/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index a8416a8..92ec106 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,4 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) -- [Box Plots in Matplotlib](matplotlib-box-plots.md) + From bdbe355c485de10dfea943108434b756e624a889 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Fri, 31 May 2024 08:23:22 +0530 Subject: [PATCH 22/99] updated index --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 94ca1e2..073bca9 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,3 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) +- [Random Forest](Random_Forest.md) \ No newline at end of file From 4888094a059aad26f1eba062b4765b70b9b19ee8 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 09:26:56 +0530 Subject: [PATCH 23/99] Create Trie.md --- contrib/ds-algorithms/Trie.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/ds-algorithms/Trie.md diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/Trie.md new file mode 100644 index 0000000..e69de29 From cd74a77397850249e8910638f41149a86476f37b Mon Sep 17 00:00:00 2001 From: Ritesh Date: Fri, 31 May 2024 10:17:29 +0530 Subject: [PATCH 24/99] Create clustering.md --- contrib/machine-learning/clustering.md | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 contrib/machine-learning/clustering.md diff --git a/contrib/machine-learning/clustering.md b/contrib/machine-learning/clustering.md new file mode 100644 index 0000000..7d5577c --- /dev/null +++ b/contrib/machine-learning/clustering.md @@ -0,0 +1,115 @@ +# Clustering + +Clustering is an unsupervised machine learning technique that groups a set of objects in such a way that objects in the same group (called a cluster) are more similar to each other than to those in other groups (clusters). This README provides an overview of clustering, including its fundamental concepts, types, algorithms, and how to implement it using Python. + +## Table of Contents + +1. [Introduction](#introduction) +2. [Concepts](#concepts) +3. [Types of Clustering](#types-of-clustering) +4. [Clustering Algorithms](#clustering-algorithms) +5. [Implementation](#implementation) + - [Using Scikit-learn](#using-scikit-learn) + - [Code Example](#code-example) +6. [Evaluation Metrics](#evaluation-metrics) +7. [Conclusion](#conclusion) +8. [References](#references) + +## Introduction + +Clustering is a technique used to find inherent groupings within data without pre-labeled targets. It is widely used in exploratory data analysis, pattern recognition, image analysis, information retrieval, and bioinformatics. + +## Concepts + +### Centroid + +A centroid is the center of a cluster. In the k-means clustering algorithm, for example, each cluster is represented by its centroid, which is the mean of all the data points in the cluster. + +### Distance Measure + +Distance measures are used to quantify the similarity or dissimilarity between data points. Common distance measures include Euclidean distance, Manhattan distance, and cosine similarity. + +### Inertia + +Inertia is a metric used to assess the quality of the clusters formed. It is the sum of squared distances of samples to their nearest cluster center. + +## Types of Clustering + +1. **Hard Clustering**: Each data point either belongs to a cluster completely or not at all. +2. **Soft Clustering (Fuzzy Clustering)**: Each data point can belong to multiple clusters with varying degrees of membership. + +## Clustering Algorithms + +### K-Means Clustering + +K-Means is a popular clustering algorithm that partitions the data into k clusters, where each data point belongs to the cluster with the nearest mean. The algorithm follows these steps: +1. Initialize k centroids randomly. +2. Assign each data point to the nearest centroid. +3. Recalculate the centroids as the mean of all data points assigned to each cluster. +4. Repeat steps 2 and 3 until convergence. + +### Hierarchical Clustering + +Hierarchical clustering builds a tree of clusters. There are two types: +- **Agglomerative (bottom-up)**: Starts with each data point as a separate cluster and merges the closest pairs of clusters iteratively. +- **Divisive (top-down)**: Starts with all data points in one cluster and splits the cluster iteratively into smaller clusters. + +### DBSCAN (Density-Based Spatial Clustering of Applications with Noise) + +DBSCAN groups together points that are close to each other based on a distance measurement and a minimum number of points. It can find arbitrarily shaped clusters and is robust to noise. + +## Implementation + +### Using Scikit-learn + +Scikit-learn is a popular machine learning library in Python that provides tools for clustering. + +### Code Example + +```python +import numpy as np +import pandas as pd +from sklearn.cluster import KMeans +from sklearn.preprocessing import StandardScaler +from sklearn.metrics import silhouette_score + +# Load dataset +data = pd.read_csv('path/to/your/dataset.csv') + +# Preprocess the data +scaler = StandardScaler() +data_scaled = scaler.fit_transform(data) + +# Initialize and fit KMeans model +kmeans = KMeans(n_clusters=3, random_state=42) +kmeans.fit(data_scaled) + +# Get cluster labels +labels = kmeans.labels_ + +# Calculate silhouette score +silhouette_avg = silhouette_score(data_scaled, labels) +print("Silhouette Score:", silhouette_avg) + +# Add cluster labels to the original data +data['Cluster'] = labels + +print(data.head()) +``` + +## Evaluation Metrics + +- **Silhouette Score**: Measures how similar a data point is to its own cluster compared to other clusters. +- **Inertia (Within-cluster Sum of Squares)**: Measures the compactness of the clusters. +- **Davies-Bouldin Index**: Measures the average similarity ratio of each cluster with the cluster that is most similar to it. +- **Dunn Index**: Ratio of the minimum inter-cluster distance to the maximum intra-cluster distance. + +## Conclusion + +Clustering is a powerful technique for discovering structure in data. Understanding different clustering algorithms and their evaluation metrics is crucial for selecting the appropriate method for a given problem. + +## References + +- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html) +- [Wikipedia: Cluster Analysis](https://en.wikipedia.org/wiki/Cluster_analysis) +- [Towards Data Science: A Comprehensive Guide to Clustering](https://towardsdatascience.com/a-comprehensive-guide-to-clustering-9789897f8b88) From 90e238ebf593caf7cf99ed1d213823f5219a062f Mon Sep 17 00:00:00 2001 From: Ritesh Date: Fri, 31 May 2024 10:18:24 +0530 Subject: [PATCH 25/99] Update index.md --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..1e0004d 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +- [Clustering](clustering.md) From 97f852c99616cab741e8c06469f239bd34b74dd6 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 31 May 2024 10:26:09 +0530 Subject: [PATCH 26/99] Added sklearn.md file --- contrib/machine-learning/index.md | 1 + contrib/machine-learning/sklearn.md | 144 ++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 contrib/machine-learning/sklearn.md diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..68bd24d 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +- [sklearn.md](sklearn.md) diff --git a/contrib/machine-learning/sklearn.md b/contrib/machine-learning/sklearn.md new file mode 100644 index 0000000..8174d93 --- /dev/null +++ b/contrib/machine-learning/sklearn.md @@ -0,0 +1,144 @@ +# scikit-learn (sklearn) Python Library + +## Overview + +scikit-learn, also known as sklearn, is a popular open-source Python library that provides simple and efficient tools for data mining and data analysis. It is built on NumPy, SciPy, and matplotlib. The library is designed to interoperate with the Python numerical and scientific libraries. + +## Key Features + +- **Classification**: Identifying which category an object belongs to. Example algorithms include SVM, nearest neighbors, random forest. +- **Regression**: Predicting a continuous-valued attribute associated with an object. Example algorithms include support vector regression (SVR), ridge regression, Lasso. +- **Clustering**: Automatic grouping of similar objects into sets. Example algorithms include k-means, spectral clustering, mean-shift. +- **Dimensionality Reduction**: Reducing the number of random variables to consider. Example algorithms include PCA, feature selection, non-negative matrix factorization. +- **Model Selection**: Comparing, validating, and choosing parameters and models. Example methods include grid search, cross-validation, metrics. +- **Preprocessing**: Feature extraction and normalization. + +## When to Use scikit-learn + +- **Use scikit-learn if**: + - You are working on machine learning tasks such as classification, regression, clustering, dimensionality reduction, model selection, and preprocessing. + - You need an easy-to-use, well-documented library. + - You require tools that are compatible with NumPy and SciPy. + +- **Do not use scikit-learn if**: + - You need to perform deep learning tasks. In such cases, consider using TensorFlow or PyTorch. + - You need out-of-the-box support for large-scale data. scikit-learn is designed to work with in-memory data, so for very large datasets, you might want to consider libraries like Dask-ML. + +## Installation + +You can install scikit-learn using pip: + +```bash +pip install scikit-learn +``` + +Or via conda: + +```bash +conda install scikit-learn +``` + +## Basic Usage with Code Snippets + +### Importing the Library + +```python +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score +``` + +### Loading Data + +For illustration, let's create a simple synthetic dataset: + +```python +from sklearn.datasets import make_classification + +X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) +``` + +### Splitting Data + +Split the dataset into training and testing sets: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) +``` + +### Preprocessing + +Standardizing the features: + +```python +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) +``` + +### Training a Model + +Train a Logistic Regression model: + +```python +model = LogisticRegression() +model.fit(X_train, y_train) +``` + +### Making Predictions + +Make predictions on the test set: + +```python +y_pred = model.predict(X_test) +``` + +### Evaluating the Model + +Evaluate the accuracy of the model: + +```python +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +``` + +### Putting it All Together + +Here is a complete example from data loading to model evaluation: + +```python +import numpy as np +from sklearn.datasets import make_classification +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score + +# Load data +X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) + +# Split data +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Preprocess data +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) + +# Train model +model = LogisticRegression() +model.fit(X_train, y_train) + +# Make predictions +y_pred = model.predict(X_test) + +# Evaluate model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +``` + +## Conclusion + +scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. \ No newline at end of file From b72cf4ad5a778264701ce634df9d7a6c6f5c5d49 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 11:12:37 +0530 Subject: [PATCH 27/99] adding Trie Data structure --- contrib/ds-algorithms/Trie.md | 152 ++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/Trie.md index e69de29..43f0415 100644 --- a/contrib/ds-algorithms/Trie.md +++ b/contrib/ds-algorithms/Trie.md @@ -0,0 +1,152 @@ +# Trie + +A Trie is a tree-like data structure used for storing a dynamic set of strings where the keys are usually strings. It is also known as prefix tree or digital tree. + +>Trie is a type of search tree, where each node represents a single character of a string. + +>Nodes are linked in such a way that they form a tree, where each path from the root to a leaf node represents a unique string stored in the Trie. + +## Characteristics of Trie +- **Prefix Matching**: Tries are particularly useful for prefix matching operations. Any node in the Trie represents a common prefix of all strings below it. +- **Space Efficiency**: Tries can be more space-efficient than other data structures like hash tables for storing large sets of strings with common prefixes. +- **Time Complexity**: Insertion, deletion, and search operations in a Trie have a time complexity of +𝑂(𝑚), where m is the length of the string. This makes Tries very efficient for these operations. + +## Structure of Trie + +Trie mainly consists of three parts: +- **Root**: The root of a Trie is an empty node that does not contain any character. +- **Edges**: Each edge in the Trie represents a character in the alphabet of the stored strings. +- **Nodes**: Each node contains a character and possibly additional information, such as a boolean flag indicating if the node represents the end of a valid string. + +To implement the nodes of trie. We use Classes in Python. Each node is an object of the Node Class. + +Node Class have mainly two components +- *Array of size 26*: It is used to represent the 26 alphabets. Initially all are None. While inserting the words, then array will be filled with object of child nodes. +- *End of word*: It is used to represent the end of word while inserting. + +Code Block of Node Class : + +``` +class Node: + def __init__(self): + self.alphabets = [None] * 26 + self.end_of_word = 0 +``` + +Now we need to implement Trie. We create another class named Trie with some methods like Insertion, Searching and Deletion. + +**Initialization:** In this, we initializes the Trie with a `root` node. + +Code Implementation of Initialization: + +``` +class Trie: + def __init__(self): + self.root = Node() +``` + +## Operations on Trie + +1. **Insertion**: Inserts the word into the Trie. This method takes `word` as parameter. For each character in the word, it checks if there is a corresponding child node. If not, it creates a new `Node`. After processing all the characters in word, it increments the `end_of_word` value of the last node. + +Code Implementation of Insertion: +``` +def insert(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + node.alphabets[index] = Node() + node = node.alphabets[index] + node.end_of_word += 1 +``` + +2. **Searching**: Search the `word` in trie. Searching process starts from the `root` node. Each character of the `word` is processed. After traversing the whole word in trie, it return the count of words. + +There are two cases in Searching: +- *Word Not found*: It happens when the word we search not present in the trie. This case will occur, if the value of `alphabets` array at that character is `None` or if the value of `end_of_word` of the node, reached after traversing the whole word is `0`. +- *Word found*: It happens when the search word is present in the Trie. This case will occur, when the `end_of_word` value is greater than `0` of the node after traversing the whole word. + +Code Implementation of Searching: +``` + def Search(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + return 0 + node = node.alphabets[index] + return node.end_of_word +``` + +3. **Deletion**: To delete a string, follow the path of the string. If the end node is reached and `end_of_word` is greater than `0` then decrement the value. + +Code Implementation of Deletion: + +``` +def delete(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + node = node.alphabets[index] + if node.end_of_word: + node.end_of_word-=1 +``` + +Python Code to implement Trie: + +``` +class Node: + def __init__(self): + self.alphabets = [None] * 26 + self.end_of_word = 0 + +class Trie: + def __init__(self): + self.root = Node() + + def insert(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + node.alphabets[index] = Node() + node = node.alphabets[index] + node.end_of_word += 1 + + def Search(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + return 0 + node = node.alphabets[index] + return node.end_of_word + + def delete(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + node = node.alphabets[index] + if node.end_of_word: + node.end_of_word-=1 + +if __name__ == "__main__": + trie = Trie() + + word1 = "apple" + word2 = "app" + word3 = "bat" + + trie.insert(word1) + trie.insert(word2) + trie.insert(word3) + + print(trie.Search(word1)) + print(trie.Search(word2)) + print(trie.Search(word3)) + + trie.delete(word2) + print(trie.Search(word2)) +``` From 0a6d9cd1bfedd86cd85a0414e92f43014e9e8c19 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 11:25:29 +0530 Subject: [PATCH 28/99] update index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 31cff39..653cc98 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,3 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Trie](Trie.md) From d00f146401afba7514f183291d40a62de92866ba Mon Sep 17 00:00:00 2001 From: Yogesh Vishwakarma Date: Fri, 31 May 2024 11:34:39 +0530 Subject: [PATCH 29/99] created Sliding_Window.md and updated index.md --- contrib/ds-algorithms/Sliding_Window.md | 249 ++++++++++++++++++++++++ contrib/ds-algorithms/index.md | 1 + 2 files changed, 250 insertions(+) create mode 100644 contrib/ds-algorithms/Sliding_Window.md diff --git a/contrib/ds-algorithms/Sliding_Window.md b/contrib/ds-algorithms/Sliding_Window.md new file mode 100644 index 0000000..72aa191 --- /dev/null +++ b/contrib/ds-algorithms/Sliding_Window.md @@ -0,0 +1,249 @@ +# Sliding Window Technique + +The sliding window technique is a fundamental approach used to solve problems involving arrays, lists, or sequences. It's particularly useful when you need to calculate something over a subarray or sublist of fixed size that slides over the entire array. + +In easy words, It is the transformation of the nested loops into the single loop +## Concept + +The sliding window technique involves creating a window (a subarray or sublist) that moves or "slides" across the entire array. This window can either be fixed in size or dynamically resized. By maintaining and updating this window as it moves, you can optimize certain computations, reducing time complexity. + +## Types of Sliding Windows + +1. **Fixed Size Window**: The window size remains constant as it slides from the start to the end of the array. +2. **Variable Size Window**: The window size can change based on certain conditions, such as the sum of elements within the window meeting a specified target. + +## Steps to Implement a Sliding Window + +1. **Initialize the Window**: Set the initial position of the window and any required variables (like sum, count, etc.). +2. **Expand the Window**: Add the next element to the window and update the relevant variables. +3. **Shrink the Window**: If needed, remove elements from the start of the window and update the variables. +4. **Slide the Window**: Move the window one position to the right by including the next element and possibly excluding the first element. +5. **Repeat**: Continue expanding, shrinking, and sliding the window until you reach the end of the array. + +## Example Problems + +### 1. Maximum Sum Subarray of Fixed Size K + +Given an array of integers and an integer k, find the maximum sum of a subarray of size k. + +**Steps:** + +1. Initialize the sum of the first k elements. +2. Slide the window from the start of the array to the end, updating the sum by subtracting the element that is left behind and adding the new element. +3. Track the maximum sum encountered. + +**Python Code:** + +```python +def max_sum_subarray(arr, k): + n = len(arr) + if n < k: + return None + + # Compute the sum of the first window + window_sum = sum(arr[:k]) + max_sum = window_sum + + # Slide the window from start to end + for i in range(n - k): + window_sum = window_sum - arr[i] + arr[i + k] + max_sum = max(max_sum, window_sum) + + return max_sum + +# Example usage: +arr = [1, 3, 2, 5, 1, 1, 6, 2, 8, 5] +k = 3 +print(max_sum_subarray(arr, k)) # Output: 16 +``` + +### 2. Longest Substring Without Repeating Characters + +Given a string, find the length of the longest substring without repeating characters. + +**Steps:** + +1. Use two pointers to represent the current window. +2. Use a set to track characters in the current window. +3. Expand the window by moving the right pointer. +4. If a duplicate character is found, shrink the window by moving the left pointer until the duplicate is removed. + +**Python Code:** + +```python +def longest_unique_substring(s): + n = len(s) + char_set = set() + left = 0 + max_length = 0 + + for right in range(n): + while s[right] in char_set: + char_set.remove(s[left]) + left += 1 + char_set.add(s[right]) + max_length = max(max_length, right - left + 1) + + return max_length + +# Example usage: +s = "abcabcbb" +print(longest_unique_substring(s)) # Output: 3 +``` +## 3. Minimum Size Subarray Sum + +Given an array of positive integers and a positive integer `s`, find the minimal length of a contiguous subarray of which the sum is at least `s`. If there isn't one, return 0 instead. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Expand the window by moving `right` and adding `arr[right]` to `current_sum`. +3. If `current_sum` is greater than or equal to `s`, update `min_length` and shrink the window from the left by moving `left` and subtracting `arr[left]` from `current_sum`. +4. Repeat until `right` has traversed the array. + +### Python Code: +```python +def min_subarray_len(s, arr): + n = len(arr) + left = 0 + current_sum = 0 + min_length = float('inf') + + for right in range(n): + current_sum += arr[right] + + while current_sum >= s: + min_length = min(min_length, right - left + 1) + current_sum -= arr[left] + left += 1 + + return min_length if min_length != float('inf') else 0 + +# Example usage: +arr = [2, 3, 1, 2, 4, 3] +s = 7 +print(min_subarray_len(s, arr)) # Output: 2 (subarray [4, 3]) +``` + +## 4. Longest Substring with At Most K Distinct Characters + +Given a string `s` and an integer `k`, find the length of the longest substring that contains at most `k` distinct characters. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Use a dictionary `char_count` to count characters in the window. +3. Expand the window by moving `right` and updating `char_count`. +4. If `char_count` has more than `k` distinct characters, shrink the window from the left by moving `left` and updating `char_count`. +5. Keep track of the maximum length of the window with at most `k` distinct characters. + +### Python Code: +```python +def longest_substring_k_distinct(s, k): + n = len(s) + char_count = {} + left = 0 + max_length = 0 + + for right in range(n): + char_count[s[right]] = char_count.get(s[right], 0) + 1 + + while len(char_count) > k: + char_count[s[left]] -= 1 + if char_count[s[left]] == 0: + del char_count[s[left]] + left += 1 + + max_length = max(max_length, right - left + 1) + + return max_length + +# Example usage: +s = "eceba" +k = 2 +print(longest_substring_k_distinct(s, k)) # Output: 3 (substring "ece") +``` + +## 5. Maximum Number of Vowels in a Substring of Given Length + +Given a string `s` and an integer `k`, return the maximum number of vowel letters in any substring of `s` with length `k`. + +### Steps: +1. Use a sliding window of size `k`. +2. Keep track of the number of vowels in the current window. +3. Expand the window by adding the next character and update the count if it's a vowel. +4. If the window size exceeds `k`, remove the leftmost character and update the count if it's a vowel. +5. Track the maximum number of vowels found in any window of size `k`. + +### Python Code: +```python +def max_vowels(s, k): + vowels = set('aeiou') + max_vowel_count = 0 + current_vowel_count = 0 + + for i in range(len(s)): + if s[i] in vowels: + current_vowel_count += 1 + if i >= k: + if s[i - k] in vowels: + current_vowel_count -= 1 + max_vowel_count = max(max_vowel_count, current_vowel_count) + + return max_vowel_count + +# Example usage: +s = "abciiidef" +k = 3 +print(max_vowels(s, k)) # Output: 3 (substring "iii") +``` + +## 6. Subarray Product Less Than K + +Given an array of positive integers `nums` and an integer `k`, return the number of contiguous subarrays where the product of all the elements in the subarray is less than `k`. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Expand the window by moving `right` and multiplying `product` by `nums[right]`. +3. If `product` is greater than or equal to `k`, shrink the window from the left by moving `left` and dividing `product` by `nums[left]`. +4. For each position of `right`, the number of valid subarray ending at `right` is `right - left + 1`. +5. Sum these counts to get the total number of subarray with product less than `k`. + +### Python Code: +```python +def num_subarray_product_less_than_k(nums, k): + if k <= 1: + return 0 + + product = 1 + left = 0 + count = 0 + + for right in range(len(nums)): + product *= nums[right] + + while product >= k: + product /= nums[left] + left += 1 + + count += right - left + 1 + + return count + +# Example usage: +nums = [10, 5, 2, 6] +k = 100 +print(num_subarray_product_less_than_k(nums, k)) # Output: 8 +``` + +## Advantages + +- **Efficiency**: Reduces the time complexity from O(n^2) to O(n) for many problems. +- **Simplicity**: Provides a straightforward way to manage subarrays/substrings with overlapping elements. + +## Applications + +- Finding the maximum or minimum sum of subarrays of fixed size. +- Detecting unique elements in a sequence. +- Solving problems related to dynamic programming with fixed constraints. +- Efficiently managing and processing streaming data or real-time analytics. + +By using the sliding window technique, you can tackle a wide range of problems in a more efficient manner. diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 31cff39..d3c3c27 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,3 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Sliding Window Technique](Sliding_Window.md) From 56e972133ff33ca0532c6d0637fb465425b41c09 Mon Sep 17 00:00:00 2001 From: manishh12 Date: Fri, 31 May 2024 12:02:09 +0530 Subject: [PATCH 30/99] added types of cost functions issue#625 --- .../Types_of_Cost_Functions.md | 227 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 228 insertions(+) create mode 100644 contrib/machine-learning/Types_of_Cost_Functions.md diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/Types_of_Cost_Functions.md new file mode 100644 index 0000000..547a05e --- /dev/null +++ b/contrib/machine-learning/Types_of_Cost_Functions.md @@ -0,0 +1,227 @@ + +# Cost Functions in Machine Learning + +Cost functions, also known as loss functions, play a crucial role in training machine learning models. They measure how well the model performs on the training data by quantifying the difference between predicted and actual values. Different types of cost functions are used depending on the problem domain and the nature of the data. + +## Types of Cost Functions + +### 1. Mean Squared Error (MSE) + +**Explanation:** +MSE is one of the most commonly used cost functions, particularly in regression problems. It calculates the average squared difference between the predicted and actual values. + +**Mathematical Formulation:** +The MSE is defined as: +$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual value. +- \( y^i\) is the predicted value. + +**Advantages:** +- Sensitive to large errors due to squaring. +- Differentiable and convex, facilitating optimization. + +**Disadvantages:** +- Sensitive to outliers, as the squared term amplifies their impact. + +**Python Implementation:** +```python +import numpy as np + +def mean_squared_error(y_true, y_pred): + n = len(y_true) + return np.mean((y_true - y_pred) ** 2) +``` + +### 2. Mean Absolute Error (MAE) + +**Explanation:** +MAE is another commonly used cost function for regression tasks. It measures the average absolute difference between predicted and actual values. + +**Mathematical Formulation:** +The MAE is defined as: +$$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual value. +- \( y^i\) is the predicted value. + +**Advantages:** +- Less sensitive to outliers compared to MSE. +- Provides a linear error term, which can be easier to interpret. + + +**Disadvantages:** +- Not differentiable at zero, which can complicate optimization. + +**Python Implementation:** +```python +import numpy as np + +def mean_absolute_error(y_true, y_pred): + n = len(y_true) + return np.mean(np.abs(y_true - y_pred)) +``` + +### 3. Cross-Entropy Loss (Binary) + +**Explanation:** +Cross-entropy loss is commonly used in binary classification problems. It measures the dissimilarity between the true and predicted probability distributions. + +**Mathematical Formulation:** +For binary classification, the cross-entropy loss is defined as: +$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual class label (0 or 1). +- \( y^i\) is the predicted probability of the positive class. + + +**Advantages:** +- Penalizes confident wrong predictions heavily. +- Suitable for probabilistic outputs. + +**Disadvantages:** +- Sensitive to class imbalance. + +**Python Implementation:** +```python +import numpy as np + +def binary_cross_entropy(y_true, y_pred): + n = len(y_true) + return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) +``` + +### 4. Cross-Entropy Loss (Multiclass) + +**Explanation:** +For multiclass classification problems, the cross-entropy loss is adapted to handle multiple classes. + +**Mathematical Formulation:** +The multiclass cross-entropy loss is defined as: +$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) $$ +Where: +- \( n \) is the number of samples. +- \( C \) is the number of classes. +- \( y_{i,c} \) is the indicator function for the true class of sample \( i \). + +- (y^i,c) is the predicted probability of sample \( i \) belonging to class \( c \). + +**Advantages:** +- Handles multiple classes effectively. +- Encourages the model to assign high probabilities to the correct classes. + +**Disadvantages:** +- Requires one-hot encoding for class labels, which can increase computational complexity. + +**Python Implementation:** +```python +import numpy as np + +def categorical_cross_entropy(y_true, y_pred): + n = len(y_true) + return -np.mean(np.sum(y_true * np.log(y_pred), axis=1)) +``` + +### 5. Hinge Loss (SVM) + +**Explanation:** +Hinge loss is commonly used in support vector machines (SVMs) for binary classification tasks. It penalizes misclassifications by a linear margin. + +**Mathematical Formulation:** +For binary classification, the hinge loss is defined as: +$$ \text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual class label (-1 or 1). +- \( \hat{y}_i \) is the predicted score for sample \( i \). + +**Advantages:** +- Encourages margin maximization in SVMs. +- Robust to outliers due to the linear penalty. + +**Disadvantages:** +- Not differentiable at the margin, which can complicate optimization. + +**Python Implementation:** +```python +import numpy as np + +def hinge_loss(y_true, y_pred): + n = len(y_true) + loss = np.maximum(0, 1 - y_true * y_pred) + return np.mean(loss) +``` + +### 6. Huber Loss + +**Explanation:** +Huber loss is a combination of MSE and MAE, providing a compromise between the two. It is less sensitive to outliers than MSE and provides a smooth transition to MAE for large errors. + +**Mathematical Formulation:** + +The Huber loss is defined as: + + +$$ +\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ +\begin{array}{ll} +\frac{1}{2} (y_i - \hat{y}_i)^2 & \text{if } |y_i - \hat{y}_i| \leq \delta \\ +\delta(|y_i - \hat{y}_i| - \frac{1}{2} \delta) & \text{otherwise} +\end{array} +\right. +$$ +Where: +- \( n \) is the number of samples. +- \( \delta \) is a threshold parameter. + +**Advantages:** +- Provides a smooth loss function. +- Less sensitive to outliers than MSE. + +**Disadvantages:** +- Requires tuning of the threshold parameter. + +**Python Implementation:** +```python +import numpy as np + +def huber_loss(y_true, y_pred, delta): + error = y_true - y_pred + loss = np.where(np.abs(error) <= delta, 0.5 * error ** 2, delta * (np.abs(error) - 0.5 * delta)) + return np.mean(loss) +``` + +### 7. Log-Cosh Loss + +**Explanation:** +Log-Cosh loss is a smooth approximation of the MAE and is less sensitive to outliers than MSE. It provides a smooth transition from quadratic for small errors to linear for large errors. + +**Mathematical Formulation:** +The Log-Cosh loss is defined as: +$$ \text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i)) $$ +Where: +- \( n \) is the number of samples. + +**Advantages:** +- Smooth and differentiable everywhere. +- Less sensitive to outliers. + +**Disadvantages:** +- Computationally more expensive than simple losses like MSE. + +**Python Implementation:** +```python +import numpy as np + +def logcosh_loss(y_true, y_pred): + error = y_true - y_pred + loss = np.log(np.cosh(error)) + return np.mean(loss) +``` + +These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. + +--- \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..cfe9a67 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +-[Types_of_Cost_Functions](Types_of_Cost_Functions.md) From d23389a8ea17ca0d16b96b14b710ac41606e8383 Mon Sep 17 00:00:00 2001 From: Manish kumar gupta <97523900+manishh12@users.noreply.github.com> Date: Fri, 31 May 2024 12:07:34 +0530 Subject: [PATCH 31/99] Updated maths formulas --- .../Types_of_Cost_Functions.md | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/Types_of_Cost_Functions.md index 547a05e..f650726 100644 --- a/contrib/machine-learning/Types_of_Cost_Functions.md +++ b/contrib/machine-learning/Types_of_Cost_Functions.md @@ -12,7 +12,7 @@ MSE is one of the most commonly used cost functions, particularly in regression **Mathematical Formulation:** The MSE is defined as: -$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ +$$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$ Where: - \( n \) is the number of samples. - \( y_i \) is the actual value. @@ -41,7 +41,7 @@ MAE is another commonly used cost function for regression tasks. It measures the **Mathematical Formulation:** The MAE is defined as: -$$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ +$$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$$ Where: - \( n \) is the number of samples. - \( y_i \) is the actual value. @@ -70,8 +70,11 @@ def mean_absolute_error(y_true, y_pred): Cross-entropy loss is commonly used in binary classification problems. It measures the dissimilarity between the true and predicted probability distributions. **Mathematical Formulation:** + For binary classification, the cross-entropy loss is defined as: -$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] $$ + +$$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]$$ + Where: - \( n \) is the number of samples. - \( y_i \) is the actual class label (0 or 1). @@ -100,8 +103,11 @@ def binary_cross_entropy(y_true, y_pred): For multiclass classification problems, the cross-entropy loss is adapted to handle multiple classes. **Mathematical Formulation:** + The multiclass cross-entropy loss is defined as: -$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) $$ + +$$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})$$ + Where: - \( n \) is the number of samples. - \( C \) is the number of classes. @@ -131,8 +137,11 @@ def categorical_cross_entropy(y_true, y_pred): Hinge loss is commonly used in support vector machines (SVMs) for binary classification tasks. It penalizes misclassifications by a linear margin. **Mathematical Formulation:** + For binary classification, the hinge loss is defined as: -$$ \text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) $$ + +$$\text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)$$ + Where: - \( n \) is the number of samples. - \( y_i \) is the actual class label (-1 or 1). @@ -165,17 +174,16 @@ Huber loss is a combination of MSE and MAE, providing a compromise between the t The Huber loss is defined as: -$$ -\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ +$$\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ \begin{array}{ll} \frac{1}{2} (y_i - \hat{y}_i)^2 & \text{if } |y_i - \hat{y}_i| \leq \delta \\ \delta(|y_i - \hat{y}_i| - \frac{1}{2} \delta) & \text{otherwise} \end{array} -\right. -$$ +\right.$$ + Where: - \( n \) is the number of samples. -- \( \delta \) is a threshold parameter. +- \(delta\) is a threshold parameter. **Advantages:** - Provides a smooth loss function. @@ -200,8 +208,11 @@ def huber_loss(y_true, y_pred, delta): Log-Cosh loss is a smooth approximation of the MAE and is less sensitive to outliers than MSE. It provides a smooth transition from quadratic for small errors to linear for large errors. **Mathematical Formulation:** + The Log-Cosh loss is defined as: -$$ \text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i)) $$ + +$$\text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i))$$ + Where: - \( n \) is the number of samples. @@ -224,4 +235,4 @@ def logcosh_loss(y_true, y_pred): These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. ---- \ No newline at end of file +--- From 81f173780eecd167205477e69a5e145462fd4803 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:31:32 +0530 Subject: [PATCH 32/99] Add files via upload --- contrib/plotting-visualization/barplot.png | Bin 0 -> 10644 bytes contrib/plotting-visualization/histogram.png | Bin 0 -> 14636 bytes contrib/plotting-visualization/matplotlib.md | 87 ++++++++++++++++++ .../plotting-visualization/scatterplot.png | Bin 0 -> 13739 bytes 4 files changed, 87 insertions(+) create mode 100644 contrib/plotting-visualization/barplot.png create mode 100644 contrib/plotting-visualization/histogram.png create mode 100644 contrib/plotting-visualization/matplotlib.md create mode 100644 contrib/plotting-visualization/scatterplot.png diff --git a/contrib/plotting-visualization/barplot.png b/contrib/plotting-visualization/barplot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c9446ef38540209af0719b53286293a69058f2 GIT binary patch literal 10644 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib.md new file mode 100644 index 0000000..720dff8 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib.md @@ -0,0 +1,87 @@ +# Introducing MatplotLib + +Data visualisation is the analysing and understanding the data via graphical representation of the data by the means of pie charts, histograms, scatterplots and line graphs. + +To make this process of data visualization easier and clearer, matplotlib library is used. + +## Features of MatplotLib library +- MatplotLib library is one of the most popular python packages for 2D representation of data +- Combination of matplotlib and numpy is used for easier computations and visualization of large arrays and data. Matplotlib along with NumPy can be considered as the open source equivalent of MATLAB. + +- Matplotlib has a procedural interface named the Pylab, which is designed to resemble MATLAB. However, it is completely independent of Matlab. + +## Starting with Matplotlib + +### 1.] Install and import the neccasary libraries - mayplotlib.pylplot +```python +pip install matplotlib +``` + +```python +import maptplotlib.pyplot as plt +import numpy as np +``` + + + +### 2.] Scatter plot +Scatter plot is a type of plot that uses the cartesian coordinates between x and y to describe the relation between them. It uses dots to represent relation between the data variables of the data set. + +```python +x = [5,4,5,8,9,8,6,7,3,2] +y = [9,1,7,3,5,7,6,1,2,8] + +plt.scatter(x,y, color = "red") + +plt.title("Scatter plot") +plt.xlabel("X values") +plt.ylabel("Y values") + +plt.tight_layout() +plt.show() +``` + +![img](scatterplot.png) + + + +### 3.] Bar plot +Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. + +```python +x = np.array(['A','B','C','D']) +y = np.array([42,50,15,35]) + +plt.bar(x,y,color = "red") + +plt.title("Bar plot") +plt.xlabel("X values") +plt.ylabel("Y values") + +plt.show() +``` +![img](barplot.png) + + +### 4.] Histogram +Histogram is the representation of frequency distribution of qualitative data. The height of each rectangle defines the amount, or how often that variable appears. + +```python +x = [9,1,7,3,5,7,6,1,2,8] + +plt.hist(x, color = "red", edgecolor= "white", bins =5) + +plt.title("Histogram") +plt.xlabel("X values") +plt.ylabel("Frequency Distribution") + +plt.show() +``` + +![img](histogram.png) + + + + + + diff --git a/contrib/plotting-visualization/scatterplot.png b/contrib/plotting-visualization/scatterplot.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91484f54e9dc6e492862c036bab2a804add3b GIT binary patch literal 13739 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 A>Hq)$ literal 0 HcmV?d00001 From 4c4c4ff6bd75495d3f50c944163491d93838b916 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:33:06 +0530 Subject: [PATCH 33/99] Add files via upload --- .../plotting-visualization/images/barplot.png | Bin 0 -> 10644 bytes .../plotting-visualization/images/histogram.png | Bin 0 -> 14636 bytes .../images/scatterplot.png | Bin 0 -> 13739 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/barplot.png create mode 100644 contrib/plotting-visualization/images/histogram.png create mode 100644 contrib/plotting-visualization/images/scatterplot.png diff --git a/contrib/plotting-visualization/images/barplot.png b/contrib/plotting-visualization/images/barplot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c9446ef38540209af0719b53286293a69058f2 GIT binary patch literal 10644 zcmd^FXIN9)nvTbIM1`Y*91-ClAW{TD=}iT}NR!?{q!W-5dLY=bAqWD}J4lz%JBmt^ z4x#tnr9%Q_zJ2Z;=T5oPe$34C%n!@6v$M0;T3>m~_u`JS{BbGyrJR1%x!njWc>w3 zUsbCm^SGJnFTc|nsy$D-e&;r-SoY$L)0aZ6c&(lu83}wcKF=)meT=7&O;Kd^>|pj( z*py>ar090NNuaQ0Qlzz_t4Dqmxy*K;S>;~0gbQNknVQqJvW+q= zqdmSY@}sD1`8|2B}D;W>@a%2@iSYQc+ROGc{t6`$e&n-I9kM zEFB@>P^dkV@9+5;B-}re_c~J5>CT=_H*W~B?k{o-E#Lk2O|G-Elaq~YoKSeM%Ev+W z(6w}{p^EYwGBR|u7m+wia5sbMx_`<7&5VJwJ5p_gJ?f??UwI5JRvSF zZniroVX<^c%6q+2d$EQ?B|78a(bGki;<){H`QFr`eo%!rB-vMN%Y~TF)V^gUHB)v} zIy*Y1E69thI!hCw#>C9R!L-+}kHOnpZ?8;*Up9FJ>%ZzcujB91m8qXnIOwU+o~)!^ z^X6Pj+69> z1|K^=Z>y=PIfMMp(B6jdLVvOPLSJFmV;ZRsD=SW!hNW8eWy^A}D3K`lu!E>jljYH` zA&J=g$|>#jjg69)yFnZ(p8eVB>A8of8Lj*nMcYh^*|`7sqpCO8QYC0|da%5dz0Pwg z%B{b_fH$mVXRaJm*2 z$zKbVstSJ)PolDQKHhyu%rZ>R$8^m$3J-NWKf${8%6Mlqvd|UIaDd{yHmzE0zcu1jI^HwwsmqNT@7{LA_sw=^z9XYU(OZaVU4JcNu3}wr?>*t-;>v>qM7Py2`()_bmus@Hu;>*z z#38|sEPW8S6l|_LWjjWew?_?oiJadb+Zic}l?&8RS7${dTTOfNWIT=3)-^bz^1;!s zugX`}r6@aC-H-`KjY%KMrVsnfBMvIJr9s0$4L!ZIx2*D>5?XqCvv>nBiYhB=WAyp4 z2U@De#@UrS6MV2rEy~_5JNn_nhmgiLR#pz#Za;>vmv0W@jJCrkCMNWXos!6S7nl4H z9^Lrsj}Jv{+OeaNBouR*P3$tlHI8Lw31Wy=OM~T1+G?-_p zrG>5wy)Hdh))xA-)l-x^IbyuxySsHR>E+#mc&3*eg_JnETjR6io2(cXKT_?B8U6BN zu^}6`HXS$9o>JPSq^ummCP|u3xUHa|e)n$dV)0aTL-g4y^N(Z#C(1&6Xrc>to)~-m zafY_Bcc+c5?V64>2S?3pdy4;rvsmVnCkHT)48-}K+~(p8-N4|mu%2luu1XTglu+ZC{Ci)ikmxUrR8FCzqcb-*Gt)7~Zzt7=SvE!H5D0{f z_wRpi7;$jm6dK;o7~&FrWgb;^8L2W=5BKlRx{2>Ay4v*iUzXm#T!Aw~p)Q|h*^ffK zp4eo5-qqcW8b*S-r4<(85fgkp=jcJy6v za4M!Ni{7h$N#=rtgh88|&u^B}7tWzjTLrVTHeYLMN`2lKKOge_-cuNK{``5Q>>tCX zw%-uxq5rRSgr9d41kIv7CeMg6Qv2)QxbcX*+@7MsedUUJYildj(WB~~o+W8%X||ES z!z-NZ^RG3)E##+t_~0-kbiaQZZ%bO6(aX09URhnuH>o}p92$z**;*D-K8iwly;!Kc zDsb`QEk{SkDIT|CgZjEURU@Nlxi^fQXuUG`9Ma}ec4LGvX1XO#+fxID8aB0+KA#IY z=Q7iFv)prCO-}9^HM0~Cy0^l+barkoI6QpTNEq^Upu|Pp(J{wx>=zV@`QF@#Fcz6- z7lnnjp~I=)y!mwUdsu==^|P5JA4(|~H#Z$4W5&ipA5MZpNJuLFN3yFKC=s^kpodWi3*a6%{)ISY$fNac<@7M188`$L(5$a&vP9Et?qa{hp@>SDS1e z(B^9(;C?|J%Gu3KTEal@B5f?BH%n6tV5Mp4>FqhDH4?ORy1LoY5f8ylOouk^+ruv1O9m6f$3gzPjlG{*5|d3hSXG|XDJZ`U6z9B~$- zJ8@#f5khINj#wD7w=lG)RM_wI3Sv78VyZD(QXh&zxQJu?c~(|ImsyR*_xv)ds;V!a zKfj};6{4o5R&?(O3U!MhYF4qcqM#HhqDtABlBPR#Dk0*22|7a9UQ1E&HJkNdnFrOc zzutj^hD`|$2}yo>l)hIKfYlEc>V}o2D|4_Wx-(}uLmR&KDO!msZ{+*?_$d6+BCE8! zy`Vl-3xMS6;Xfn(Ch~vN6Y$k4ohSd42>-7y)0u6e}^j?IEbumjro^`MoD?=g@uK^eDg+2N9TQ8dplHH^PvFP`IIf$TCbHl z4pKIS#K(T&f+tUmly`|%re4y{j+b5c$Lr857^LxKO6rh4#-_O1j*gCttgJEs>Pp0% zr-zLeor>QD1tlQm9?HCilM~@IpHYTVgpl>>WTTKWoU7N<1(u+&uv7?iE5~nlPt6K+ z3{5R9BZr8do}Tb4mTwB>528>~wFRsK=H}*}^Eown&NFIHpFDB5E4^ab^sZsTX{f%w zzO29ws)oMp(J+8Ya{$^(MxLFerKL@bjr{{z=;~Cn_MJNc_e@PSwY5`BYua~#SVN8g|xsZIqSKTzt10+fi{`p?sS{dQaA4rQ8VL2On(osABO@aWA`Y=N1n7gDVq(4JUb7vk;ryo0;^X6K zPn?L$$lyszOtgX`=lUAiy4RT;WTW~rk5$^=ev4gObM7P(;jv0b>3Q>TJg^*A#t?`T zn%3~2SvRq}YR*W#be~44tJlY_r*LC=$sUag|BxzOX-8p%2Jj%{Kg9ul#?t@j-Q2Z{ z&?<{;seK1d8I%7pb2`!pmVrmLg{p>gwA79tj^4J1$lv}^~n(KxP$aooRXuQL3mJZD{i7#nD znO<30aRy9zI}lPWWp9_9UR0zb<4bMVw(&DglHdiGsOKEq-EdYV#63(yMZUkix56V% z_r~6oV53|p*WNwyW(*7r8ft3sfaHueTtoPbvj9&ci|Q-1*Y@@JuN*w2U@S(Gyj6(`&a<}vs2QPV%Md?f%$!p9zX6Zb+c#Z;NTV)*GHq# zp4$_lboBHoB_(3##9hCe?xv-2ZFWh=gk7<$pKvO+hw{@H4NdfYTo21B;IYk8WX0ph zk8|>}+gTG5S#9I^Oe}c4X=cBUllTI6~T` zwublLl#{dhx2nt4?U(FOI)=i}2{cQrz6K8Wfj|&YdVl#kkmNwx-+%v*6789$+b8BU z{(P~Lg4fj0xF{f?_Tt401RwXydrUS)q&#?lN=ivdFDTHmwzdYQV}g|jkpVwTkdmK- zfTcQeWO-7;sAj5mi&IMeo6oYSfYlMB+ztK(ED};{OO(B(lF4uk?dj9WK09N~fr%+G z_+D>aAvovYmiYh=0QT=9BGT!N+^<93Uz~um?ugl2x%>A$O%6`zqIV^&H6h4H7*%gsO<|nW{Z-;6Sb8+Z8)2tD=mDa4|fshb7l(;_khnGXKX3wb4rNzgex3{B) za}F#!DUhNZ)wZ*}>e49KM8UE*(^w_Vj8<4g4Q%&^o|(Bm;g$R#F- zf>_aTS^>~j0;@+_lCnBnMHs#QV1lZC4=x`D#b7}c9ul63W@#_SZ4#rQ2FCV;dlQy) zW4t%Q0K;cMe)&&;LNaGg1D(Bv7ET)pl9I7E;(1Uz{8ufSi~<{xZ5+OBy}?12+UPc& z?a57f!zdbGVAp5U9F0&!|Euml?q(WSR?x|T8YWU{!Tgq!mzP-LGS`t~Du3|6fs23q zaZPx@If#&(yAHS8Of^Mi@^e7^h=zO1Cdb8Hhi)C1_~x8=T3H!zD~s&qslG6PYPn^6Rsm>4Fx>uV!2Lez*4_>qm(=-Uz(v zwrJpYR#+LzxVp1*o>qp=$of9mL*6eYhO=Xy5yO48+^8 zN}^VlL26l<#O`{wk7iev;W}^-cWgz&H&FrnO9*TFsoGd}=oU4TSTnty(h#;(XkEa| z+glUlT|hHg7%1Iz5`uJX;c3KU(4@s%-`kQDTvi)}=fW{rtqOeQiQL5Cut@H08|@8E)ta*xiS|nU%q2sz8=!n)&`ZTo8byv zzlw%vooP$T_t#18qd6o@W}(K=fe{5!;>}Kf5-@ zOwr*DRp966hcjxAavS7C_ZHg6AbUGHdhhr-v9-XyjI1oAm4h+~l17>M$Lf)Rg}50# za`q)MQL19~(vb@zf|wXB&qks3sX~<~)-k7IHZ(BZz(l|n=@k`5si~=pE&$q*o(b(d z#_eo=etue3)jWtGn}oJDwR2KlI-H!G+MWgwrlz)%=Mm-wNsP1$DjFKMn9Y-C z&ZM@q-1)ocVCFCAz_xs+*YRP)1j6R(f;bdNi~E z%|sXeWkdEZeW-E5UkXA)w)ZR)h5amJDZiefObiVLw&+2n@NGu8tks$Sn85yzl8(Ox z^N;4CQ)ONBtzJBmWfWq*dEkf4e}{nouf4zR@i2cW(yc$0ALp6#zSVIc`8JO^HW032 zh&(Qf{fN17TS=)CSi!=X(-2sU`ZAM{s|bL4bns{sdFv=&S?u=e)Led-QG3WG{f;a{ zaezQGfaZ}0hZh?uw^8F`r za&i`Hnm7P{zkU05QQynUE4>K-_WW2bOS{_Nko$QixSDq|=6D!n5?T$oRm}Xlu5R1j(+*-mAb0xTbwS)-vzck@$cTzp5*`(Qt_FX9)gH%+fy;6OUxn;*MMpO zn^!BmKY-{cbBJdE@<<1`B$B&p?Xzu3ukKgwx{{v(=#i=>2J{rzMaaGWeWXI#^xH8s zz{ns3!-B}I#-SY9vY$pG7G#B)@<%~ER&?? zMK(5Bh|X4Grv3sFSzD+WnlL(UEvs*@&xA|j3S8&A;}R3ukhB0H$<-gu-*$49Wp(rw z-z*r5NeExtxBt*Iq>y@FfnB~;>-kc7h%lkmnSfN#e1Vq#sZXB}X z^s!0W_1u^$FxRCwY)+9$W(QCUGIS(1q^72(@A7dyC9}kVQ?dCU?RV+PMCtq$yd;4B z^L#6UUSeiquJa$Ns;+@3=)nV;mzse=zemg!?4%-S#MR!FIXS9BcyeZZLIMbidM-vm z8rs@mLKp$v1@-tNj?w)DJTk`^p1iTc)6lj&R@0fJ5c(=>s-5K&=;`C*X5gI6Z1mZO zt{J|krK7Wkjy2`|rhVpJ`^=gS5qO(cbcex-6DP_Xc4&V-%79+{BsN6F_ca?LRR>*A zY8(Fa*k#O5cs422sO`lmj;rSNw13^!?SNwPV(B^c5@SpvdB=t&N7YMkk?$-e@fH%~UuFVHc z9E_N`5dHgrLEa7|#67K`gxi5m2+&;6rsE=FegQ>w^|z$GG0BB!sUQM+ueHj9(o+a~ zTQ}XBpsA`F_wpqb>>?*vBxB$Fa&bHc$&U}yAbvOC#P%ipruf2Oxjx7$h#d(aWPyn$ zbYvd00ehyGYvBiFDXxYIrwHF|2e|@_``_if-W)4SNlupI*2-uB+N7bYo7&%RuuJNy zEWq)&KWv|Irce{0o=UEFs51!JzOUFLVZMI((k*dLZ}zP`(_7#VkRYAVA2wGIj~y{! z?IMqb&XKcwFj>WNi0Fe*(U_fa4)C2j`S8m}BRH<^mp982KrlQ4!Lp5|2Y_Vjq=B*6rxm*!`gEsHb6vU8&U&wDbhCCl2Ha0BPEPbv1vzUV z;rGV@#r5OkU4i0(9Lsf9I`y1es z_L&au?6S5*<521$Wa~hq=<}wi_>h9Ymstm+5$Q7djskfa&}qgUMDpy1q)O#K(dD@< z8LiLvv@i0%{&XTN{R|?=U6_4vprn_B>J@`0rIt9)#KZJNkL3BX?;{Qf!3FA1 zz|rR20fi7aQ{LTAzW@~-jjZtp1#80hMmmBdLGH=~ak*5U{}7zbNkFDzo@*bHm7_eH z-iE>l6R^3U)Df)3++{$J1DlK;E$`3N2@8o24`&!~YPck%@~j~T9=n$E(|{2y3&Q z3NS;^f^C*e;fQv>0on5M#S2vc$VT4lnx!?><|5?q<5W~?zSQU5y?d7k7zYDAIx=zS z81<{%I!N`nTT=h-T+HA0tgVB8#a3X&8khj9%eDe)M&q+391^ky+ zq=vLU2c<~@FYXM34vf^kFwrn=RNy!!hfG@l41DSD-<9AmHM^{zOwViZLCTwi^gV!F zC96&15!)QU#O8xLR|dze0OBX9rx~Aon92PbNL}C-wjJzhuB}B10HO;Ng)a2u%0uyM z1HYdejR;B?l)@81?63hF2yx%o(FK64 zH)z432GU@Kf#e#<)J5cYY;QUJXXwJRWdywUWdp@L;N(*-mspK@k+`P>Jwr!!Fj{>T>#uX14B!$(o!%$6#VYpG%_HRtQ3KiE9g%E8lv2A z`}PfaW5|15nV^a4AmtyXPGSN5_ZO;2?`n`Ym%1u<8Y(ZsI02GO1oMUtnE%<-Hye^( zI`m){;YSZBBA^akfSD+m1k!;~usa}yxPV+UgHQ$#-n~9exqzdAL?WX2%yw}4F$mrU zj_)MBS6I1=*jF7e48((m&}xTjkNva&edSgl2;m)|lc0y9=E>ej_mCpbUqM9NM}0>i zZ*6SSz;6)5ZP@194;ew*6Q4SXMQx106h(HJC^i|O$7-`QA9}Vm!52><56#ta#H4Sxc*pIa8Fw5vxphxTA z1nBx~RWnNvw>z`(Nyr%haDm42=ciDyN>w&4!HIyfstG#`1`EP{VCF;vhK2NgaKMaD zH|`}h$|ncE>j{{lg#;v`*<(IMdN)`As00RNA=(1KG$)~8*qE|pc`8CFjGI!8vB@` tQ04*t=5T^L1`zLmWnA#zx;uliKP>p!ZHD4e%;Q_nk>T0d*h#PIA&#Q!rMysizhC!+4_POnM7hRApWh3my9zd zk%XShoI9<0D`ce2QB%$SYuQBY1|y|)8t*sQu*)gwT+E;aHk_y~-y3E9HfT5PwXL$r z$&`&rN*U#+$or3!*w~s@@%vZRl`Gci*jE0$GlTXkkE&3iq)SdAbzSKlXX-7d!mxe` z$HF=1nw5~H;PaA&OGAQ<-if+8! z!CbNR_L)aMK7rN7D$2^r1!)eWG%W)IgAykn`{Aa+m_WV5O%kN#H%gYI?5et`^E0El zV?iy(Z8`QqBKC=ocC4E}8bKpjvshVK`5(R9)OO-hc}0b-!_TCWbJTU6Cku7Rk&%&;6BA1Qht=#lT<1)u`l>0>ScPd#h%kjCxZ2o#ndiuni?tF<$#?JF>m3pzM;wyLZw&h&P7M@2;Z?#+DS%&ucP*0<8a=WM=xJ|RB) z*^us+UlcRV8mF5JSJgZWxcK?iR+i=h3kwVH-o1Ouu$11!?LBEysT3Pdb4=BtzF>2k z-(NfLy+_b8x9uWte)Q+hn%;YbmFH+=pOYs~`uX`q=R40Op7+_e*v+;UpKelXhG%tJ zTbW~h!%u&fL1I4Q&5hRBfr0Cp*Xz#UDh*S$l4)ZFOY$~0HnUW$w_b8>K|y?VzT2!h zHB@5h8{f=GYgUoYy^ULyuV0T}oy{uz^5|1vb?{8JV8`|O@h&<#x=)d3Jx{r>y0D7a zU07Qgb7z$e%DD!Mw(e69-Pz3 zvJ4dy7w0#wV)mRc33pZZFu0BYphR!oBXEJTIvpp81&KS^-C1%QN{E|$ys)^~vbJ2W zAUTK!P|UqK!Xe{4H(Jf--t)nCR?^wYDN!z1;3WOoy1KgA3EU}BDN1^=FW8E%>ZgeL zY@Q888P22B^EX;D%K7vXlw(|YHC8NIGE9d$3JXVbhL7F9e}C}KrhOl~eI!?tVlGhR z!zEIJ_{}S7YikXbkxXw2SEt;?#l%$8^u#?Ku|^*2j>3>5GP`*78X6K*{QvqZVyeGZ zH1B3_g}>O;a6>}(xY+N%{~;kEk*J+%7B-=u+Pbb&Cxp6A@v6wpZ}CqLDVWv0kfPhN zrT*@QEe(lkM~-T~EJ~rS&hb>&?sM$fp1(Aj>x2i-u!P4gd&XO) zBAvARHW|t87hmCj#2mq;{l?8y|mOeLafZ!laQW)pc=NNnZX*yVLMd&x!18p)VE!Gox*n zDGf;)yfU9!tqMnukFl-IpN}N3x|H??nrIqV2dNFXlC0U9Xe6!^azUq*`fEZPbL`F4 zQgyUsWMmeR-7z@1FZ~&oZQ7Jmh>n?|#*1NLVT;9Vs}XK1iwPG4j|GW2zAjjqy?o!( z)4V=bPCMP$yVQG6+{UfDKW7nXm8O+$JoxVZmf6d1eON^gCUo+hU90Tq&}S9B*)W_| zn2KzUS5MK#@vDTTpC-v30=n+t!@XRWC(7{Cr?1n~nRe`Wp`qs}RV%rc=UP*AXFb2u z^mR@Sj)8j&5`P&m6U+IXfq{Ye3#W;aU70Qmwnz2yG=avAd#v&z5z$Rut^qt+F92sp zFTc5zq@JQYH`+$LkKe4}0s`ZHMULH|viCl5ZE|0guL1MWm-M)%H2pM$oyZK4Ljw2w zZ;;&9Q=UF;d~I~mb^Prnug8z=9QKlqy${+$3YbEy_OS%>n+J%AiOm~d=@h(OsZ8SO z$5A(ji90vMT-@c)ts*_#oYuTJGd$DtRN=6Y(C4-ZQZ{p73`w&FNy%?Nq{=GcqWS#! z^F)=nC;Qx&ZREnlw2Ugo*Xq})pQoaD1-!$(NLRT1zP}byAJq~egt%H>UZ$Hd(j$?I zR_KdAHYRDPr5npR-lDD2s;p9JA>z&fxtt_Y_Su-&*u}TJ;eLL%3X4NmKVd+-D*gH0+fctiCQ+dY8$-@PP5OC)EI{v$_Uz=?C z97c8ct=eg;D!**szFoV}ZRJLm)~l=ccMDqbu(7f6n>Sq=Zb~^4nL#3T%6B%|s^s3h zAr~&8>pc5SNm-eab8{qdb!BN7n6*&TK_$m|(6hWiK>*Avtlvog@%Fm)cH^CIcgSxe zkz|h$H9z<4avBnH*jun&(az2;ta&5DzU1U&o)q2OCW)q0T~VTzpv)X;Smir;lJVDH zBaUdKju$^Ck!bs?mX~zRnrJ;eJzV?upVrdS@_O*#gF{WKZf--qvxDa=y?iIr=2TtI z?c4G0brsp7MH>39F%KU6vNBz-kf<1W7ZDwEP%fxPR8U-87w6%?oTQhZ^Qpdm3(fuJ z%{PeYky_j}WanNI$xqf&l3X9J#Lju>(C{PPf{y^!6cneS@vdU|R(A`F6=ey z=ask-QGH?I)HX@WF0zOJcws-K*kmQRbCyp~PfyS6^UFw%1jPK}WF;@Z^Q=YwRE?-( z-^L9a25D6CHbW%0ilU<8ouzOgn-`@%Y*y}JzP?>8ce@96aHAx-GiL-HIgNjbpd@dX9i0`=N$9>_aB9jPu|@v+h!FN_2cY7r4pA zSFc`CqF))7A?oFWP8fPD&W%NDViqg)S6|3HJ;;6PlxmVjn!2Xuv)pY+ zAitBAM+LX+I+iyw{P5vJ$5NnF^yzyWsa!b6?0V{oB{vwN$qO1@FGl{)>wnk*8*}PI zZ*R5MH#Z1ISyc4LR_5b>-~{qV1STdXUVpLJ#=yoFzC#vACM%j15DaR1>BNZ>i{PY5 z2$x}01_D`MzkY3*8w$Gk>C>lgKJ{@5fr?jg$SwXh{lQkBU%u^fbaBc1Y5n?4liGdu z-#))88UbkqwbWr{K)&6PZ43%Vu3n&knz^((0x;<|Z&tFlez`a|mUh;28aAH;8X#(NH!i=i(8{#G>+9y2xVR+c z7+JHnoXne}v;=^hpQ;6sq0~$ov&TdddB@J3tYKv(CEUl3)kr-=NeWGEpdH-+Sf~F{ zxBlOGHS)^o0==?dU3Tp4>l1n0oS+i-ITE|!RbfXJ1~ry`%p8gR5P7`EV}EdUY)Hu7 zxcexT$1ClqEFkD0=24mE&54j*i2c+Lct}N#*h)ED+t;(-zC9zTle>} z8*^vSHvLAcfJP4%XH8e%8w;#V{QyMkWRzOmQCJzsYu@$lzKCtl1C9jK`qMr6J<<`jV28!LKEca&Aq$Fs=zn0Q_AaYtK*p@C%l7J+_u6HdV#v z1a3n}*2GKCF9&zzIjXRqf6|a`)1BeEbTiKLXXFDMZ?56tUWR$y4SS0AVoD*M;NT4>bVwvYus6M#|yF@xU+HF z-dn9yV2GXUaoqL=mnwDhFTea%ZT!@3*fJq}jVL)SjEOWJy}Zw>{qys;G>ov^L>oOR7khR4Hc6LiD+Rh)QgJy#Jtf+8NhjUv!qLmJ&T~1U8#;BC^Shju+icGB zO^rE3*3$m`^Un(uTQd1k;HUsRgaa~(I#k;`WYE``iS9Dd$AlI^ZLe`~`xipx#m0y# zuN_+$d8?elndK^e_;BKd)3^%1B~8eF;A7XDz(8Q6TE3IL=c}Q{q$A?u;vEav3@9!$ z-;?V|JRDpXD$0Gm9R1hb@9eAnf5UlE^me-=~dLHD~Yc{tzTx4?_X!-@2k4>L^ z%qr=oqaeAG5$3+SaNs^O&>o~T34Au`J44^Y$QVuTuMvI>{E`t(B0-0W;XR+fXW zEmk@3VSAIHR>R1!QN5< ztM+72RF$!9YA z@QcCdQASOSz8qKrxf;#FXB-bhL-xW2Mey>z+VHXDvxswt*<@Cdae`r}8%6utbQ zv20wD;-zT0k)FA8oMxP!0OdZ^l9^;&^~}Ib|Neqk===BY#SCHae2O@I?^6CQ5^4U% zaa~KD1##G!q!P8{4J951j6>hHAUkEam8n|U){%(tp6+gT$PHKwrf=_VsHuUbxe_#3 zsmxn2{~Z$H*Fh?`XPO6wIrg!{L`TEUF_mZ73_#Gt$)Q3L*k}ebX7&}~sDafq57b3* zh6ny_1uO81}la&nNK!VpiO-oC=c#lA``w9Gl00bPM2)XZZ z(j@ko@lk?pcUM;=j!ie)`mLHHfwd*mZOR~Z&4fvJZxch#-!*Wxs|t)CxFFZn)rCZ= zNT2OPF_Pbc^5D%&h=J`v0F`V*aZ=oSzkp{3UXv^ZHRLxQ%?Q{fpY>lYG|3>!q4A8Y+X>De(sNSk`BlC$lw06Y#=cnyGr_;pB@qw{~eFUf>^u1WfvnOBZrJO z+&Mz10TdgB!vKi~p{M%$rjuINcBtBbU~e-$6yr zd|>y9|3Ol|GmAl}%uZ)Z+@}?Fi#LCog3RzkJ%$!4Z*9H&DJ9(KR@ePqA^U#CRp{$` zr78Q|=DWlUkJn11^$7AN+hwpM{i ztqjw8yO9=t4I_egWSr?ZYQM5*4=pLPiD92As7qs-z9frBBq+*2qlSJXyp>GQ6v9^b zcf?98lRowukJ6|_yv~kwq+t()^JZbnBmr8XAj716_Ki&cg}uD5Hc+VyLeQYUw%9CI zB29rWk&NRQ#`l3L#kkfpwEr}3r1S>n{d{+#B!JP{S$UOEf7f^V_aWkPuY(NqyJ z?e1$UE?JP6jSyBB4Dy&rcA>J>g=GwCA@neWB|Oa~`dO5DxeIw{;dJeT-PY8vJ`+{e5^Hpt4$ zt9$R}r*mmT?1P{Dkd0D$iaN2EShnsJQaqxb{E=Ym@M#CA{b4GQnqa4X0Rgi~OCPGL zRKfRQ406iE$%iWAYZNz*Hj&{SOiV`MlIBf3DO%~$ka-`W9|;311M& z!YN~FYC8LZU8Xrrzd5~DA_@9Y zdnquOO71s%|6u!W0SnDL=DLJRx9)m()$?yz1l2U3Rx>d<`3X+lBSwT%gwUllsuuJl z*sQOK3!=LcT9{#gqMOYnqY>2=r>73JlG8UDtyEfLgoh{1jS-jS2Q zZpNU&+!#H#1tZs`k*putN6mDEyM^=AB;y%qHFi{D^^?7oGw{*OvH8%_uv4oUckKA; z<$^`T0(K>Hhf{Oynspt7`3QpX3ab?s7KXZL#yQ#jttayeK*IiAFoH*-2sdU~>4SZg z8>dqbfVBMKi>qzkym_%-axFo^bus(zVp+gM1J?$m+e!U~B)W=N4s)H=styys>|yZF zH}PZ|mTg1LmxHma0ry=Erh;d)Myk$WhBZ+juq>t{>J4WZ#CyDW@PiWLobQ^3Nf_UR zyqgZ%BSUZ$B31~uFvn>okz)|KQc+c9XC{RAq+bfB3d1MZcdK(9$PgDQt+>X6 z@nI1WZBVgoTOK1xh~V;#J_$QAPHBeuyhgZ zEoU`%uXIl4hk0yxO$+PySkNO+O_Z^TiV4!6MQS?@r(`ump4}9;0T<_j>^Fu~+g5u+ zAQ%ik7B@F5eauo*@ekVpVSL0E7Z$o-kCqN}&_?1&*dz-+lChtrH|OxPlB+qiZ}7~Q zW=HB_pEke@z|nJIBY(Q96r z>qsM-Dues6ZFH5>LBXi~Tmk}3dKMh$=gB(t`fFrgMuKOD4%$A2_JdTEsGSGgrlDYo z{4>EB#HauAU|>td{tZ<<=Oe1L#Nq(E)cNz~(CYuNC7Nkf!Ga1z%XOdYv{DpHZ>APc#U9+jgova(j+==@Hj0)tJ$9HoJ} zYO=CksO=_fY+|=w3RryZZ1|C9dgOG|`hz!U*-G$(ZZb1$-P$-<9~b%?jy{45IYe~$ zg$$?CAMN6;Xl-q6C_wWzmFS=Wv0)u)=R3`$Sw4OCjA(@s3=D~{3J)}44iDFaq@|%S zYQMhraD|GY1Dvy-`-;8&;HQ#?0(hy6`}U;@llvIWRssGEz!&^Rs=T}$6ea`)UjoiK z$Vnf?MmLuCV*cvlFadlN3dIgwO77Y5)1KQ{KcRU&6TY@w)==OyH<|)ou*+#R&vA-q zu`bn$(Ol=+T3#7?e*OBDXea)VkmX3{moJZlnzbF zAt-0DW}04p28iiTS>-h~>VJD(nt=&?f`XQ`kLwx4BETg~Cwt0MD^w#u@YT}v+6vS>kw$S&B^C9bKcP{w{zc#8ILU%B= z;_D8S>W2A=?(ba|LXwxB<9g%8WVLc{4+}S|@Ym5(O^vx((?dxvHL0^x{q#kqC{m8! zUX^87cb!4osg23e@(35#1*ldsGw>>8d1Ylv+?-vey}dnl?CU$$uOGIXc1SqHy-Y3j zwpt0S{gUan8nRBvd(f5)(~9tx;Q}QP)V*IY23{KgxsVav6O?4($3$g^hkVRg0R+bc zVrSbvG2-N9C>SW{8xN{B=F3d0s=5>^WbG6cFZ=vpIVyj!k6Z3&1>sOf2^Zh5f?1v*^dROsH+FmuLn#pdJghV5HMCvr)y~; za5-#4vGJ~7@q=vb$Ywalk&u;N3iN4;xT!!kzQ~UdirmC_$boa}g^1|GQUNDJrPl6D0K!I2&yMYxs2zcgP^wM(JPn z?n8T<^BJm{pRpycAe`c6;Ctt_GAixL+W&wSK1ns4tEm#h0sWmDSaaAb&`5rFd67 z!9Y@4fih%;4igMw+G(0opELz+*EIMw#CS|jf0*+rhyx=dBU8+b{IA_mSojHqfr^&y zG5vyM!S-8c;}pW1KKQb?If5%i_*pwsSx|ur)>fVK=f6IZRZ!4CH!8!Rc;nK6?!UXC zn`7Zi3_d&*rs(9915p~?lycb|fM)h7`r(gm=m7)-^m`>}RJ+DL^%F#Z#+3XDdtkx7V+gaJlBv}4!MvLeJ3$^&aD$XjY! z;i^c-4S48Nq2U+>8e1l$zKKa|xIWB%il48qQpiA7^UFxTr`!d@ zlgm5F$An#)IHL@TFNdc;U0EJ`W58S}(wx#8%kg(%cPzbk?_S$q8|7^}Z=W*s$W_r~ z`}e==E?Q?=LKir)3dBOrXOHZK%Yn46sIOP~UZ*8dr_m*zY&*!s^`U|2#G1h|nC*xE zLUgclicS>u8S-3znJn2c@aeCc+ zCpEN?mK&)U8z4q3e&qTK9LC|GT@pd*!N+`s>vRnI=i;Cu21xGlo6$qb{jJrTU_VQ+!$a0lOvL@;tV& zCJNkW86cdEWUX{RfBzU5d>1KDs4x?cmXwytQc9n&Cdr42n1cQfwPvM3&=50}3se2M zQ^!#pxx0Ydh#OZ-P!c|Ye^^*5pzu1Hzq3-skkymp^J~F5|GD?BjZxN75%5k7UF6d) ze2Q0!qRXTAfA;K|iN(i=)4NYy|Lc*;^L|X5B8Ypa^u|o;k`m>MWgjNm7Lwf_@9hXp zJGD2enyX4&4HU%Tmn`?QCjcINn2`Gq5E60)RB@;|E!?arnHvpO)RA0KiVB`F5qt&G zgWwxz0YpTd_sJ0rsILkY)qpLS<=&-=EysY?*r?_)KG#J%s1{G&cX{>s)1NL9V+cM( z?^QHF1-#Y43A9c%MwSUpvP2A{$;!&wI`G61-PN$QJuMajCGX#7iw3C>ke%kfl7#3w zq_3|}bQF0Dmu(~64h_oN%nYf4MayH1k8lI9=$YO?{T$AV3E51`@_{%ajCm4+vg|01MsLXz*B=UXXjg(e z-Nsrnh#x0H+cvD`U1Awtp1FznPPDU56W%mTPr^VU`bn4+wsklaw}8y|pOTa`c0`8? zGlWs9ZX@TF@@8AigG3!taWirL8!f7^ort0i`=1!?b0{Nw`LdrM>U?{T7`!D0$cQO7 zg1m2IlSoGU#ovN?y*y{RCcerw%x*xmZIvm74D1`_I;H}1+z<_w(I;K1Ks0_xEN>jt zo=_3{lL*$~(F^i?pd9RCVzjmsI(@b7tLZjiu~bp%hr8j6)S)-cE-2XCrWEo5y`|Cz z+u8S)qDg!GoV0Wfw=WscR6RaDeF`12;p6R?&@_Zn;0*JuR6afeIYx=bORn(4DKLk> z2evk>>U{}4eDI(&8m(%W^}`-=K4Ftg#Xw&obQgyAR3YVZ*@dgi*xZwmZ`TpqbZ|i{ z1CA0M9zwY!X!IF}DV!lf5Y)MbaVo<&9b^UBA@AxE82Bl4*1Xvy^`0J-`xL0} zmH_kX16(75Dm#e9UCwvPB-jIpHC5EBJ`Z!H5L1fiPY^r@vkdu*LrLGK7*EBGBh`>m zgfrHLoWa0J4!BG#_B{cA&dC=4zLrTVgvU(_W3XW-&zw2)xS>JS;k->E(7zjeQW~wm ziFaFgnNe@}x3P-!jB3jJQYcq{-neo1(%e{ zwg4Kd{juj#8)5QvI}|R3<{AotbX7ja&-Y-z`L^v9y27LN`hC0(_4Rf(wz1Lc^5n1Y zH%A$kJ@McuuCK3$<(IOZg~jxgB`y1Xx}s%BRYmW?g9l6Fb#vcLVB|Yn)T)Uv@F-iA1I^`CRi|pg#LbyK48$fsuuF$a zxXOyHH@6&5!gMC^G{da%FyR8DsFEEx0>K>BK!fqrQdyR5(`aOH3k!c)yuxXI|@jq zL>K~5v2wxqOV=P_ax9Up2#|Cv0i7Xqd+gZTZ;cdQoGVfEbs}Wk!jvUO%|opW3%i2y0%x`sR0LbjGeuh8K|cO zIbRIGh}SPHIN>;Xja^i<70+qBFxe}O@%yc~Jv*4pgNF}KAdkNV@CX#Y{MgL?6X|w` z*mr~P|8z$2CC@)<>&DwVq=^riz^o>A8W1~h+^x5QX~U*X=73a7*^NaNP|-T22pQP_ zEiVo3Ni2__U7AM`QKQ-#$vr<=;yp;xWa`~``(m4Yvo7q+95m5VGBQpP`V3AsVN>Ph zNcDr^h`sP@B3da3g$^cQ(sMP~?=h^%@2$~1XY=rqT-LbZ+ z0jp!EKF%jqFJHSS1f8h{!k)q}=0vPJZwK(|r^52O4(F5-9UaZ#&B7-Q=e-`c&4m0S z#uYz|Z7PzYO_D=NZsaF>g|A*XiK=6a`NM9Fer&}ayggl#n8LL|Bjh(B$wPNLl26HDekCW&(jy_3X#`Goa2EJ1>>k5#-JTqOZuT~EG!9d=Vd8CB0wx7K+}B% zQw>gEA0A@dy*u&tZPLQh(h*qfpovm7+3ss@L>W4BpKkU%l!_l}83c6#`pm@4C8Bf& zV-3T_43Z6CG+xVYB%OP<>x+7c(ZK9%A!6c@_>d1^)QGwCMi$G-YY(366Hmmaeat}F zW#!}=kxV0L46GumIQJkZ7~(H`daj|{E`_dEt%Li%eOaqHOC59h@Y{<+fKw|IKJG-z zZRHgfN3fo)yH61v38G5~i#7o%KU-dEmKk3hO? zJcu{(U_X9?u`;9$LlmM*8ldM5IlG5IbOYwB-*!0+HI&DzCQ!Q2NIHcN4rs!%uam$B zE)4k|>r=;xX@X5%ui;L-WF$rl{;yvB*47txM?GRsyKxJeg(M>-e=haRmAn5238{EC literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/scatterplot.png b/contrib/plotting-visualization/images/scatterplot.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91484f54e9dc6e492862c036bab2a804add3b GIT binary patch literal 13739 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 A>Hq)$ literal 0 HcmV?d00001 From 2698983bd1437adf3e53c31cfad00181fc15a19e Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:47:58 +0530 Subject: [PATCH 34/99] Delete contrib/plotting-visualization/scatterplot.png --- contrib/plotting-visualization/scatterplot.png | Bin 13739 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/scatterplot.png diff --git a/contrib/plotting-visualization/scatterplot.png b/contrib/plotting-visualization/scatterplot.png deleted file mode 100644 index 94c91484f54e9dc6e492862c036bab2a804add3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13739 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 A>Hq)$ From 9d9bed8f924fddff9db83271bb9632cd59d5ae19 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:48:39 +0530 Subject: [PATCH 35/99] Delete contrib/plotting-visualization/barplot.png --- contrib/plotting-visualization/barplot.png | Bin 10644 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/barplot.png diff --git a/contrib/plotting-visualization/barplot.png b/contrib/plotting-visualization/barplot.png deleted file mode 100644 index b6c9446ef38540209af0719b53286293a69058f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10644 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 tQ04*t=5T^L1`zLmWnA#zx;uliKP>p!ZH Date: Fri, 31 May 2024 12:50:04 +0530 Subject: [PATCH 36/99] Delete contrib/plotting-visualization/histogram.png --- contrib/plotting-visualization/histogram.png | Bin 14636 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/histogram.png diff --git a/contrib/plotting-visualization/histogram.png b/contrib/plotting-visualization/histogram.png deleted file mode 100644 index af35141bd0d8f95c0d6ebf411aff45d875b4be3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14636 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 From 57c369bd0ec3d02e283224f903e760abb368b51f Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 13:00:40 +0530 Subject: [PATCH 37/99] Update matplotlib.md --- contrib/plotting-visualization/matplotlib.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib.md index 720dff8..02f17f5 100644 --- a/contrib/plotting-visualization/matplotlib.md +++ b/contrib/plotting-visualization/matplotlib.md @@ -41,9 +41,10 @@ plt.tight_layout() plt.show() ``` -![img](scatterplot.png) +![scatterplot](https://github.com/Harshita297/learn-python/assets/122027571/aa57eb31-4377-4f75-9a97-e4fa7a54a938) + ### 3.] Bar plot Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. @@ -60,7 +61,8 @@ plt.ylabel("Y values") plt.show() ``` -![img](barplot.png) +![barplot](https://github.com/Harshita297/learn-python/assets/122027571/00cea3cd-a962-4bfe-b158-921389ee564c) + ### 4.] Histogram @@ -77,8 +79,11 @@ plt.ylabel("Frequency Distribution") plt.show() ``` - -![img](histogram.png) +![histogram](https://github.com/Harshita297/learn-python/assets/122027571/32470819-bac5-4bb2-9f36-79521fa40bf3) + + + + From 9470b8c1a255f8e36c51ae1db4b263a8ca05297f Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 13:02:02 +0530 Subject: [PATCH 38/99] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 32261d6..84d07f9 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,3 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) +- [Introducing Matplotlib](matplotlib.md) From 540163c863037f28afa4b9b7463198bf57e41866 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:09:16 +0530 Subject: [PATCH 39/99] Added Content: Line Charts in Matplotlib --- .../plotting-visualization/images/dot-line.png | Bin 0 -> 1180 bytes .../images/line-asymptote.png | Bin 0 -> 29209 bytes .../images/line-curve.png | Bin 0 -> 13975 bytes .../images/line-labels.png | Bin 0 -> 16851 bytes .../images/line-ticks.png | Bin 0 -> 22354 bytes .../images/line-with-text-scale.png | Bin 0 -> 19249 bytes .../images/simple_line.png | Bin 0 -> 14451 bytes .../plotting-visualization/images/two-lines.png | Bin 0 -> 18440 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/dot-line.png create mode 100644 contrib/plotting-visualization/images/line-asymptote.png create mode 100644 contrib/plotting-visualization/images/line-curve.png create mode 100644 contrib/plotting-visualization/images/line-labels.png create mode 100644 contrib/plotting-visualization/images/line-ticks.png create mode 100644 contrib/plotting-visualization/images/line-with-text-scale.png create mode 100644 contrib/plotting-visualization/images/simple_line.png create mode 100644 contrib/plotting-visualization/images/two-lines.png diff --git a/contrib/plotting-visualization/images/dot-line.png b/contrib/plotting-visualization/images/dot-line.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9e67f536cc625fa97ed59095d5442f646ebcfb GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&B3=}#3|KN2X#a!&<8N$KAar>eF10a{P zz$3Dlfq_2}gc(=ZFV6%DT9mj(lmzFem6RtIr849umK5aVm*iw7DU_ua6=&w>8S5G9 z8R{rxl#~=$>FXop_413-^##(zC4pwB2l#}z0%`g3EehpZEZX*LIR9k(+!tCp-&KZT ziOI{1pupBLX%(#_j1w$40+g5DN={*pELt%~!D-XpO(u2sq|Ydy{&v4dygu|Q6Qe@| z10$CLkYp7Al1v;xl97c&U;zUY3r7G0BNK}TPyv$&sxlPC7TyQG|9-AmU6sM|W0%C1 zROJKPpU%+!@NtFUgZci+d4=+I<{;fb^FTH*Fq&o77jth|wpu2iVcPcDo2*zP?s-p| ztb5?my2(%Y5(>pVi#RWEz1ha@_wB&0;EJ~*W&9?cGg=Y);RaEkVH04#Kc6vdi}mU7 z2GPGB*Q6VczCAzbs(HiFzkZYS8M=Q@RhiEi)p+;Yf#T|frZANy-Pv+Jd4HeCINRo}u|dM@<+W^VIiEM2I?#|i@7qQuMzQye&%Yfw6i8F)+$;YiOidG=v||l;AR7qBta{;wKLwie}`!evg}x?+%kYA|=2{73MDcH@QD;Qu^I{8REs8x8<<> usIz~@RRc`$STlzp1HlXg$!9sY?5k$UY`w)e(GQsY89ZJ6T-G@yGywo1V^$&n literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-asymptote.png b/contrib/plotting-visualization/images/line-asymptote.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d21da0627f3f44f301cfef247e3ca4018edb62 GIT binary patch literal 29209 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-labels.png b/contrib/plotting-visualization/images/line-labels.png new file mode 100644 index 0000000000000000000000000000000000000000..26505b1560a19627a47cc0156693f758adecfa67 GIT binary patch literal 16851 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-ticks.png b/contrib/plotting-visualization/images/line-ticks.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6ed78a9cf36240301a6af7480127eb39f0648d GIT binary patch literal 22354 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 WZ(;p)9Po=>m(HvHD^2mX_x}fm*rQ7T literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-with-text-scale.png b/contrib/plotting-visualization/images/line-with-text-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..e402a3e527ea9938cc4b8f9ea4ddd2f18d372a9e GIT binary patch literal 19249 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/simple_line.png b/contrib/plotting-visualization/images/simple_line.png new file mode 100644 index 0000000000000000000000000000000000000000..3097f469b35e6e8c82b4a6ce62ed07672e335280 GIT binary patch literal 14451 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 Ln;HLTJp2Cuehd}s literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/two-lines.png b/contrib/plotting-visualization/images/two-lines.png new file mode 100644 index 0000000000000000000000000000000000000000..db2c88584d80d9fdd99c6bd55569abdb49e2449d GIT binary patch literal 18440 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 F{{R8nbqxRj literal 0 HcmV?d00001 From 0c7f4fa07608d91fcd2ef6a6bf47decd5269ebef Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:26:51 +0530 Subject: [PATCH 40/99] Created matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 268 ++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 contrib/plotting-visualization/matplotlib-line-plot.md diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md new file mode 100644 index 0000000..00ddc90 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -0,0 +1,268 @@ +# Line Chart in Matplotlib + +A line chart is a simple way to visualize data where we connect individual data points. It helps us to see trends and patterns over time or across categories. +
This type of chart is particularly useful for:
+* Comparing Data: Comparing multiple datasets on the same axes. +* Highlighting Changes: Illustrating changes and patterns in data. +* Visualizing Trends: Showing trends over time or other continuous variables. + +## Prerequisites +Line plots can be created in Python with Matplotlib's ``pyplot`` library. To build a line plot, first import ``Matplotlib``. It is a standard convention to import Matplotlib's pyplot library as ``plt``. +``` +import matplotlib.pyplot as plt + +``` + +## Creating a simple Line Plot + +First import matplotlib and numpy, these are useful for charting. +
You can use the ``plot(x,y)`` method to create a line chart.
+ +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +print(x) +y = 2*x + 1 + +plt.plot(x, y) +plt.show() +``` +When executed, this will show the following line plot: + +![Basic line Chart](contrib/plotting-visualization/images/simple_line.png) + + +## Curved line + +The ``plot()`` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y = 2**x + 1 + +plt.plot(x, y) +plt.show() +``` +When executed, this will show the following Curved line plot: + +![Curved line](contrib/plotting-visualization/images/line-curve.png) + + +## Line with Labels + +To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an ``x label``, ``y label`` and ``title``. +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure() +plt.plot(x, y1) + +plt.xlabel("I am x") +plt.ylabel("I am y") +plt.title("With Labels") + +plt.show() +``` +When executed, this will show the following line with labels plot: + +![line with labels](contrib/plotting-visualization/images/line-labels.png) + +## Multiple lines + +More than one line can be in the plot. To add another line, just call the ``plot(x,y)`` function again. In the example below we have two different values for ``y(y1,y2)`` that are plotted onto the chart. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(num = 3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, + color='red', + linewidth=1.0, + linestyle='--' + ) + +plt.show() +``` +When executed, this will show the following Multiple lines plot: + +![multiple lines](contrib/plotting-visualization/images/two-lines.png) + + +## Dotted line + +Lines can be in the form of dots like the image below. Instead of calling ``plot(x,y)`` call the ``scatter(x,y)`` method. The ``scatter(x,y)`` method can also be used to (randomly) plot points onto the chart. + +``` +import matplotlib.pyplot as plt +import numpy as np + +n = 1024 +X = np.random.normal(0, 1, n) +Y = np.random.normal(0, 1, n) +T = np.arctan2(X, Y) + +plt.scatter(np.arange(5), np.arange(5)) + +plt.xticks(()) +plt.yticks(()) + +plt.show() +``` + +When executed, this will show the following Dotted line plot: + +![dotted lines](contrib/plotting-visualization/images/dot-line.png) + +## Line ticks + +You can change the ticks on the plot. Set them on the ``x-axis``, ``y-axis`` or even change their color. The line can be more thick and have an alpha value. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y = 2*x - 1 + +plt.figure(figsize=(12, 8)) +plt.plot(x, y, color='r', linewidth=10.0, alpha=0.5) + +ax = plt.gca() + +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + +for label in ax.get_xticklabels() + ax.get_yticklabels(): + label.set_fontsize(12) + label.set_bbox(dict(facecolor='y', edgecolor='None', alpha=0.7)) + +plt.show() +``` + +When executed, this will show the following line ticks plot: + +![line ticks](contrib/plotting-visualization/images/line-ticks.png) + +## Line with asymptote + +An asymptote can be added to the plot. To do that, use ``plt.annotate()``. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(figsize=(12, 8)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') + +ax = plt.gca() + +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + + +x0 = 1 +y0 = 2*x0 + 1 + +plt.scatter(x0, y0, s = 66, color = 'b') +plt.plot([x0, x0], [y0, 0], 'k-.', lw= 2.5) + +plt.annotate(r'$2x+1=%s$' % + y0, + xy=(x0, y0), + xycoords='data', + + xytext=(+30, -30), + textcoords='offset points', + fontsize=16, + arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2') + ) + +plt.text(0, 3, + r'$This\ is\ a\ good\ idea.\ \mu\ \sigma_i\ \alpha_t$', + fontdict={'size':16,'color':'r'}) + +plt.show() +``` + +When executed, this will show the following Line with asymptote plot: + +![Line with asymptote](contrib/plotting-visualization/images/line-asymptote.png) + +## Line with text scale + +It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In ``plt.yticks()`` we just pass a list with text values. These values are then show against the ``y axis``. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(num = 3, figsize=(8, 5)) +plt.plot(x, y2) + +plt.plot(x, y1, + color='red', + linewidth=1.0, + linestyle='--' + ) + +plt.xlim((-1, 2)) +plt.ylim((1, 3)) + +new_ticks = np.linspace(-1, 2, 5) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3], + [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$readly\ good$']) + +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + +plt.show() +``` +When executed, this will show the following Line with text scale plot: + +![Line with text scale](contrib/plotting-visualization/images/line-with-text-scale.png) + + From 310ff8f340c15e0eef66b8b5acc383c586846662 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:29:39 +0530 Subject: [PATCH 41/99] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 32261d6..61dd537 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,3 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) +- [Line Charts in Matplotlib](matplotlib-line-plot.md) From 34d7bc39c9aa7ed30565cded96c14566ed7e9f80 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:32:11 +0530 Subject: [PATCH 42/99] Update matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md index 00ddc90..566fdbb 100644 --- a/contrib/plotting-visualization/matplotlib-line-plot.md +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -31,7 +31,7 @@ plt.show() ``` When executed, this will show the following line plot: -![Basic line Chart](contrib/plotting-visualization/images/simple_line.png) +![Basic line Chart](images/simple_line.png) ## Curved line @@ -49,7 +49,7 @@ plt.show() ``` When executed, this will show the following Curved line plot: -![Curved line](contrib/plotting-visualization/images/line-curve.png) +![Curved line](images/line-curve.png) ## Line with Labels @@ -74,7 +74,7 @@ plt.show() ``` When executed, this will show the following line with labels plot: -![line with labels](contrib/plotting-visualization/images/line-labels.png) +![line with labels](images/line-labels.png) ## Multiple lines @@ -100,7 +100,7 @@ plt.show() ``` When executed, this will show the following Multiple lines plot: -![multiple lines](contrib/plotting-visualization/images/two-lines.png) +![multiple lines](images/two-lines.png) ## Dotted line @@ -126,7 +126,7 @@ plt.show() When executed, this will show the following Dotted line plot: -![dotted lines](contrib/plotting-visualization/images/dot-line.png) +![dotted lines](images/dot-line.png) ## Line ticks @@ -162,7 +162,7 @@ plt.show() When executed, this will show the following line ticks plot: -![line ticks](contrib/plotting-visualization/images/line-ticks.png) +![line ticks](images/line-ticks.png) ## Line with asymptote @@ -218,7 +218,7 @@ plt.show() When executed, this will show the following Line with asymptote plot: -![Line with asymptote](contrib/plotting-visualization/images/line-asymptote.png) +![Line with asymptote](images/line-asymptote.png) ## Line with text scale @@ -263,6 +263,6 @@ plt.show() ``` When executed, this will show the following Line with text scale plot: -![Line with text scale](contrib/plotting-visualization/images/line-with-text-scale.png) +![Line with text scale](images/line-with-text-scale.png) From 27dcfba508722dc35a96544e259cd49c9e3a7f9a Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:03:35 +0530 Subject: [PATCH 43/99] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 32261d6..3f27246 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,3 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) +- [Introduction to Seaborn and Installation](seaborn-intro.md) From 273515a8c22a17fc9af4eefcab30f42d6065a31c Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:04:45 +0530 Subject: [PATCH 44/99] Create seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/plotting-visualization/seaborn-intro.md diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -0,0 +1 @@ + From 01552110695fc0d9b39797d983946483d2620a3c Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:12:32 +0530 Subject: [PATCH 45/99] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 8b13789..4e28b6a 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -1 +1,4 @@ +Seaborn is a Python data visualization library based on Matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. +# Seaborn Installation +Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). From b81223f8e8e19c67078d835d7679e66036356fb4 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:12:50 +0530 Subject: [PATCH 46/99] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 4e28b6a..8b0d869 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -1,4 +1,4 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. -# Seaborn Installation +## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). From 32fcb9484e26f9ae38e5d6b82a338190b8e83358 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:15:06 +0530 Subject: [PATCH 47/99] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 8b0d869..bbbfec8 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -2,3 +2,10 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides ## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). +Below are the steps to install and setup seaborn + +1. **Install Seaborn**: Open your terminal or command prompt and run the following command to install Seaborn using `pip`: + +```bash +pip install seaborn +``` From 56467e57bb3ac0b91bde6d504813e44e983a80ab Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:19:06 +0530 Subject: [PATCH 48/99] Update seaborn-intro.md --- .../plotting-visualization/seaborn-intro.md | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index bbbfec8..0375db2 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -2,10 +2,26 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides ## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). -Below are the steps to install and setup seaborn -1. **Install Seaborn**: Open your terminal or command prompt and run the following command to install Seaborn using `pip`: +Below are the steps to install and setup Seaborn: + +1. Open your terminal or command prompt and run the following command to install Seaborn using `pip`: ```bash pip install seaborn ``` + +2. The basic invocation of `pip` will install seaborn and, if necessary, its mandatory dependencies. It is possible to include optional dependencies that give access to a few advanced features: +```bash +pip install seaborn[stats] +``` + +3. The library is also included as part of the Anaconda distribution, and it can be installed with `conda`: +```bash +conda install seaborn +``` + +4. As the main Anaconda repository can be slow to add new releases, you may prefer using the conda-forge channel: +```bash +conda install seaborn -c conda-forge +``` From bdab7d9bb5154dc23e2b9b350900a5b148b6d3e1 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:29:50 +0530 Subject: [PATCH 49/99] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 0375db2..6e0a7d8 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -25,3 +25,17 @@ conda install seaborn ```bash conda install seaborn -c conda-forge ``` + +## Dependencies +### Supported Python versions +- Python 3.8+ + +### Mandatory Dependencies + - [numpy](https://numpy.org/) + - [pandas](https://pandas.pydata.org/) + - [matplotlib](https://matplotlib.org/) + +### Optional Dependencies + - [statsmodels](https://www.statsmodels.org/stable/index.html) for advanced regression plots + - [scipy](https://scipy.org/) for clustering matrices and some advanced options + - [fastcluster](https://pypi.org/project/fastcluster/) for faster clustering of large matrices From a8e60cf4b1121311363846e4ca06d0967e4652fb Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:29:42 +0530 Subject: [PATCH 50/99] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 3f27246..96615db 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -4,3 +4,4 @@ - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) - [Introduction to Seaborn and Installation](seaborn-intro.md) +- [Getting started with Seaborn](seaborn-basics.md) From 4446a85d1f81f8a18d75f5a29cc9a1733bd800ab Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:30:11 +0530 Subject: [PATCH 51/99] Create seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/plotting-visualization/seaborn-basics.md diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -0,0 +1 @@ + From 6aecf49fd04b8777365b7173fa47d59c86e5e0aa Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:47:43 +0530 Subject: [PATCH 52/99] Update seaborn-basics.md --- .../plotting-visualization/seaborn-basics.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 8b13789..603f074 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -1 +1,19 @@ +Seaborn helps you explore and understand your data. Its plotting functions operate on dataframes and arrays containing whole datasets and internally perform the necessary semantic mapping and statistical aggregation to produce informative plots. Its dataset-oriented, declarative API lets you focus on what the different elements of your plots mean, rather than on the details of how to draw them. +Here’s an example of what seaborn can do: +```Python +# Import seaborn +import seaborn as sns + +# Apply the default theme +sns.set_theme() + +# Load an example dataset +tips = sns.load_dataset("tips") + +# Create a visualization +sns.relplot( + data=tips, + x="total_bill", y="tip", col="time", + hue="smoker", style="smoker", size="size", +) From 03920cd7501a05316e9a143f0dc7d0406e6117c1 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:48:58 +0530 Subject: [PATCH 53/99] Add files via upload --- .../images/seaborn-basics1.png | Bin 0 -> 53821 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/seaborn-basics1.png diff --git a/contrib/plotting-visualization/images/seaborn-basics1.png b/contrib/plotting-visualization/images/seaborn-basics1.png new file mode 100644 index 0000000000000000000000000000000000000000..bedcee91b8855491cbc3c50ac7af23bf330dca99 GIT binary patch literal 53821 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
4;gz7aU{XPL0=T|cAUgk!XKT9QnA3dw>U}#EJ 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 z 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 Ss(20qenEt#g-Qi6$ literal 0 HcmV?d00001 From ef42e881851eb20f9a9c8c28a9afdcff89c7fb67 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 20:49:03 +0530 Subject: [PATCH 54/99] Update index.md --- contrib/plotting-visualization/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 92ec106..32261d6 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,4 +3,3 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) - From f26f8da60ec1814d6165a6cb908aa2a0ea7a1b2c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 20:53:21 +0530 Subject: [PATCH 55/99] Update grid-search.md --- contrib/machine-learning/grid-search.md | 41 +++++++++++++------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/contrib/machine-learning/grid-search.md b/contrib/machine-learning/grid-search.md index 3bf53ff..ae44412 100644 --- a/contrib/machine-learning/grid-search.md +++ b/contrib/machine-learning/grid-search.md @@ -1,20 +1,26 @@ # Grid Search Grid Search is a hyperparameter tuning technique in Machine Learning that helps to find the best combination of hyperparameters for a given model. It works by defining a grid of hyperparameters and then training the model with all the possible combinations of hyperparameters to find the best performing set. + The Grid Search Method considers some hyperparameter combinations and selects the one returning a lower error score. This method is specifically useful when there are only some hyperparameters in order to optimize. However, it is outperformed by other weighted-random search methods when the Machine Learning model grows in complexity. ## Implementation -Before applying Grid Searching on any algorithm, Data is used to divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. -Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accurac -Let us consider that the model accepts the below three parameters in the form of input: -1. Number of hidden layers [2, 4] -2. Number of neurons in every layer [5, 10] -3. Number of epochs [10, 50] +Before applying Grid Searching on any algorithm, data is divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. + +Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accuracy. + +Let us consider that the model accepts the below three parameters in the form of input: +1. Number of hidden layers `[2, 4]` +2. Number of neurons in every layer `[5, 10]` +3. Number of epochs `[10, 50]` + +If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be `[2, 5, 10]`. Finding such combinations manually would be a headache. -If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be [2, 5, 10]. Finding such combinations manually would be a headache. Now, suppose that we had ten different parameters as input, and we would like to try out five possible values for each and every parameter. It would need manual input from the programmer's end every time we like to alter the value of a parameter, re-execute the code, and keep a record of the outputs for every combination of the parameters. + Grid Search automates that process, as it accepts the possible value for every parameter and executes the code in order to try out each and every possible combination outputs the result for the combinations and outputs the combination having the best accuracy. + Higher values of C tell the model, the training data resembles real world information, place a greater weight on the training data. While lower values of C do the opposite. ## Explaination of the Code @@ -32,16 +38,14 @@ The code provided performs hyperparameter tuning for a Logistic Regression model 10. logit.score(X, y) calculates the accuracy of the fitted model on the dataset and appends this score to the scores list. 11. After the loop, the scores list is printed, showing the accuracy for each value of C. -## Python Code +### Python Code +```python from sklearn import datasets - from sklearn.linear_model import LogisticRegression iris = datasets.load_iris() - X = iris['data'] - y = iris['target'] logit = LogisticRegression(max_iter = 10000) @@ -49,20 +53,19 @@ logit = LogisticRegression(max_iter = 10000) C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] scores = [] - for choice in C: - logit.set_params(C=choice) - logit.fit(X, y) - scores.append(logit.score(X, y)) - print(scores) +``` -## Results +#### Results +``` [0.9666666666666667, 0.9666666666666667, 0.9733333333333334, 0.9733333333333334, 0.98, 0.98, 0.9866666666666667, 0.9866666666666667] +``` -We can see that the lower values of C performed worse than the base parameter of 1. However, as we increased the value of C to 1.75 the model experienced increased accuracy. -It seems that increasing C beyond this amount does not help increase model accuracy. +We can see that the lower values of `C` performed worse than the base parameter of `1`. However, as we increased the value of `C` to `1.75` the model experienced increased accuracy. + +It seems that increasing `C` beyond this amount does not help increase model accuracy. From 5ffcbf21346cc0a56b873c5b11d97e349fa379fc Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:57:53 +0530 Subject: [PATCH 56/99] Update seaborn-basics.md --- .../plotting-visualization/seaborn-basics.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 603f074..41d76a4 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -17,3 +17,23 @@ sns.relplot( x="total_bill", y="tip", col="time", hue="smoker", style="smoker", size="size", ) +``` +Below is the output for the above code snippet: + +![Seaborn intro image](images/seaborn-basics.png) + +```Python +# Load an example dataset +tips = sns.load_dataset("tips") +``` +Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Most of the examples in the documentation will specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. + +```Python +# Create a visualization +sns.relplot( + data=tips, + x="total_bill", y="tip", col="time", + hue="smoker", style="smoker", size="size", +) +``` +This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how we provided only the names of the variables and their roles in the plot. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. From 4a7e00b61aa225b133fc702d23d70b3a74b70adf Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:58:54 +0530 Subject: [PATCH 57/99] Update seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 41d76a4..147083b 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -20,7 +20,7 @@ sns.relplot( ``` Below is the output for the above code snippet: -![Seaborn intro image](images/seaborn-basics.png) +![Seaborn intro image](images/seaborn-basics1.png) ```Python # Load an example dataset From ccaa3770e7b308fe25410124dedcdea772ebe504 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 21:04:10 +0530 Subject: [PATCH 58/99] Update seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 147083b..42df552 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -26,7 +26,7 @@ Below is the output for the above code snippet: # Load an example dataset tips = sns.load_dataset("tips") ``` -Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Most of the examples in the documentation will specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. +Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Many users specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. ```Python # Create a visualization @@ -36,4 +36,4 @@ sns.relplot( hue="smoker", style="smoker", size="size", ) ``` -This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how we provided only the names of the variables and their roles in the plot. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. +This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how only the names of the variables and their roles in the plot are provided. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. From d20b8efca6cb73ef7543c0db41c34aede656e88f Mon Sep 17 00:00:00 2001 From: Jaya-Prakash-17 Date: Sat, 1 Jun 2024 00:41:56 +0530 Subject: [PATCH 59/99] Content Added: Protocols --- contrib/advanced-python/index.md | 1 + contrib/advanced-python/protocols.md | 243 +++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 contrib/advanced-python/protocols.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b95e4b9..3945721 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -7,3 +7,4 @@ - [Regular Expressions in Python](regular_expressions.md) - [JSON module](json-module.md) - [Map Function](map-function.md) +- [Protocols](protocols.md) diff --git a/contrib/advanced-python/protocols.md b/contrib/advanced-python/protocols.md new file mode 100644 index 0000000..9b5e74a --- /dev/null +++ b/contrib/advanced-python/protocols.md @@ -0,0 +1,243 @@ +# Protocols in Python +Python can establish informal interfaces using protocols In order to improve code structure, reusability, and type checking. Protocols allow for progressive adoption and are more flexible than standard interfaces in other programming languages like JAVA, which are tight contracts that specify the methods and attributes a class must implement. + +>Before going into depth of this topic let's understand another topic which is pre-requisite od this topic \#TypingModule + +## Typing Module +This is a module in python which provides +1. Provides classes, functions, and type aliases. +2. Allows adding type annotations to our code. +3. Enhances code readability. +4. Helps in catching errors early. + +### Type Hints in Python: +Type hints allow you to specify the expected data types of variables, function parameters, and return values. This can improve code readability and help with debugging. + +Here is a simple function that adds two numbers: +```python +def add(a,b): + return a + b +add(10,20) +``` +>Output: 30 + +While this works fine, adding type hints makes the code more understandable and serves as documentation: + +```python +def add(a:int, b:int)->int: + return a + b +print(add(1,10)) +``` +>Output: 11 + +In this version, `a` and `b` are expected to be integers, and the function is expected to return an integer. This makes the function's purpose and usage clearer. + +#### let's see another example + +The function given below takes an iterable (it can be any off list, tuple, dict, set, frozeset, String... etc) and print it's content in a single line along with it's type. + +```python +from typing import Iterable +# type alias + +def print_all(l: Iterable)->None: + print(type(l),end=' ') + for i in l: + print(i,end=' ') + print() + +l = [1,2,3,4,5] # type: List[int] +s = {1,2,3,4,5} # type: Set[int] +t = (1,2,3,4,5) # type: Tuple[int] + +for iter_obj in [l,s,t]: + print_all(iter_obj) + +``` +Output: +> 1 2 3 4 5 +> 1 2 3 4 5 +> 1 2 3 4 5 + +and now lets try calling the function `print_all` using a non-iterable object `int` as argument. + +```python +a = 10 +print_all(a) # This will raise an error +``` +Output: +>TypeError: 'int' object is not iterable + +This error occurs because `a` is an `integer`, and the `integer` class does not have any methods or attributes that make it work like an iterable. In other words, the integer class does not conform to the `Iterable` protocol. + +**Benefits of Type Hints** +Using type hints helps in several ways: + +1. **Error Detection**: Tools like mypy can catch type-related problems during development, decreasing runtime errors. +2. **Code Readability**: Type hints serve as documentation, making it easy to comprehend what data types are anticipated and returned. +3. **Improved Maintenance**: With unambiguous type expectations, maintaining and updating code becomes easier, especially in huge codebases. + +Now that we have understood about type hints and typing module let's dive deep into protocols. + +## Understanding Protocols + +In Python, protocols define interfaces similar to Java interfaces. They let you specify methods and attributes that an object must implement without requiring inheritance from a base class. Protocols are part of the `typing` module and provide a way to enforce certain structures in your classes, enhancing type safety and code clarity. + +### What is a Protocol? + +A protocol specifies one or more method signatures that a class must implement to be considered as conforming to the protocol. + This concept is often referred to as "structural subtyping" or "duck typing," meaning that if an object implements the required methods and attributes, it can be treated as an instance of the protocol. + +Let's write our own protocol: + +```python +from typing import Protocol + +# Define a Printable protocol +class Printable(Protocol): + def print(self) -> None: + """Print the object""" + pass + +# Book class implements the Printable protocol +class Book: + def __init__(self, title: str): + self.title = title + + def print(self) -> None: + print(f"Book Title: {self.title}") + +# print_object function takes a Printable object and calls its print method +def print_object(obj: Printable) -> None: + obj.print() + +book = Book("Python Programming") +print_object(book) +``` +Output: +> Book Title: Python Programming + +In this example: + +1. **Printable Protocol:** Defines an interface with a single method print. +2. **Book Class:** Implements the Printable protocol by providing a print method. +3. **print_object Function:** Accepts any object that conforms to the Printable protocol and calls its print method. + +we got our output because the class `Book` confirms to the protocols `printable`. +similarly When you pass an object to `print_object` that does not conform to the Printable protocol, an error will occur. This is because the object does not implement the required `print` method. +Let's see an example: +```python +class Team: + def huddle(self) -> None: + print("Team Huddle") + +c = Team() +print_object(c) # This will raise an error +``` +Output: +>AttributeError: 'Team' object has no attribute 'print' + +In this case: +- The `Team` class has a `huddle` method but does not have a `print` method. +- When `print_object` tries to call the `print` method on a `Team` instance, it raises an `AttributeError`. + +> This is an important aspect of using protocols: they ensure that objects provide the necessary methods, leading to more predictable and reliable code. + +**Ensuring Protocol Conformance** +To avoid such errors, you need to ensure that any object passed to `print_object` implements the `Printable` protocol. Here's how you can modify the `Team` class to conform to the protocol: +```python +class Team: + def __init__(self, name: str): + self.name = name + + def huddle(self) -> None: + print("Team Huddle") + + def print(self) -> None: + print(f"Team Name: {self.name}") + +c = Team("Dream Team") +print_object(c) +``` +Output: +>Team Name: Dream Team + +The `Team` class now implements the `print` method, conforming to the `Printable` protocol. and hence, no longer raises an error. + +### Protocols and Inheritance: +Protocols can also be used in combination with inheritance to create more complex interfaces. +we can do that by following these steps: +**Step 1 - Base protocol**: Define a base protocol that specifies a common set of methods and attributes. +**Step 2 - Derived Protocols**: Create derives protocols that extends the base protocol with addition requirements +**Step 3 - Polymorphism**: Objects can then conform to multiple protocols, allowing for Polymorphic behavior. + +Let's see an example on this as well: + +```python +from typing import Protocol + +# Base Protocols +class Printable(Protocol): + def print(self) -> None: + """Print the object""" + pass + +# Base Protocols-2 +class Serializable(Protocol): + def serialize(self) -> str: + pass + +# Derived Protocol +class PrintableAndSerializable(Printable, Serializable): + pass + +# class with implementation of both Printable and Serializable +class Book_serialize: + def __init__(self, title: str): + self.title = title + + def print(self) -> None: + print(f"Book Title: {self.title}") + + def serialize(self) -> None: + print(f"serialize: {self.title}") + +# function accepts the object which implements PrintableAndSerializable +def test(obj: PrintableAndSerializable): + obj.print() + obj.serialize() + +book = Book_serialize("lean-in") +test(book) +``` +Output: +> Book Title: lean-in +serialize: lean-in + +In this example: + +**Printable Protocol:** Specifies a `print` method. +**Serializable Protocol:** Specifies a `serialize` method. +**PrintableAndSerializable Protocol:** Combines both `Printable` and `Serializable`. +**Book Class**: Implements both `print` and `serialize` methods, conforming to `PrintableAndSerializable`. +**test Function:** Accepts any object that implements the `PrintableAndSerializable` protocol. + +If you try to pass an object that does not conform to the `PrintableAndSerializable` protocol to the test function, it will raise an `error`. Let's see an example: + +```python +class Team: + def huddle(self) -> None: + print("Team Huddle") + +c = Team() +test(c) # This will raise an error +``` +output: +> AttributeError: 'Team' object has no attribute 'print' + +In this case: +The `Team` class has a `huddle` method but does not implement `print` or `serialize` methods. +When test tries to call `print` and `serialize` on a `Team` instance, it raises an `AttributeError`. + +**In Conclusion:** +>Python protocols offer a versatile and powerful means of defining interfaces, encouraging the decoupling of code, improving readability, and facilitating static type checking. They are particularly handy for scenarios involving file-like objects, bespoke containers, and any case where you wish to enforce certain behaviors without requiring inheritance from a specific base class. Ensuring that classes conform to protocols reduces runtime problems and makes your code more robust and maintainable. \ No newline at end of file From 9a504138c2b4f1ccb412e4e05cd0d2f76f864448 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:12:12 +0530 Subject: [PATCH 60/99] Delete contrib/ds-algorithms/stacks.md --- contrib/ds-algorithms/stacks.md | 131 -------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md deleted file mode 100644 index f9f662b..0000000 --- a/contrib/ds-algorithms/stacks.md +++ /dev/null @@ -1,131 +0,0 @@ -# STACKS IN PYTHON -In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: *PUSH* which inserts an element on top of the stack and *POP* which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. - -**POINTS TO BE REMEMBERED :-** -- A stack is a collection of data items that can be accessed at only one end, called *TOP*. -- Items can be inserted and deleted in a stack only at the *TOP*. -- The last item inserted in a stack is the first one to be deleted. -- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. - -## REAL LIFE EXAMPLES OF STACKS - -**PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. - -**PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. - -**BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. - -## APPLICATIONS OF STACKS - -Stacks are widely used in Computer Science: -- *Function call* management -- Maintaining the *UNDO* list for the application -- Web browser *history management* -- Evaluating expressions -- Checking the nesting of parentheses in an expression -- *Backtracking* algorithms (Recursion) - -Understanding these applications is essential for Software Development. - -## OPERATIONS ON A STACK - -Key operations on a stack include: -- **PUSH** - It is the process of inserting a new element on the top of a stack. -- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. -- **POP** - It is the process of deleting an element from the top of a stack. -- **UNDERFLOW** - A situation when we are popping item from an empty stack. -- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* -- **ISEMPTY** - It is the function which return true if stack is empty else false. -- **SHOW** -Displaying stack items. - -## IMPLEMENTING STACKS IN PYTHON - -```python -def isEmpty(S): - - if len(S) == 0: - return True - - else: - - return False - -def Push(S, item): - S.append(item) - -def Pop(S): - - if isEmpty(S): - return "Underflow" - - else: - val = S.pop() - return val - -def Peek(S): - - if isEmpty(S): - return "Underflow" - - else: - top = len(S) - 1 - return S[top] - -def Show(S): - - if isEmpty(S): - print("Sorry, No items in Stack") - - else: - print("(Top)", end=' ') - t = len(S) - 1 - while t >= 0: - print(S[t], "<", end=' ') - t -= 1 - print() -``` - -This code defines a stack data structure along with functions to manipulate it. To provide output, we would need to use these functions to interact with the stack. - -Here's an example: -```python -stack = [] - -Push(stack, 5) -Push(stack, 10) -Push(stack, 15) - -print("Stack after Push operations:") -Show(stack) - -print("Peek operation:", Peek(stack)) - -print("Pop operation:", Pop(stack)) - -print("Stack after Pop operation:") -Show(stack) -``` - -This would output: - -``` -Stack after Push operations: - -(Top) 15 < 10 < 5 < - -Peek operation: 15 - -Pop operation: 15 - -Stack after Pop operation: - -(Top) 10 < 5 < -``` - -## Complexity Analysis - -- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. -- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). -- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. - - From 1f54c5a7ccb5ba49d5f49728837521796f2b4de7 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:12:55 +0530 Subject: [PATCH 61/99] Add files via upload --- contrib/ds-algorithms/stacks.md | 116 ++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md new file mode 100644 index 0000000..428a193 --- /dev/null +++ b/contrib/ds-algorithms/stacks.md @@ -0,0 +1,116 @@ +# Stacks in Python + +In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: **PUSH** which inserts an element on top of the stack and **POP** which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. + +## Points to be Remebered + +- A stack is a collection of data items that can be accessed at only one end, called **TOP**. +- Items can be inserted and deleted in a stack only at the TOP. +- The last item inserted in a stack is the first one to be deleted. +- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. + +## Real Life Examples of Stacks + +- **PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. + +- **PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. + +- **BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. + +## Applications of Stacks + +Stacks are widely used in Computer Science: + +- Function call management +- Maintaining the UNDO list for the application +- Web browser *history management* +- Evaluating expressions +- Checking the nesting of parentheses in an expression +- Backtracking algorithms (Recursion) + +Understanding these applications is essential for Software Development. + +## Operations on a Stack + +Key operations on a stack include: + +- **PUSH** - It is the process of inserting a new element on the top of a stack. +- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. +- **POP** - It is the process of deleting an element from the top of a stack. +- **UNDERFLOW** - A situation when we are popping item from an empty stack. +- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* +- **isEMPTY** - It is the function which return true if stack is empty else false. +- **SHOW** -Displaying stack items. + +## Implementing Stacks in Python + +```python +def isEmpty(S): + if len(S) == 0: + return True + else: + return False + +def Push(S, item): + S.append(item) + +def Pop(S): + if isEmpty(S): + return "Underflow" + else: + val = S.pop() + return val + +def Peek(S): + if isEmpty(S): + return "Underflow" + else: + top = len(S) - 1 + return S[top] + +def Show(S): + if isEmpty(S): + print("Sorry, No items in Stack") + else: + print("(Top)", end=' ') + t = len(S) - 1 + while t >= 0: + print(S[t], "<", end=' ') + t -= 1 + print() + +stack = [] # initially stack is empty + +Push(stack, 5) +Push(stack, 10) +Push(stack, 15) + +print("Stack after Push operations:") +Show(stack) +print("Peek operation:", Peek(stack)) +print("Pop operation:", Pop(stack)) +print("Stack after Pop operation:") +Show(stack) +``` + +## Output + +```markdown +Stack after Push operations: + +(Top) 15 < 10 < 5 < + +Peek operation: 15 + +Pop operation: 15 + +Stack after Pop operation: + +(Top) 10 < 5 < +``` + +## Complexity Analysis + +- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. +- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). +- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. From d83b6e1deaa84b2d0d2411c7a5eb8b4284ab5351 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 1 Jun 2024 20:56:34 +0530 Subject: [PATCH 62/99] Update CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a366da..8688009 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,8 +24,8 @@ The list of topics for which we are looking for content are provided below along - Web Scrapping - [Link](https://github.com/animator/learn-python/tree/main/contrib/web-scrapping) - API Development - [Link](https://github.com/animator/learn-python/tree/main/contrib/api-development) - Data Structures & Algorithms - [Link](https://github.com/animator/learn-python/tree/main/contrib/ds-algorithms) -- Python Mini Projects - [Link](https://github.com/animator/learn-python/tree/main/contrib/mini-projects) -- Python Question Bank - [Link](https://github.com/animator/learn-python/tree/main/contrib/question-bank) +- Python Mini Projects - [Link](https://github.com/animator/learn-python/tree/main/contrib/mini-projects) **(Not accepting)** +- Python Question Bank - [Link](https://github.com/animator/learn-python/tree/main/contrib/question-bank) **(Not accepting)** You can check out some content ideas below. From d372975f6c7accb7dd3e7a7852ba61d3e24ea724 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Sat, 1 Jun 2024 21:45:43 +0530 Subject: [PATCH 63/99] Added file exception-handling.md --- contrib/advanced-python/exception-handling.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 contrib/advanced-python/exception-handling.md diff --git a/contrib/advanced-python/exception-handling.md b/contrib/advanced-python/exception-handling.md new file mode 100644 index 0000000..bddcac4 --- /dev/null +++ b/contrib/advanced-python/exception-handling.md @@ -0,0 +1,192 @@ +# Exception Handling in Python + +Exception handling is a way of managing errors that may occur during program execution, through which you can handle exceptions gracefully. Python's exception handling mechanism has been designed to avoid unexpected termination of the program and offer a means to either regain control after an error or display meaningful messages to the user. + +- **Error** - An error is a mistake or an incorrect result produced by a program. It can be a syntax error, a logical error, or a runtime error. Errors are typically fatal, meaning they prevent the program from continuing to execute. +- **Exception** - An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions. Exceptions are typically unexpected and can be handled by the program to prevent it from crashing or terminating abnormally. It can be runtime, input/output or system exceptions. Exceptions are designed to be handled by the program, allowing it to recover from the error and continue executing. + +## Python Built-in Exceptions + +There are plenty of built-in exceptions in Python that are raised when a corresponding error occur. +We can view all the built-in exceptions using the built-in `local()` function as follows: + +```python +print(dir(locals()['__builtins__'])) +``` + +|**S.No**|**Exception**|**Description**| +|---|---|---| +|1|SyntaxError|A syntax error occurs when the code we write violates the grammatical rules such as misspelled keywords, missing colon, mismatched parentheses etc.| +|2|TypeError|A type error occurs when we try to perform an operation or use a function with objects that are of incompatible data types.| +|3|NameError|A name error occurs when we try to use a variable, function, module or string without quotes that hasn't been defined or isn't used in a valid way.| +|4|IndexError|A index error occurs when we try to access an element in a sequence (like a list, tuple or string) using an index that's outside the valid range of indices for that sequence.| +|5|KeyError|A key error occurs when we try to access a key that doesn't exist in a dictionary. Attempting to retrieve a value using a non-existent key results this error.| +|6|ValueError|A value error occurs when we provide an argument or value that's inappropriate for a specific operation or function such as doing mathematical operations with incompatible types (e.g., dividing a string by an integer.)| +|7|AttributeError|An attribute error occurs when we try to access an attribute (like a variable or method) on an object that doesn't possess that attribute.| +|8|IOError|An IO (Input/Output) error occurs when an operation involving file or device interaction fails. It signifies that there's an issue during communication between your program and the external system.| +|9|ZeroDivisionError|A ZeroDivisionError occurs when we attempt to divide a number by zero. This operation is mathematically undefined, and Python raises this error to prevent nonsensical results.| +|10|ImportError|An import error occurs when we try to use a module or library that Python can't find or import succesfully.| + +## Try and Except Statement - Catching Exception + +The `try-except` statement allows us to anticipate potential errors during program execution and define what actions to take when those errors occur. This prevents the program from crashing unexpectedly and makes it more robust. + +Here's an example to explain this: + +```python +try: + # code that might raise an exception + result = 10 / 0 +except: + print("An error occured!") +``` + +Output + +```markdown +An error occured! +``` + +In this example, the `try` block contains the code that you suspect might raise an exception. Python attempts to execute the code within this block. If an exception occurs, Python jumps to the `except` block and executes the code within it. + +## Specific Exception Handling + +You can specify the type of expection you want to catch using the `except` keyword followed by the exception class name. You can also have multiple `except` blocks to handle different exception types. + +Here's an example: + +```python +try: + # Code that might raise ZeroDivisionError or NameError + result = 10 / 0 + name = undefined_variable +except ZeroDivisionError: + print("Oops! You tried to divide by zero.") +except NameError: + print("There's a variable named 'undefined_variable' that hasn't been defined yet.") +``` + +Output + +```markdown +Oops! You tried to divide by zero. +``` + +If you comment on the line `result = 10 / 0`, then the output will be + +```markdown +There's a variable named 'undefined_variable' that hasn't been defined yet. +``` + +## Important Note + +In this code, the `except` block are specific to each type of expection. If you want to catch both exceptions with a single `except` block, you can use of tuple of exceptions, like this: + +```python +try: + # Code that might raise ZeroDivisionError or NameError + result = 10 / 0 + name = undefined_variable +except (ZeroDivisionError, NameError): + print("An error occured!") +``` + +Output + +```markdown +An error occured! +``` + +## Try with Else Clause + +The `else` clause in a Python `try-except` block provides a way to execute code only when the `try` block succeeds without raising any exceptions. It's like having a section of code that runs exclusively under the condition that no errors occur during the main operation in the `try` block. + +Here's an example to understand this: + +```python +def calculate_average(numbers): + if len(numbers) == 0: # Handle empty list case seperately (optional) + return None + try: + total = sum(numbers) + average = total / len(numbers) + except ZeroDivisionError: + print("Cannot calculate average for a list containing zero.") + else: + print("The average is:", average) + return average #Optionally return the average here + +# Example usage +numbers = [10, 20, 30] +result = calculate_average(numbers) + +if result is not None: # Check if result is available (handles empty list case) + print("Calculation succesfull!") +``` + +Output + +```markdown +The average is: 20.0 +``` + +## Finally Keyword in Python + +The `finally` keyword in Python is used within `try-except` statements to execute a block of code **always**, regardless of whether an exception occurs in the `try` block or not. + +To understand this, let us take an example: + +```python +try: + a = 10 // 0 + print(a) +except ZeroDivisionError: + print("Cannot be divided by zero.") +finally: + print("Program executed!") +``` + +Output + +```markdown +Cannot be divided by zero. +Program executed! +``` + +## Raise Keyword in Python + +In Python, raising an exception allows you to signal that an error condition has occured during your program's execution. The `raise` keyword is used to explicity raise an exception. + +Let us take an example: + +```python +def divide(x, y): + if y == 0: + raise ZeroDivisionError("Can't divide by zero!") # Raise an exception with a message + result = x / y + return result + +try: + division_result = divide(10, 0) + print("Result:", division_result) +except ZeroDivisionError as e: + print("An error occured:", e) # Handle the exception and print the message +``` + +Output + +```markdown +An error occured: Can't divide by zero! +``` + +## Advantages of Exception Handling + +- **Improved Error Handling** - It allows you to gracefully handle unexpected situations that arise during program execution. Instead of crashing abruptly, you can define specific actions to take when exceptions occur, providing a smoother experience. +- **Code Robustness** - Exception Handling helps you to write more resilient programs by anticipating potential issues and providing approriate responses. +- **Enhanced Code Readability** - By seperating error handling logic from the core program flow, your code becomes more readable and easier to understand. The `try-except` blocks clearly indicate where potential errors might occur and how they'll be addressed. + +## Disadvantages of Exception Handling + +- **Hiding Logic Errors** - Relying solely on exception handling might mask underlying logic error in your code. It's essential to write clear and well-tested logic to minimize the need for excessive exception handling. +- **Performance Overhead** - In some cases, using `try-except` blocks can introduce a slight performance overhead compared to code without exception handling. Howerer, this is usually negligible for most applications. +- **Overuse of Exceptions** - Overusing exceptions for common errors or control flow can make code less readable and harder to maintain. It's important to use exceptions judiciously for unexpected situations. From a9e3a4673c62076ba2a764cf6d77d5acda177fc3 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid Date: Sun, 2 Jun 2024 00:39:56 +0530 Subject: [PATCH 64/99] Updated Files --- contrib/advanced-python/exception-handling.md | 6 +++--- contrib/advanced-python/index.md | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contrib/advanced-python/exception-handling.md b/contrib/advanced-python/exception-handling.md index bddcac4..3e0c672 100644 --- a/contrib/advanced-python/exception-handling.md +++ b/contrib/advanced-python/exception-handling.md @@ -1,6 +1,6 @@ # Exception Handling in Python -Exception handling is a way of managing errors that may occur during program execution, through which you can handle exceptions gracefully. Python's exception handling mechanism has been designed to avoid unexpected termination of the program and offer a means to either regain control after an error or display meaningful messages to the user. +Exception Handling is a way of managing the errors that may occur during a program execution. Python's exception handling mechanism has been designed to avoid the unexpected termination of the program, and offer to either regain control after an error or display a meaningful message to the user. - **Error** - An error is a mistake or an incorrect result produced by a program. It can be a syntax error, a logical error, or a runtime error. Errors are typically fatal, meaning they prevent the program from continuing to execute. - **Exception** - An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions. Exceptions are typically unexpected and can be handled by the program to prevent it from crashing or terminating abnormally. It can be runtime, input/output or system exceptions. Exceptions are designed to be handled by the program, allowing it to recover from the error and continue executing. @@ -35,7 +35,7 @@ Here's an example to explain this: ```python try: - # code that might raise an exception + # Code that might raise an exception result = 10 / 0 except: print("An error occured!") @@ -72,7 +72,7 @@ Output Oops! You tried to divide by zero. ``` -If you comment on the line `result = 10 / 0`, then the output will be +If you comment on the line `result = 10 / 0`, then the output will be: ```markdown There's a variable named 'undefined_variable' that hasn't been defined yet. diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b95e4b9..febcbbe 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -7,3 +7,4 @@ - [Regular Expressions in Python](regular_expressions.md) - [JSON module](json-module.md) - [Map Function](map-function.md) +- [Exception Handling in Python](exception-handling.md) From 3a8ac54d7cd94a7ceda1552d8be823129230ff78 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:05:00 +0530 Subject: [PATCH 65/99] Update clustering.md --- contrib/machine-learning/clustering.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/contrib/machine-learning/clustering.md b/contrib/machine-learning/clustering.md index 7d5577c..bc02d37 100644 --- a/contrib/machine-learning/clustering.md +++ b/contrib/machine-learning/clustering.md @@ -2,19 +2,6 @@ Clustering is an unsupervised machine learning technique that groups a set of objects in such a way that objects in the same group (called a cluster) are more similar to each other than to those in other groups (clusters). This README provides an overview of clustering, including its fundamental concepts, types, algorithms, and how to implement it using Python. -## Table of Contents - -1. [Introduction](#introduction) -2. [Concepts](#concepts) -3. [Types of Clustering](#types-of-clustering) -4. [Clustering Algorithms](#clustering-algorithms) -5. [Implementation](#implementation) - - [Using Scikit-learn](#using-scikit-learn) - - [Code Example](#code-example) -6. [Evaluation Metrics](#evaluation-metrics) -7. [Conclusion](#conclusion) -8. [References](#references) - ## Introduction Clustering is a technique used to find inherent groupings within data without pre-labeled targets. It is widely used in exploratory data analysis, pattern recognition, image analysis, information retrieval, and bioinformatics. @@ -107,9 +94,3 @@ print(data.head()) ## Conclusion Clustering is a powerful technique for discovering structure in data. Understanding different clustering algorithms and their evaluation metrics is crucial for selecting the appropriate method for a given problem. - -## References - -- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html) -- [Wikipedia: Cluster Analysis](https://en.wikipedia.org/wiki/Cluster_analysis) -- [Towards Data Science: A Comprehensive Guide to Clustering](https://towardsdatascience.com/a-comprehensive-guide-to-clustering-9789897f8b88) From 03a168d202babc9839e00b9b9563dc49f39bed39 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:11:03 +0530 Subject: [PATCH 66/99] Update and rename IntroToCNNs.md to intro-to-cnn.md --- .../{IntroToCNNs.md => intro-to-cnn.md} | 75 +++++-------------- 1 file changed, 17 insertions(+), 58 deletions(-) rename contrib/machine-learning/{IntroToCNNs.md => intro-to-cnn.md} (89%) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/intro-to-cnn.md similarity index 89% rename from contrib/machine-learning/IntroToCNNs.md rename to contrib/machine-learning/intro-to-cnn.md index fb9027a..0221ca1 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/intro-to-cnn.md @@ -1,30 +1,5 @@ # Understanding Convolutional Neural Networks (CNN) -## Table of Contents -
-Click to expand - -- [Introduction](#introduction) -- [CNN Architecture](#cnn-architecture) - -
- Convolutional Layer - - - [Input Shape](#input-shape) - - [Stride](#strides) - - [Padding](#padding) - - [Filter](#filters) - - [Output](#output) - -
- -- [Pooling Layer](#pooling-layer) -- [Flatten Layer](#flatten-layer) -- [Dropout Layer](#dropout-layer) - -- [Implementation](#implementation) - -
- ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. @@ -52,9 +27,7 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
- -
+![image](assets/cnn-input_shape.png) - The input matrix is a binary image of handwritten digits, where '1' marks the pixels containing the digit (ink/grayscale area) and '0' marks the background pixels (empty space). @@ -63,9 +36,7 @@ where '1' marks the pixels containing the digit (ink/grayscale area) and '0' mar #### Strides The step size with which the filter moves across the input image. -
- -
+![image](assets/cnn-strides.png) - This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of (3,3) and (2,2). - A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. @@ -74,9 +45,7 @@ The step size with which the filter moves across the input image. #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid'). -
- -
+![image](assets/cnn-padding.png) - `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. - Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. @@ -84,37 +53,31 @@ Determines whether the output size is the same as the input size ('same') or red #### Filters Small matrices that slide over the input data to extract features. -
- -
+![image](assets/cnn-filters.png) - The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. - The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. - The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'. -
- #### Output A set of feature maps that represent the presence of different features in the input. -
- -
+![image](assets/cnn-ouputs.png) - With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. - By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. - Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. - The output dimension of a CNN model is given by, $$ n_{out} = { n_{in} + (2 \cdot p) - k \over s } $$ -where,
- nin = number of input features
- p = padding
- k = kernel size
+where, + nin = number of input features + p = padding + k = kernel size s = stride -- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ -
where,
- nc = number of input channels
- k x k = kernel size
- f = number of filters
+- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ +where, + nc = number of input channels + k x k = kernel size + f = number of filters an additional f is added for bias ### Pooling Layer @@ -135,18 +98,14 @@ Pooling layers reduce the dimensionality of each feature map while retaining the The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. - **Input Shape:** The 2D feature maps from the previous layer. - **Output:** A 1D vector that represents the same data in a flattened format. -
- -
+![image](assets/cnn-flattened.png) ### Dropout Layer Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. - **Input Shape:** The data from the previous layer. - **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). - **Output:** The same shape as the input, with some units set to zero. -
- -
+![image](assets/cnn-dropout.png) - The updated 0 values represents the dropped units. @@ -263,4 +222,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! \ No newline at end of file +Feel free to play around with the parameters! From e4dd80f1ce9e18679d00ba97bbe99a337a15b73e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:11:26 +0530 Subject: [PATCH 67/99] Update index.md --- contrib/machine-learning/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index ea8b5cb..988a27f 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,4 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) -- [Introduction To Convolutional Neural Networks (CNNs)](IntroToCNNs.md) +- [Introduction To Convolutional Neural Networks (CNNs)](intro-to-cnn.md) From 33543fd13c21329a4656f360a96d29c6483e8c71 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:15:14 +0530 Subject: [PATCH 68/99] Delete .vscode/settings.json --- .vscode/settings.json | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7a73a41..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file From 3c95166575d6e25c2544a0be7d8d8cae4ab9b45e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:15:39 +0530 Subject: [PATCH 69/99] Rename Random_Forest.md to random-forest.md --- contrib/machine-learning/{Random_Forest.md => random-forest.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{Random_Forest.md => random-forest.md} (99%) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/random-forest.md similarity index 99% rename from contrib/machine-learning/Random_Forest.md rename to contrib/machine-learning/random-forest.md index 59c44ef..0abd1ab 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/random-forest.md @@ -193,4 +193,4 @@ Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest Kaggle: Random Forest Guide -Towards Data Science: Understanding Random Forests \ No newline at end of file +Towards Data Science: Understanding Random Forests From 86e7c0d80613c236d05b4cd0895f0ee6df7601cb Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:16:18 +0530 Subject: [PATCH 70/99] Update index.md --- contrib/machine-learning/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 073bca9..3b8c95b 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,4 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) -- [Random Forest](Random_Forest.md) \ No newline at end of file +- [Random Forest](random-forest.md) From 0189c285cc983d2a19e306967bfe4d1f0dda43da Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:18:23 +0530 Subject: [PATCH 71/99] Update random-forest.md --- contrib/machine-learning/random-forest.md | 37 ++++------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/contrib/machine-learning/random-forest.md b/contrib/machine-learning/random-forest.md index 0abd1ab..feaaa7a 100644 --- a/contrib/machine-learning/random-forest.md +++ b/contrib/machine-learning/random-forest.md @@ -2,31 +2,6 @@ Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). - -- [Random Forest](#random-forest) - - [Introduction](#introduction) - - [How Random Forest Works](#how-random-forest-works) - - [1. Bootstrap Sampling:](#1-bootstrap-sampling) - - [2. Decision Trees:](#2-decision-trees) - - [3. Feature Selection:](#3-feature-selection) - - [4. Voting/Averaging:](#4-votingaveraging) - - [Detailed Working Mechanism](#detailed-working-mechanism) - - [Step 3: Aggregation:](#step-3-aggregation) - - [Advantages and Disadvantages](#advantages-and-disadvantages) - - [Advantages](#advantages) - - [Disadvantages](#disadvantages) - - [Hyperparameters](#hyperparameters) - - [Key Hyperparameters](#key-hyperparameters) - - [Tuning Hyperparameters](#tuning-hyperparameters) - - [Code Examples](#code-examples) - - [Classification Example](#classification-example) - - [Feature Importance](#feature-importance) - - [Hyperparameter Tuning](#hyperparameter-tuning) - - [Regression Example](#regression-example) - - [Conclusion](#conclusion) - - [References](#references) - - ## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. @@ -41,9 +16,9 @@ Random Forest is an ensemble learning method used for classification and regress For classification, the mode of the classes predicted by individual trees is taken (majority vote). For regression, the average of the outputs of the individual trees is taken. ### Detailed Working Mechanism -* #### Step 1: Bootstrap Sampling: +#### Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. -* #### Step 2: Tree Construction: +#### Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. #### Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. @@ -73,7 +48,7 @@ Hyperparameter tuning can significantly improve the performance of a Random Fore #### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -``` +```python import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -109,7 +84,7 @@ print("Classification Report:\n", classification_report(y_test, y_pred)) Random Forest provides a way to measure the importance of each feature in making predictions. -``` +```python import matplotlib.pyplot as plt # Get feature importances @@ -132,7 +107,7 @@ plt.show() #### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -``` +```python from sklearn.model_selection import GridSearchCV # Define the parameter grid @@ -155,7 +130,7 @@ print("Best parameters found: ", grid_search.best_params_) #### Regression Example Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. -``` +```python import numpy as np import pandas as pd from sklearn.datasets import load_boston From 56e7774648e3dbccd68dbdc1d8e61521524b83aa Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:20:23 +0530 Subject: [PATCH 72/99] Update index.md --- contrib/ds-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index d3c3c27..e3fc378 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,4 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) -- [Sliding Window Technique](Sliding_Window.md) +- [Sliding Window Technique](sliding-window.md) From 234df0ee0b4b4d29a799eac61b942cea57a785a9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:20:46 +0530 Subject: [PATCH 73/99] Rename Sliding_Window.md to sliding-window.md --- contrib/ds-algorithms/{Sliding_Window.md => sliding-window.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Sliding_Window.md => sliding-window.md} (100%) diff --git a/contrib/ds-algorithms/Sliding_Window.md b/contrib/ds-algorithms/sliding-window.md similarity index 100% rename from contrib/ds-algorithms/Sliding_Window.md rename to contrib/ds-algorithms/sliding-window.md From be0b5b69324ee8e4cb997d327e4ac753e1499093 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:22:13 +0530 Subject: [PATCH 74/99] Update index.md --- contrib/ds-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 653cc98..a07dc23 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,4 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) -- [Trie](Trie.md) +- [Trie](trie.md) From 1b0bd26cbe9aebbdfbf9135384f4928371a61a19 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:22:32 +0530 Subject: [PATCH 75/99] Rename Trie.md to trie.md --- contrib/ds-algorithms/{Trie.md => trie.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Trie.md => trie.md} (100%) diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/trie.md similarity index 100% rename from contrib/ds-algorithms/Trie.md rename to contrib/ds-algorithms/trie.md From 04bc0893a2c596c042dd6dae1fe401714310b582 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:23:47 +0530 Subject: [PATCH 76/99] Update trie.md --- contrib/ds-algorithms/trie.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/ds-algorithms/trie.md b/contrib/ds-algorithms/trie.md index 43f0415..0ccfbaa 100644 --- a/contrib/ds-algorithms/trie.md +++ b/contrib/ds-algorithms/trie.md @@ -27,7 +27,7 @@ Node Class have mainly two components Code Block of Node Class : -``` +```python class Node: def __init__(self): self.alphabets = [None] * 26 @@ -40,7 +40,7 @@ Now we need to implement Trie. We create another class named Trie with some meth Code Implementation of Initialization: -``` +```python class Trie: def __init__(self): self.root = Node() @@ -51,7 +51,7 @@ class Trie: 1. **Insertion**: Inserts the word into the Trie. This method takes `word` as parameter. For each character in the word, it checks if there is a corresponding child node. If not, it creates a new `Node`. After processing all the characters in word, it increments the `end_of_word` value of the last node. Code Implementation of Insertion: -``` +```python def insert(self, word): node = self.root for char in word: @@ -69,7 +69,7 @@ There are two cases in Searching: - *Word found*: It happens when the search word is present in the Trie. This case will occur, when the `end_of_word` value is greater than `0` of the node after traversing the whole word. Code Implementation of Searching: -``` +```python def Search(self, word): node = self.root for char in word: @@ -84,7 +84,7 @@ Code Implementation of Searching: Code Implementation of Deletion: -``` +```python def delete(self, word): node = self.root for char in word: @@ -96,7 +96,7 @@ def delete(self, word): Python Code to implement Trie: -``` +```python class Node: def __init__(self): self.alphabets = [None] * 26 From f20baa60d2614be595098b5a2d0fe4497dbfdf7e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:28:14 +0530 Subject: [PATCH 77/99] Update and rename matplotlib.md to matplotlib-introduction.md --- .../{matplotlib.md => matplotlib-introduction.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{matplotlib.md => matplotlib-introduction.md} (100%) diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib-introduction.md similarity index 100% rename from contrib/plotting-visualization/matplotlib.md rename to contrib/plotting-visualization/matplotlib-introduction.md From 0d420ef4a6914d35a986e65db90b6329d0c30d88 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:28:42 +0530 Subject: [PATCH 78/99] Update index.md --- contrib/plotting-visualization/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 84d07f9..d20340b 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,6 +1,6 @@ # List of sections - [Installing Matplotlib](matplotlib-installation.md) +- [Introducing Matplotlib](matplotlib-introduction.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) -- [Introducing Matplotlib](matplotlib.md) From 31eaf9948dc9f4f2417b0b91b69a852bc5618fea Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:29:56 +0530 Subject: [PATCH 79/99] Rename bar-plots.md to matplotlib-bar-plots.md --- .../{bar-plots.md => matplotlib-bar-plots.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{bar-plots.md => matplotlib-bar-plots.md} (100%) diff --git a/contrib/plotting-visualization/bar-plots.md b/contrib/plotting-visualization/matplotlib-bar-plots.md similarity index 100% rename from contrib/plotting-visualization/bar-plots.md rename to contrib/plotting-visualization/matplotlib-bar-plots.md From 358d8b05e4792ff9e819c36e14df3a3d2459c41f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:32:56 +0530 Subject: [PATCH 80/99] Update matplotlib-introduction.md --- .../matplotlib-introduction.md | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-introduction.md b/contrib/plotting-visualization/matplotlib-introduction.md index 02f17f5..691d1f8 100644 --- a/contrib/plotting-visualization/matplotlib-introduction.md +++ b/contrib/plotting-visualization/matplotlib-introduction.md @@ -12,8 +12,9 @@ To make this process of data visualization easier and clearer, matplotlib librar ## Starting with Matplotlib -### 1.] Install and import the neccasary libraries - mayplotlib.pylplot -```python +### 1. Install and import the neccasary libraries - mayplotlib.pylplot + +```bash pip install matplotlib ``` @@ -22,9 +23,7 @@ import maptplotlib.pyplot as plt import numpy as np ``` - - -### 2.] Scatter plot +### 2. Scatter plot Scatter plot is a type of plot that uses the cartesian coordinates between x and y to describe the relation between them. It uses dots to represent relation between the data variables of the data set. ```python @@ -41,12 +40,9 @@ plt.tight_layout() plt.show() ``` +![scatterplot](images/scatterplot.png) - -![scatterplot](https://github.com/Harshita297/learn-python/assets/122027571/aa57eb31-4377-4f75-9a97-e4fa7a54a938) - - -### 3.] Bar plot +### 3. Bar plot Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. ```python @@ -61,11 +57,10 @@ plt.ylabel("Y values") plt.show() ``` -![barplot](https://github.com/Harshita297/learn-python/assets/122027571/00cea3cd-a962-4bfe-b158-921389ee564c) +![barplot](images/barplot.png) - -### 4.] Histogram +### 4. Histogram Histogram is the representation of frequency distribution of qualitative data. The height of each rectangle defines the amount, or how often that variable appears. ```python @@ -79,14 +74,7 @@ plt.ylabel("Frequency Distribution") plt.show() ``` -![histogram](https://github.com/Harshita297/learn-python/assets/122027571/32470819-bac5-4bb2-9f36-79521fa40bf3) - - - - - - - - + +![histogram](images/histogram.png) From 4468dd6e91b4481fd15249bed93988ea82acfe89 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:35:40 +0530 Subject: [PATCH 81/99] Rename Descriptive_Statistics.md to descriptive-statistics.md --- .../{Descriptive_Statistics.md => descriptive-statistics.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{Descriptive_Statistics.md => descriptive-statistics.md} (100%) diff --git a/contrib/pandas/Descriptive_Statistics.md b/contrib/pandas/descriptive-statistics.md similarity index 100% rename from contrib/pandas/Descriptive_Statistics.md rename to contrib/pandas/descriptive-statistics.md From 06935da991e2412c60f3b750b3dfe2955e2c4f5e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:05 +0530 Subject: [PATCH 82/99] Rename GroupBy_Functions_Pandas.md to groupby-functions.md --- .../pandas/{GroupBy_Functions_Pandas.md => groupby-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{GroupBy_Functions_Pandas.md => groupby-functions.md} (100%) diff --git a/contrib/pandas/GroupBy_Functions_Pandas.md b/contrib/pandas/groupby-functions.md similarity index 100% rename from contrib/pandas/GroupBy_Functions_Pandas.md rename to contrib/pandas/groupby-functions.md From df9ed4453f022c338fdfc4b588ac6fee861ece0b Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:22 +0530 Subject: [PATCH 83/99] Rename excel_with_pandas.md to excel-with-pandas.md --- contrib/pandas/{excel_with_pandas.md => excel-with-pandas.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{excel_with_pandas.md => excel-with-pandas.md} (100%) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel-with-pandas.md similarity index 100% rename from contrib/pandas/excel_with_pandas.md rename to contrib/pandas/excel-with-pandas.md From 6df31671efe29800d369ec7c9d74dcb297a18b6a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:42 +0530 Subject: [PATCH 84/99] Rename pandas_series_vs_numpy_ndarray.md to pandas-series-vs-numpy-ndarray.md --- ...ries_vs_numpy_ndarray.md => pandas-series-vs-numpy-ndarray.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{pandas_series_vs_numpy_ndarray.md => pandas-series-vs-numpy-ndarray.md} (100%) diff --git a/contrib/pandas/pandas_series_vs_numpy_ndarray.md b/contrib/pandas/pandas-series-vs-numpy-ndarray.md similarity index 100% rename from contrib/pandas/pandas_series_vs_numpy_ndarray.md rename to contrib/pandas/pandas-series-vs-numpy-ndarray.md From ccd5dea51ebf9da139f85762c98f42ec3f26f9cc Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:37:36 +0530 Subject: [PATCH 85/99] Update index.md --- contrib/pandas/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index c17d839..33c7347 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,10 +1,10 @@ # List of sections - [Pandas Introduction and Dataframes in Pandas](introduction.md) -- [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) -- [Pandas Descriptive Statistics](Descriptive_Statistics.md) -- [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) -- [Excel using Pandas DataFrame](excel_with_pandas.md) +- [Pandas Series Vs NumPy ndarray](pandas-series-vs-numpy-ndarray.md) +- [Pandas Descriptive Statistics](descriptive-statistics.md) +- [Group By Functions with Pandas](groupby-functions.md) +- [Excel using Pandas DataFrame](excel-with-pandas.md) - [Working with Date & Time in Pandas](datetime.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) From 59773b20eed7cff5a85b5785f96edfe4e90a7139 Mon Sep 17 00:00:00 2001 From: "Kaza.Sunitha" <133480054+Kazasunitha@users.noreply.github.com> Date: Sun, 2 Jun 2024 03:49:19 +0530 Subject: [PATCH 86/99] Added viewing_data_in_pandas.md file (#660) * Add files via upload * Update classes.md * Update classes.md * Update classes.md * Update index.md * Update classes.md * Update index.md * Add files via upload * Update viewing_data_in_pandas.md * Delete contrib/advanced-python/classes.md * Delete contrib/advanced-python/index.md * Revert "Delete contrib/advanced-python/index.md" This reverts commit 55fe958c1c57daf431b3dce1d5d103bb8361612a. * Update index.md * Update viewing_data_in_pandas.md Updated the heading format * Update index.md * Update and rename viewing_data_in_pandas.md to viewing-data.md * Update viewing-data.md --------- Co-authored-by: Ankit Mahato --- contrib/pandas/index.md | 1 + contrib/pandas/viewing-data.md | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 contrib/pandas/viewing-data.md diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 33c7347..e5a8353 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,6 +1,7 @@ # List of sections - [Pandas Introduction and Dataframes in Pandas](introduction.md) +- [Viewing data in pandas](viewing-data.md) - [Pandas Series Vs NumPy ndarray](pandas-series-vs-numpy-ndarray.md) - [Pandas Descriptive Statistics](descriptive-statistics.md) - [Group By Functions with Pandas](groupby-functions.md) diff --git a/contrib/pandas/viewing-data.md b/contrib/pandas/viewing-data.md new file mode 100644 index 0000000..8aaa4ae --- /dev/null +++ b/contrib/pandas/viewing-data.md @@ -0,0 +1,67 @@ +# Viewing rows of the frame + +## `head()` method + +The pandas library in Python provides a convenient method called `head()` that allows you to view the first few rows of a DataFrame. Let me explain how it works: +- The `head()` function returns the first n rows of a DataFrame or Series. +- By default, it displays the first 5 rows, but you can specify a different number of rows using the n parameter. + +### Syntax + +```python +dataframe.head(n) +``` + +`n` is the Optional value. The number of rows to return. Default value is `5`. + +### Example + +```python +import pandas as pd +df = pd.DataFrame({'animal': ['alligator', 'bee', 'falcon', 'lion','tiger','rabit','dog','fox','monkey','elephant']}) +df.head(n=5) +``` + +#### Output + +``` + animal +0 alligator +1 bee +2 falcon +3 lion +4 tiger +``` + +## `tail()` method + +The `tail()` function in Python displays the last five rows of the dataframe by default. It takes in a single parameter: the number of rows. We can use this parameter to display the number of rows of our choice. +- The `tail()` function returns the last n rows of a DataFrame or Series. +- By default, it displays the last 5 rows, but you can specify a different number of rows using the n parameter. + +### Syntax + +```python +dataframe.tail(n) +``` + +`n` is the Optional value. The number of rows to return. Default value is `5`. + +### Example + +```python +import pandas as pd +df = pd.DataFrame({'fruits': ['mongo', 'orange', 'apple', 'lemon','banana','water melon','papaya','grapes','cherry','coconut']}) +df.tail(n=5) +``` + +#### Output + +``` + fruits +5 water melon +6 papaya +7 grapes +8 cherry +9 coconut +``` From 839211767809e4c7d53f38dd21dafd90ccd9bd5a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:56:26 +0530 Subject: [PATCH 87/99] Update matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md index 566fdbb..b7488e6 100644 --- a/contrib/plotting-visualization/matplotlib-line-plot.md +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -1,24 +1,27 @@ # Line Chart in Matplotlib A line chart is a simple way to visualize data where we connect individual data points. It helps us to see trends and patterns over time or across categories. -
This type of chart is particularly useful for:
-* Comparing Data: Comparing multiple datasets on the same axes. -* Highlighting Changes: Illustrating changes and patterns in data. -* Visualizing Trends: Showing trends over time or other continuous variables. + +This type of chart is particularly useful for: +- Comparing Data: Comparing multiple datasets on the same axes. +- Highlighting Changes: Illustrating changes and patterns in data. +- Visualizing Trends: Showing trends over time or other continuous variables. ## Prerequisites -Line plots can be created in Python with Matplotlib's ``pyplot`` library. To build a line plot, first import ``Matplotlib``. It is a standard convention to import Matplotlib's pyplot library as ``plt``. -``` -import matplotlib.pyplot as plt +Line plots can be created in Python with Matplotlib's `pyplot` library. To build a line plot, first import `matplotlib`. It is a standard convention to import Matplotlib's pyplot library as `plt`. + +```python +import matplotlib.pyplot as plt ``` ## Creating a simple Line Plot First import matplotlib and numpy, these are useful for charting. -
You can use the ``plot(x,y)`` method to create a line chart.
-``` +You can use the `plot(x,y)` method to create a line chart. + +```python import matplotlib.pyplot as plt import numpy as np @@ -29,6 +32,7 @@ y = 2*x + 1 plt.plot(x, y) plt.show() ``` + When executed, this will show the following line plot: ![Basic line Chart](images/simple_line.png) @@ -36,8 +40,9 @@ When executed, this will show the following line plot: ## Curved line -The ``plot()`` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. -``` +The `plot()` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. + +```python import matplotlib.pyplot as plt import numpy as np @@ -47,6 +52,7 @@ y = 2**x + 1 plt.plot(x, y) plt.show() ``` + When executed, this will show the following Curved line plot: ![Curved line](images/line-curve.png) @@ -54,8 +60,9 @@ When executed, this will show the following Curved line plot: ## Line with Labels -To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an ``x label``, ``y label`` and ``title``. -``` +To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an `x label`, `y label` and `title`. + +```python import matplotlib.pyplot as plt import numpy as np @@ -72,15 +79,16 @@ plt.title("With Labels") plt.show() ``` + When executed, this will show the following line with labels plot: ![line with labels](images/line-labels.png) ## Multiple lines -More than one line can be in the plot. To add another line, just call the ``plot(x,y)`` function again. In the example below we have two different values for ``y(y1,y2)`` that are plotted onto the chart. +More than one line can be in the plot. To add another line, just call the `plot(x,y)` function again. In the example below we have two different values for `y(y1,y2)` that are plotted onto the chart. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -98,6 +106,7 @@ plt.plot(x, y1, plt.show() ``` + When executed, this will show the following Multiple lines plot: ![multiple lines](images/two-lines.png) @@ -105,9 +114,9 @@ When executed, this will show the following Multiple lines plot: ## Dotted line -Lines can be in the form of dots like the image below. Instead of calling ``plot(x,y)`` call the ``scatter(x,y)`` method. The ``scatter(x,y)`` method can also be used to (randomly) plot points onto the chart. +Lines can be in the form of dots like the image below. Instead of calling `plot(x,y)` call the `scatter(x,y)` method. The `scatter(x,y)` method can also be used to (randomly) plot points onto the chart. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -130,9 +139,9 @@ When executed, this will show the following Dotted line plot: ## Line ticks -You can change the ticks on the plot. Set them on the ``x-axis``, ``y-axis`` or even change their color. The line can be more thick and have an alpha value. +You can change the ticks on the plot. Set them on the `x-axis`, `y-axis` or even change their color. The line can be more thick and have an alpha value. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -166,9 +175,9 @@ When executed, this will show the following line ticks plot: ## Line with asymptote -An asymptote can be added to the plot. To do that, use ``plt.annotate()``. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. +An asymptote can be added to the plot. To do that, use `plt.annotate()`. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -222,9 +231,9 @@ When executed, this will show the following Line with asymptote plot: ## Line with text scale -It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In ``plt.yticks()`` we just pass a list with text values. These values are then show against the ``y axis``. +It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In `plt.yticks()` we just pass a list with text values. These values are then show against the `y axis`. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -261,6 +270,7 @@ ax.spines['left'].set_position(('data', 0)) plt.show() ``` + When executed, this will show the following Line with text scale plot: ![Line with text scale](images/line-with-text-scale.png) From aeb947bb1a0c3a44ff3b2ece398649bae6a9e5df Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:12 +0530 Subject: [PATCH 88/99] Rename ArtificialNeuralNetwork.md to ann.md --- contrib/machine-learning/{ArtificialNeuralNetwork.md => ann.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{ArtificialNeuralNetwork.md => ann.md} (100%) diff --git a/contrib/machine-learning/ArtificialNeuralNetwork.md b/contrib/machine-learning/ann.md similarity index 100% rename from contrib/machine-learning/ArtificialNeuralNetwork.md rename to contrib/machine-learning/ann.md From e3c2799e6f8a4e58ba00778d7d0cedc76b1495b3 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:31 +0530 Subject: [PATCH 89/99] Rename Decision-Tree.md to decision-tree.md --- contrib/machine-learning/{Decision-Tree.md => decision-tree.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{Decision-Tree.md => decision-tree.md} (99%) diff --git a/contrib/machine-learning/Decision-Tree.md b/contrib/machine-learning/decision-tree.md similarity index 99% rename from contrib/machine-learning/Decision-Tree.md rename to contrib/machine-learning/decision-tree.md index 6563a22..8159bcf 100644 --- a/contrib/machine-learning/Decision-Tree.md +++ b/contrib/machine-learning/decision-tree.md @@ -254,4 +254,4 @@ The final decision tree classifies instances based on the following rules: - If Outlook is Rain and Wind is Weak, PlayTennis is Yes - If Outlook is Rain and Wind is Strong, PlayTennis is No -> Note that the calculated entropies and information gains may vary slightly depending on the specific implementation and rounding methods used. \ No newline at end of file +> Note that the calculated entropies and information gains may vary slightly depending on the specific implementation and rounding methods used. From 038bc20a2805baf4165129ebdda4dc059cdcb223 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:44 +0530 Subject: [PATCH 90/99] Rename Regression.md to regression.md --- contrib/machine-learning/{Regression.md => regression.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Regression.md => regression.md} (100%) diff --git a/contrib/machine-learning/Regression.md b/contrib/machine-learning/regression.md similarity index 100% rename from contrib/machine-learning/Regression.md rename to contrib/machine-learning/regression.md From b19af0241afc2e239dfe31039d743ff888ec59ec Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:07 +0530 Subject: [PATCH 91/99] Rename tensorFlow.md to tensorflow.md --- contrib/machine-learning/{tensorFlow.md => tensorflow.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{tensorFlow.md => tensorflow.md} (99%) diff --git a/contrib/machine-learning/tensorFlow.md b/contrib/machine-learning/tensorflow.md similarity index 99% rename from contrib/machine-learning/tensorFlow.md rename to contrib/machine-learning/tensorflow.md index 1d9357d..b2c847c 100644 --- a/contrib/machine-learning/tensorFlow.md +++ b/contrib/machine-learning/tensorflow.md @@ -61,4 +61,4 @@ TensorFlow is a great choice if you: ## Example Use Cases - Building and deploying complex neural networks for image recognition, natural language processing, or recommendation systems. -- Developing models that need to be run on mobile or embedded devices. \ No newline at end of file +- Developing models that need to be run on mobile or embedded devices. From f909c3a2b92d6e1379b9ee276edf78b06592c6a5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:31 +0530 Subject: [PATCH 92/99] Rename binomial_distribution.md to binomial-distribution.md --- .../{binomial_distribution.md => binomial-distribution.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{binomial_distribution.md => binomial-distribution.md} (100%) diff --git a/contrib/machine-learning/binomial_distribution.md b/contrib/machine-learning/binomial-distribution.md similarity index 100% rename from contrib/machine-learning/binomial_distribution.md rename to contrib/machine-learning/binomial-distribution.md From 3b161f57fabb3c1665ccec773578dfcd3377dbe5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:53 +0530 Subject: [PATCH 93/99] Rename Types_of_optimizers.md to types-of-optimizers.md --- .../{Types_of_optimizers.md => types-of-optimizers.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Types_of_optimizers.md => types-of-optimizers.md} (100%) diff --git a/contrib/machine-learning/Types_of_optimizers.md b/contrib/machine-learning/types-of-optimizers.md similarity index 100% rename from contrib/machine-learning/Types_of_optimizers.md rename to contrib/machine-learning/types-of-optimizers.md From 87b2d056531182f69dea33798807b895214c731c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:01:46 +0530 Subject: [PATCH 94/99] Update index.md --- contrib/machine-learning/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index e56691d..a0dd999 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,16 +1,16 @@ # List of sections -- [Binomial Distribution](binomial_distribution.md) -- [Regression in Machine Learning](Regression.md) +- [Binomial Distribution](binomial-distribution.md) +- [Regression in Machine Learning](regression.md) - [Confusion Matrix](confusion-matrix.md) -- [Decision Tree Learning](Decision-Tree.md) +- [Decision Tree Learning](decision-tree.md) - [Random Forest](random-forest.md) - [Support Vector Machine Algorithm](support-vector-machine.md) -- [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) +- [Artificial Neural Network from the Ground Up](ann.md) - [Introduction To Convolutional Neural Networks (CNNs)](intro-to-cnn.md) -- [TensorFlow.md](tensorFlow.md) +- [TensorFlow.md](tensorflow.md) - [PyTorch.md](pytorch.md) -- [Types of optimizers](Types_of_optimizers.md) +- [Types of optimizers](types-of-optimizers.md) - [Logistic Regression](logistic-regression.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) From d6e610d8cc3505c806687db1d4dfb9ad0f4f5e66 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:03:36 +0530 Subject: [PATCH 95/99] Rename sklearn.md to sklearn-introduction.md --- .../machine-learning/{sklearn.md => sklearn-introduction.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{sklearn.md => sklearn-introduction.md} (99%) diff --git a/contrib/machine-learning/sklearn.md b/contrib/machine-learning/sklearn-introduction.md similarity index 99% rename from contrib/machine-learning/sklearn.md rename to contrib/machine-learning/sklearn-introduction.md index 8174d93..7bb5aa8 100644 --- a/contrib/machine-learning/sklearn.md +++ b/contrib/machine-learning/sklearn-introduction.md @@ -141,4 +141,4 @@ print(f"Accuracy: {accuracy * 100:.2f}%") ## Conclusion -scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. \ No newline at end of file +scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. From f671f4d3e9229ba6c622bad87a3972d4e74fea39 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:10:58 +0530 Subject: [PATCH 96/99] Rename matplotlib-line-plot.md to matplotlib-line-plots.md --- .../{matplotlib-line-plot.md => matplotlib-line-plots.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{matplotlib-line-plot.md => matplotlib-line-plots.md} (100%) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plots.md similarity index 100% rename from contrib/plotting-visualization/matplotlib-line-plot.md rename to contrib/plotting-visualization/matplotlib-line-plots.md From c7746086b91d44369aa6f8e7f3c4a863cd655da2 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:18:14 +0530 Subject: [PATCH 97/99] Rename Types_of_Cost_Functions.md to cost-functions.md --- .../{Types_of_Cost_Functions.md => cost-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Types_of_Cost_Functions.md => cost-functions.md} (100%) diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/cost-functions.md similarity index 100% rename from contrib/machine-learning/Types_of_Cost_Functions.md rename to contrib/machine-learning/cost-functions.md From f125cf4a33de46d7f8fee1066a347551f71ea13a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:26:45 +0530 Subject: [PATCH 98/99] Update cost-functions.md --- contrib/machine-learning/cost-functions.md | 41 ++++++++++------------ 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/contrib/machine-learning/cost-functions.md b/contrib/machine-learning/cost-functions.md index f650726..c1fe217 100644 --- a/contrib/machine-learning/cost-functions.md +++ b/contrib/machine-learning/cost-functions.md @@ -14,9 +14,9 @@ MSE is one of the most commonly used cost functions, particularly in regression The MSE is defined as: $$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual value. -- \( y^i\) is the predicted value. +- `n` is the number of samples. +- $y_i$ is the actual value. +- $\hat{y}_i$ is the predicted value. **Advantages:** - Sensitive to large errors due to squaring. @@ -43,9 +43,9 @@ MAE is another commonly used cost function for regression tasks. It measures the The MAE is defined as: $$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual value. -- \( y^i\) is the predicted value. +- `n` is the number of samples. +- $y_i$ is the actual value. +- $\hat{y}_i$ is the predicted value. **Advantages:** - Less sensitive to outliers compared to MSE. @@ -76,9 +76,9 @@ For binary classification, the cross-entropy loss is defined as: $$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual class label (0 or 1). -- \( y^i\) is the predicted probability of the positive class. +- `n` is the number of samples. +- $y_i$ is the actual class label (0 or 1). +- $\hat{y}_i$ is the predicted probability of the positive class. **Advantages:** @@ -109,11 +109,10 @@ The multiclass cross-entropy loss is defined as: $$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})$$ Where: -- \( n \) is the number of samples. -- \( C \) is the number of classes. -- \( y_{i,c} \) is the indicator function for the true class of sample \( i \). - -- (y^i,c) is the predicted probability of sample \( i \) belonging to class \( c \). +- `n` is the number of samples. +- `C` is the number of classes. +- $y_{i,c}$ is the indicator function for the true class of sample `i`. +- $\hat{y}_{i,c}$ is the predicted probability of sample `i` belonging to class `c`. **Advantages:** - Handles multiple classes effectively. @@ -143,9 +142,9 @@ For binary classification, the hinge loss is defined as: $$\text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual class label (-1 or 1). -- \( \hat{y}_i \) is the predicted score for sample \( i \). +- `n` is the number of samples. +- $y_i$ is the actual class label (-1 or 1). +- $\hat{y}_i$ is the predicted score for sample \( i \). **Advantages:** - Encourages margin maximization in SVMs. @@ -182,8 +181,8 @@ $$\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ \right.$$ Where: -- \( n \) is the number of samples. -- \(delta\) is a threshold parameter. +- `n` is the number of samples. +- $\delta$ is a threshold parameter. **Advantages:** - Provides a smooth loss function. @@ -214,7 +213,7 @@ The Log-Cosh loss is defined as: $$\text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i))$$ Where: -- \( n \) is the number of samples. +- `n` is the number of samples. **Advantages:** - Smooth and differentiable everywhere. @@ -234,5 +233,3 @@ def logcosh_loss(y_true, y_pred): ``` These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. - ---- From 15fed7ee6e448637b27ecdc23ef5157ed2ef5ce4 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:31:21 +0530 Subject: [PATCH 99/99] Update index.md --- contrib/api-development/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/api-development/index.md b/contrib/api-development/index.md index 7278907..8d4dc59 100644 --- a/contrib/api-development/index.md +++ b/contrib/api-development/index.md @@ -1,4 +1,4 @@ # List of sections - [API Methods](api-methods.md) -- [FastAPI](fast-api.md) \ No newline at end of file +- [FastAPI](fast-api.md)