diff --git a/.config/espanso/match/base.yml b/.config/espanso/match/base.yml index c379976f..41377c5e 100644 --- a/.config/espanso/match/base.yml +++ b/.config/espanso/match/base.yml @@ -147,6 +147,9 @@ matches: - trigger: ;frac force_clipboard: true replace: \frac{}{} + - trigger: ;perp + force_clipboard: true + replace: \perp\!\!\!\perp - trigger: ;int force_clipboard: true replace: \int{f(x)\, dx} @@ -329,6 +332,10 @@ matches: - trigger: ;zwiki force_clipboard: true replace: https://pzwiki.net/wiki/Project_Zomboid_Wiki + # Routes to Vintage Story Wiki + - trigger: ;vswiki + force_clipboard: true + replace: https://wiki.vintagestory.at/ # Prepares about pages for firefox - trigger: ;conf force_clipboard: true diff --git a/.config/nvim/lua/plugins/nvimtree.lua b/.config/nvim/lua/plugins/nvimtree.lua index 7834152e..32f054e0 100644 --- a/.config/nvim/lua/plugins/nvimtree.lua +++ b/.config/nvim/lua/plugins/nvimtree.lua @@ -51,10 +51,6 @@ return { update_cwd = false, ignore_list = {}, }, - system_open = { - cmd = nil, - args = {}, - }, diagnostics = { enable = false, show_on_dirs = false, diff --git a/aliases b/aliases index ef4c738e..240f91db 100644 --- a/aliases +++ b/aliases @@ -37,6 +37,7 @@ alias Code="cd ~/Documents/Code && ls" alias graphics="cd ~/Documents/Graphic_Design && ls" alias Math="cd ~/Documents/Math && ls" alias sophia="cd ~/Documents/sophia && ls" +alias study="cd ~/Documents/study && ls" alias cplus="cd ~/Documents/Code/cpp && ls" alias js="cd ~/Documents/Code/javascript && ls" alias py="cd ~/Documents/Code/python && ls" @@ -273,8 +274,10 @@ alias sudoku="sku" # alias rbd="checkrebuild -v" # pip list and pip freeze command list pip packages # poetry virtual env +alias svenv="python -m venv .venv" alias venv='source ".venv/bin/activate"' alias {uvenv,dvenv}="deactivate" +alias pip="python -m pip" #Particularly useful commands more to remember than to use as aliases: # alias optimalbufsize= 'stat -c "%o"' # followed by filename will give you the optimal read/write BUFSIZE for a file @@ -341,6 +344,7 @@ alias vgrind="valgrind --leak-check=full --show-leak-kinds=all --track-origins=y # alias {twd,thewalkingdead}="steam steam://rungameid/1449690 &" # alias {cbmods,cybermods}="cd ~/.local/share/Steam/steamapps/common/Cyberpunk\ 2077/archive/pc/mod && ls" alias vintagestory="flatpak run at.vintagestory.VintageStory" +alias vsmods="cd ~/.var/app/at.vintagestory.VintageStory/config/VintagestoryData/Mods/ && ls" # docker specific Aliases alias docker-ls="docker container ls -a && docker images" diff --git a/gitignore.txt b/gitignore.txt index 93827a95..49bc4581 100644 --- a/gitignore.txt +++ b/gitignore.txt @@ -1,6 +1,8 @@ .env* -.gitignore .prettierrc .prettierignore .editorconfig -node_modules \ No newline at end of file +node_modules +*.vim +.venv/ +.ipynb_checkpoints/ diff --git a/math_notes/machine_learning/linear_regression.md b/math_notes/machine_learning/linear_regression.md new file mode 100644 index 00000000..131cc8fa --- /dev/null +++ b/math_notes/machine_learning/linear_regression.md @@ -0,0 +1,81 @@ +# Linear Regression + +In linear regression, given features and labels (X, Y), where Y is real-valued, +we try to learn a function f(x) to predict Y given x. Figure 2 outlines this +function: + +$$ \hat{y} = w_0 + w_1x_1 + w_2x_2 + \dots + w_mx_m = \mathbf{w}^T\mathbf{X} $$ + +_Figure 2: Learning Function_ + +where $\mathbf{X} = x_1\text{, } \dots \text{, } x_m$ are the feature values and +$\mathbf{w} = w_0 \text{, } \dots \text{, } w_n$ can be seen as weights. + +The weights determine how the corresponding feature affects the predicted value. +Thus, our task is to find the appropriate values of **w**. + +**Cost function:** The cost function helps us to figure out the best possible +values for **w**. For the cost function, we use the Mean Squared Error (MSE), +Figure 3. + +$$ MSE(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^{m}{\left(\hat{y_i} - y_i\right)^2} $$ + +_Figure 3: MSE_ + +Using this MSE function we are going to update the values of w, such that the +MSE value settles at the minimum. The method of updating w to minimize the cost +function (MSE) is called gradient descent. We initialize the values of w and +then update these values iteratively to minimize the cost. Sometimes the cost +function can be a non-convex function where you can settle at a local minimum, +but for linear regression, it is always a convex function. To update w, we take +gradients from the cost function. To find these gradients, we take partial +derivatives with respect to w. Figure 4 outlines this 'update rule'. + +- Initialize $w_i$ +- Repeat until convergence + $\{w_i := w_i - \alpha \times \frac{\partial MSE(\mathbf{w})}{\partial w_i}\}$ + Parameter $\alpha$ is called learning rate. + +_Figure 4: Update Rule_ + +Code: In order to perform linear regression, we are going to use a Python module +called scikit learn. In the following example, we will use the California +Housing Data Set. The data set contains information about the housing values in +the suburbs of Boston. + +There are 14 attributes for each **X**. Examples of these attributes include: + +- MedInc per capita crime rate by town +- HouseAge Average age of a house in years +- AveRooms Average Rooms in a home +- Population City population + +The target value **Y** is: + +- MedHouseVal - Median value of owner-occupied homes in $1000's + +Next, we split the data into training and testing sets. We train the model with +80% of the samples and test with the remaining 20%. Finally, we will evaluate +our model using MSE. + +```py +import sklearn +from sklearn.linear_model import LinearRegression +from sklearn.datasets import load_boston +from sklearn.model_selection import train_test_split +from sklearn.datasets import fetch_california_housing + +housing = fetch_california_housing() +X = housing ['data'] +Y = housing ['target'] + +X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state=5) + +lr = LinearRegression() +lr.fit(X_train, Y_train) +Y_pred = lr.predict(X_test) + +mse = sklearn.metrics.mean_squared_error(Y_test, Y_pred) + +print('Mean squared error for test set:', mse) +``` diff --git a/math_notes/machine_learning/logistic_regression.md b/math_notes/machine_learning/logistic_regression.md new file mode 100644 index 00000000..c679f853 --- /dev/null +++ b/math_notes/machine_learning/logistic_regression.md @@ -0,0 +1,103 @@ +# Classification + +Logistic regression is used in classification problems. For example, an email +can be classified as belonging to one of two classes: 'spam' and 'not spam'. +Given features and labels (**x**, **Y**), where **Y** can take only discrete +values (we can also say that the target variable is categorical), we try to +learn a function f(x) to predict Y given x. Figure 5 outlines this function. + +$$ \hat{y} = w_0 + w_1x_1 + w_2x_2 + \dots + w_mx_m = \mathbf{w}^T\mathbf{X} $$ + +where $\mathbf{X} = x_1 \text{, } \dots \text{, } x_m$ are the feature values +and $\mathbf{w} = w_0 \text{, } \dots \text{, } w_n$ can be seen as weights. + +_Figure 5: Learning Function_ + +As in linear regression, the weights determine how the corresponding feature +affects the predicted value, thus our task is to find the appropriate values of +**w**. + +In this binary classification problem, the predicted function must return binary +values (either 0 or 1). To achieve this, we apply to our function the sigmoid or +logistic function (Figure 6). The sigmoid function has the domain of all real +numbers, with a return value from 0 to 1. Unlike linear regression, using the +sigmoid function we transform the output into a probability. + +$$ \text{Sigmoid function: } \sigma(x) = \frac{1}{1 + \mathbf{e}^{-x}} $$ + +$$ \text{Sigmoid applied to learning function: } \sigma(\hat{y}) = \sigma\left(\mathbf{w}^T\mathbf{X}\right) = \frac{1}{1 + \mathbf{e}^{-\mathbf{w}^T\mathbf{X}}} $$ + +$$ \text{Probability for } \mathbf{X} \text{ to belong in the positive class: } Pr\left(c_{+}\mid X\right) = \frac{1}{1 + \mathbf{e}^{-\mathbf{w}^T\mathbf{X}}} $$ + +$$ \text{Probability for } \mathbf{X} \text{ to belong in the negative class: } Pr\left(c_{-}\mid X\right) = 1 - Pr\left(c_{+}\mid X\right) $$ + +_Figure 6: Sigmoid Function_ + +**Cost function**: Figure 7 outlines the cost function that is used in logistic +regression (Maximum Likelihood). + +$$ J(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^{m}{-\left[y_i\log \hat{y} + \left(1 - y_i\right)\left(1 - \hat{y}\right)\right]} $$ + +_Figure 7: Cost Function in Logistic Regression_ + +Using this cost function, we are going to update the values of **w**, such that +the J(w) value settles at the minimum. To obtain the values of **w**, we perform +the gradient descent algorithm. Figure 8 outlines the update rule of **w** in +logistic regression. + +- Initialize $w_i$ +- Repeat until convergence + $\{w_i := w_i - \alpha \cdot \frac{\partial MSE(\mathbf{w})}{\partial w_i}\}$ + Parameter $\alpha$ is called learning rate. + +_Figure 8: Update Rule_ + +**Code:i** To perform logistic regression we again use the scikit learn module. +In the following example, we will use the Breast Cancer Wisconsin (Diagnostic) +Data Set. There are 10 attributes for every **X** including: + +- radius (mean of distances from the center to points on the perimeter) +- texture (standard deviation of gray-scale values) +- perimeter +- area +- smoothness (local variation in radius lengths) + +The **Y** classes are: + +- WDBC-Malignant +- WDBC-Benign + +Next, we split the data into training and testing sets. We train the model with +80% of the samples and test with the remaining 20%. Finally, we will evaluate +our model using precision and recall metrics. The precision is the intuitive +ability of the classifier not to label as positive a sample that is negative, +and recall is the ability of the classifier to find all the positive samples. + +```py +import sklearn +from sklearn.linear_model import LogisticRegression +from sklearn.datasets import load_breast_cancer +from sklearn.model_selection import train_test_split +from sklearn.metrics import recall_score +from sklearn.metrics import precision_score + +data = load_breast_cancer() +X = data['data'] +Y = data['target'] + +X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state=5) +clf = LogisticRegression() +clf.fit(X_train, Y_train) +Y_pred = clf.predict(X_test) + +print('Recall:', recall_score(Y_test, Y_pred)) +print('Precision:', precision_score(Y_test, Y_pred)) +``` + +The disadvantage of this algorithm is that for each iteration m gradients have +to be computed leading to m training examples. If the training set is very +large, the above algorithm is going to be memory inefficient and might crash if +the training set doesn't fit in the memory. The Stochastic Gradient Descent +algorithm may be helpful in this case as it takes a sample of the training set +to calculate the weights-parameters instead of the entire sample space for each +iteration. This makes training much faster. diff --git a/mysql_docker_pip_setup.md b/mysql_docker_pip_setup.md new file mode 100644 index 00000000..feb08692 --- /dev/null +++ b/mysql_docker_pip_setup.md @@ -0,0 +1,84 @@ +### Setup + +Considering that it's been a while since I've set up MySQL and Pip, I thought +I'd document some of the basics here again for my own sake: + +**Setting Up Mysql** + +I opted to setup mysql via docker instead of installing it on bare metal. Simply +use the contained `docker-compose.yml` file with +[docker-compose](https://github.com/docker/compose) to get a very basic mysql +instance up and running: + +```sh +docker-compose up -d +``` + +Confirm it's running using `ps`: + +```sh +docker ps +``` + +As long as it's up and running you can test it to be sure: + +```sh +docker exec -it myjsql-basic mysql -u root -p +``` + +And put in the default root password from the `docker-compose.yml` file. + +**Virtual Environments** + +You'll want to install `pip` and also get a virtual environment running: + +```sh +python -m venv .venv +``` + +```sh +source .venv/bin/activate +``` + +Once inside the virtual environment, upgrade the local `pip`: + +```sh +python -m pip install --upgrade pip +``` + +And use that `pip` to install all the packages from `requirements.txt`: + +```sh +python -m pip install -r requirements.txt +``` + +If you need to create a new `requirements.txt`, then just: + +```sh +pip freeze > requirements.txt +``` + +**Confirming MySQL Statements Were Executed:** + +From within the `docker exec`'ed mysql repl, for now just use `SHOW DATABASES` +to ensure it went through: + +``` +mysql> SHOW DATABASES; +``` + +You should see output like this: + +``` ++--------------------+ +| Database | ++--------------------+ +| employee_db | +| information_schema | +| myapp | +| mysql | +| performance_schema | +| sys | ++--------------------+ +6 rows in set (0.001 sec) +``` diff --git a/scripts/html5 b/scripts/html5 index 5feee606..60cd0ac4 100755 --- a/scripts/html5 +++ b/scripts/html5 @@ -26,7 +26,8 @@ cat < + - -EOM \ No newline at end of file +EOM + diff --git a/wgu_questionnaire.md b/wgu_questionnaire.md index ab7124d8..70688ad1 100644 --- a/wgu_questionnaire.md +++ b/wgu_questionnaire.md @@ -75,11 +75,11 @@ ## Study.com Courses with OR - [Network and System Security: SDCM-0200](https://study.com/academy/course/computer-science-202-network-and-system-security.html) - OR + TAKE THIS ONE OR - [Introduction to Cybersecurity: SDCM-0215](https://study.com/academy/course/computer-science-110-introduction-to-cybersecurity.html) - [Database Programming: SDCM-0218](https://study.com/academy/course/computer-science-204-database-programming.html) - OR + TAKE THIS ONE OR - [Database Management: SDCM-0164](https://study.com/academy/course/computer-science-303-database-management.html) ## Sophia.org Documents