diff --git a/Chapter_09.ipynb b/Chapter_09.ipynb
new file mode 100644
index 0000000..a5db378
--- /dev/null
+++ b/Chapter_09.ipynb
@@ -0,0 +1,34661 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "using CSV\n",
+ "using DataFrames\n",
+ "using Plots\n",
+ "using StatsPlots\n",
+ "using GLM\n",
+ "using Statistics\n",
+ "using Distributions\n",
+ "using Random\n",
+ "using MultivariateStats\n",
+ "using LIBSVM"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## This notebook has strong inspiration from [ISLR-python](https://github.com/JWarmenhoven/ISLR-python/blob/master/Notebooks/Chapter%209.ipynb)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Figure 9.1\n",
+ "X1 = [-1.5, 1.5]\n",
+ "X2 = [2.0/3.0, -4.0/3.0]\n",
+ "plot(X1, X2, xlabel=\"X1\", ylabel=\"X2\", label=\"1 + 2 X1 + 3 X2 = 0\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = randn(20, 2)\n",
+ "labels = repeat([-1, 1], 10)\n",
+ "x[labels .== -1, :] = x[labels .== -1, :] .+ 1\n",
+ "\n",
+ "scatter(x[labels .== 1, 1], x[labels .== 1, 2])\n",
+ "scatter!(x[labels .== -1, 1], x[labels .== -1, 2], xlabel=\"X1\", ylabel=\"X2\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "plot_svc (generic function with 3 methods)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "function plot_svc(model, x, y, h=0.02, pad=0.25)\n",
+ " x_min = minimum(x[:, 1]) - pad\n",
+ " x_max = maximum(x[:, 1]) + pad\n",
+ " y_min = minimum(x[:, 2]) - pad\n",
+ " y_max = maximum(x[:, 2]) + pad\n",
+ " \n",
+ " xx = x_min:h:x_max\n",
+ " yy = y_min:h:y_max\n",
+ " \n",
+ " f(i, j) = begin \n",
+ " c = reshape([i; j], (2, 1))\n",
+ " pred = svmpredict(model, c) \n",
+ " if pred[2][1] < 0\n",
+ " return -1\n",
+ " end\n",
+ " return 1\n",
+ " end\n",
+ " \n",
+ " contour(xx, yy, f, fill = true)\n",
+ "end"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LIBSVM.SVM{Int64}(SVC, LIBSVM.Kernel.Linear, nothing, 2, 2, [-1, 1], Int32[1, 2], Float64[], Int32[], LIBSVM.SupportVectors{Int64,Float64}(10, Int32[5, 5], [-1, -1, -1, -1, -1, 1, 1, 1, 1, 1], [0.5619454406636804 0.3488368485140593 … 1.7610768109132122 -0.5390546959903736; 1.1190717682609719 0.8905676031637255 … -1.462309817246052 0.8446998890680568], Int32[1, 7, 11, 17, 19, 2, 4, 8, 10, 18], LIBSVM.SVMNode[LIBSVM.SVMNode(1, 0.5619454406636804), LIBSVM.SVMNode(1, 0.3488368485140593), LIBSVM.SVMNode(1, 1.865832273149916), LIBSVM.SVMNode(1, 1.2465220798764312), LIBSVM.SVMNode(1, 1.3377949807092382), LIBSVM.SVMNode(1, 0.5722367811060431), LIBSVM.SVMNode(1, 1.8970253945708542), LIBSVM.SVMNode(1, 0.1767107607950541), LIBSVM.SVMNode(1, 1.7610768109132122), LIBSVM.SVMNode(1, -0.5390546959903736)]), 0.0, [1.0; 1.0; … ; -0.343325137976408; -0.6885740126979735], Float64[], Float64[], [1.3863834535224921], 3, 0.5, 200.0, 0.001, 1.0, 0.5, 0.1, true, false)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = svmtrain(x', labels, kernel=Kernel.Linear)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "plot_svc(model, x, labels)\n",
+ "scatter!(x[labels .== 1, 1], x[labels .== 1, 2])\n",
+ "scatter!(x[labels .== -1, 1], x[labels .== -1, 2], xlabel=\"X1\", ylabel=\"X2\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = svmtrain(x', labels, kernel=Kernel.Linear, cost=0.1)\n",
+ "\n",
+ "plot_svc(model, x, labels)\n",
+ "scatter!(x[labels .== 1, 1], x[labels .== 1, 2])\n",
+ "scatter!(x[labels .== -1, 1], x[labels .== -1, 2], xlabel=\"X1\", ylabel=\"X2\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10×2 Array{Float64,2}:\n",
+ " 4.62623 5.83517\n",
+ " 5.11895 5.1316\n",
+ " 4.11709 6.64651\n",
+ " 2.16258 5.77153\n",
+ " 3.60996 5.26811\n",
+ " 5.72187 4.4572\n",
+ " 6.37056 4.45886\n",
+ " 5.35572 3.79251\n",
+ " 3.38903 8.14114\n",
+ " 4.38173 5.60279"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = randn(20, 2)\n",
+ "labels = repeat([-1, 1], 10)\n",
+ "x[labels .== -1, :] = x[labels .== -1, :] .+ 5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LIBSVM.SVM{Int64}(SVC, LIBSVM.Kernel.Linear, nothing, 2, 2, [-1, 1], Int32[1, 2], Float64[], Int32[], LIBSVM.SupportVectors{Int64,Float64}(2, Int32[1, 1], [-1, 1], [2.1625823939843034 -0.7291356975526773; 5.771533257558114 2.714922315434204], Int32[7, 2], LIBSVM.SVMNode[LIBSVM.SVMNode(1, 2.1625823939843034), LIBSVM.SVMNode(1, -0.7291356975526773)]), 0.0, [0.11296305277853795; -0.11296305277853795], Float64[], Float64[], [1.6992419834574224], 3, 0.5, 200.0, 0.001, 1.0, 0.5, 0.1, true, false)"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = svmtrain(x', labels, kernel=Kernel.Linear)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "plot_svc(model, x, labels)\n",
+ "scatter!(x[labels .== 1, 1], x[labels .== 1, 2])\n",
+ "scatter!(x[labels .== -1, 1], x[labels .== -1, 2], xlabel=\"X1\", ylabel=\"X2\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## SVM with non-linear kernel"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "200-element Array{Int64,1}:\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " -1\n",
+ " ⋮\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1\n",
+ " 1"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X = randn(2, 200)\n",
+ "X[:, 1:100] = X[:, 1:100] .+ 2\n",
+ "X[:, 101:150] = X[:, 101:150] .- 2\n",
+ "\n",
+ "labels = vcat(repeat([-1], 150), repeat([1], 50))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "scatter(X[1, labels .== 1], X[2, labels .== 1])\n",
+ "scatter!(X[1, labels .== -1], X[2, labels .== -1], legend=false)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = svmtrain(X, labels) # default kernel is RadialBasis\n",
+ "\n",
+ "plot_svc(model, X', labels)\n",
+ "scatter!(X[1, labels .== 1], X[2, labels .== 1])\n",
+ "scatter!(X[1, labels .== -1], X[2, labels .== -1], legend=false)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = svmtrain(X, labels, cost=100.0, gamma=1.0) # default kernel is RadialBasis\n",
+ "\n",
+ "plot_svc(model, X', labels)\n",
+ "scatter!(X[1, labels .== 1], X[2, labels .== 1])\n",
+ "scatter!(X[1, labels .== -1], X[2, labels .== -1], legend=false)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Julia 1.5.1",
+ "language": "julia",
+ "name": "julia-1.5"
+ },
+ "language_info": {
+ "file_extension": ".jl",
+ "mimetype": "application/julia",
+ "name": "julia",
+ "version": "1.5.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}