From 6a18aa51b4567204ff48df74b992411e08f72a41 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 8 Nov 2018 11:33:20 +0100 Subject: [PATCH] Update on sim part --- doc/pub/svm/html/._svm-bs000.html | 26 +- doc/pub/svm/html/._svm-bs001.html | 24 +- doc/pub/svm/html/._svm-bs002.html | 97 ++++++- doc/pub/svm/html/._svm-bs003.html | 24 +- doc/pub/svm/html/._svm-bs004.html | 24 +- doc/pub/svm/html/._svm-bs005.html | 24 +- doc/pub/svm/html/._svm-bs006.html | 24 +- doc/pub/svm/html/._svm-bs007.html | 24 +- doc/pub/svm/html/._svm-bs008.html | 24 +- doc/pub/svm/html/._svm-bs009.html | 24 +- doc/pub/svm/html/._svm-bs010.html | 24 +- doc/pub/svm/html/._svm-bs011.html | 24 +- doc/pub/svm/html/._svm-bs012.html | 24 +- doc/pub/svm/html/._svm-bs013.html | 24 +- doc/pub/svm/html/._svm-bs014.html | 24 +- doc/pub/svm/html/._svm-bs015.html | 24 +- doc/pub/svm/html/._svm-bs016.html | 24 +- doc/pub/svm/html/._svm-bs017.html | 73 ++++- doc/pub/svm/html/._svm-bs018.html | 23 +- doc/pub/svm/html/._svm-bs019.html | 23 +- doc/pub/svm/html/._svm-bs020.html | 23 +- doc/pub/svm/html/._svm-bs021.html | 228 ++++++++++++++-- doc/pub/svm/html/._svm-bs022.html | 54 ++-- doc/pub/svm/html/._svm-bs023.html | 93 ++----- doc/pub/svm/html/._svm-bs024.html | 94 +++++-- doc/pub/svm/html/._svm-bs025.html | 46 +++- doc/pub/svm/html/._svm-bs026.html | 197 ++++++++++++++ doc/pub/svm/html/svm-bs.html | 26 +- doc/pub/svm/html/svm-reveal.html | 334 ++++++++++++++++++++++- doc/pub/svm/html/svm-solarized.html | 342 ++++++++++++++++++++++- doc/pub/svm/html/svm.html | 342 ++++++++++++++++++++++- doc/pub/svm/ipynb/ipynb-svm-src.tar.gz | Bin 208 -> 207 bytes doc/pub/svm/ipynb/svm.ipynb | 363 ++++++++++++++++++++++++- doc/pub/svm/pdf/svm-minted.pdf | Bin 331483 -> 347549 bytes doc/src/SupportVMachines/svm.do.txt | 331 +++++++++++++++++++++- 35 files changed, 2637 insertions(+), 438 deletions(-) create mode 100644 doc/pub/svm/html/._svm-bs026.html diff --git a/doc/pub/svm/html/._svm-bs000.html b/doc/pub/svm/html/._svm-bs000.html index d46b684c2..5a2191ad4 100644 --- a/doc/pub/svm/html/._svm-bs000.html +++ b/doc/pub/svm/html/._svm-bs000.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -170,7 +172,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Nov 7, 2018

    +

    Nov 8, 2018


    @@ -194,7 +196,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs001.html b/doc/pub/svm/html/._svm-bs001.html index 399026d80..d4b3db13e 100644 --- a/doc/pub/svm/html/._svm-bs001.html +++ b/doc/pub/svm/html/._svm-bs001.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -199,7 +201,7 @@ unlikely that we can separate classes easily by say straight lines.
  • 10
  • 11
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs002.html b/doc/pub/svm/html/._svm-bs002.html index 07b5be673..ea5e950a6 100644 --- a/doc/pub/svm/html/._svm-bs002.html +++ b/doc/pub/svm/html/._svm-bs002.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -158,14 +160,83 @@ The theory behind support vector machines (SVM hereafter) is based on the mathematical description of so-called hyperplanes. Let us start with a two-dimensional case. This will also allow us to introduce our first SVM examples. These will be tailored to the case of two specific -classes, as displayed in the figure here. +classes, as displayed in the figure here based on the usage of the petal data.

    We assume here that our data set can be well separated into two domains, where a straight line does the job in the separating the two -classes. Here the two classes are represented by either crosses or +classes. Here the two classes are represented by either squares or circles. +

    + +

    from sklearn import datasets
    +from sklearn.svm import SVC, LinearSVC
    +from sklearn.linear_model import SGDClassifier
    +from sklearn.preprocessing import StandardScaler
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +iris = datasets.load_iris()
    +X = iris["data"][:, (2, 3)]  # petal length, petal width
    +y = iris["target"]
    +
    +setosa_or_versicolor = (y == 0) | (y == 1)
    +X = X[setosa_or_versicolor]
    +y = y[setosa_or_versicolor]
    +
    +
    +
    +C = 5
    +alpha = 1 / (C * len(X))
    +
    +lin_clf = LinearSVC(loss="hinge", C=C, random_state=42)
    +svm_clf = SVC(kernel="linear", C=C)
    +sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha,
    +                        max_iter=100000, random_state=42)
    +
    +scaler = StandardScaler()
    +X_scaled = scaler.fit_transform(X)
    +
    +lin_clf.fit(X_scaled, y)
    +svm_clf.fit(X_scaled, y)
    +sgd_clf.fit(X_scaled, y)
    +
    +print("LinearSVC:                   ", lin_clf.intercept_, lin_clf.coef_)
    +print("SVC:                         ", svm_clf.intercept_, svm_clf.coef_)
    +print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)
    +
    +# Compute the slope and bias of each decision boundary
    +w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]
    +b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]
    +w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]
    +b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]
    +w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]
    +b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]
    +
    +# Transform the decision boundary lines back to the original scale
    +line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])
    +line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])
    +line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])
    +
    +# Plot all three decision boundaries
    +plt.figure(figsize=(11, 4))
    +plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC")
    +plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC")
    +plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier")
    +plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor"
    +plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa"
    +plt.xlabel("Petal length", fontsize=14)
    +plt.ylabel("Petal width", fontsize=14)
    +plt.legend(loc="upper center", fontsize=14)
    +plt.axis([0, 5.5, 0, 2])
    +
    +plt.show()
    +

    @@ -184,7 +255,7 @@ circles.

  • 11
  • 12
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs003.html b/doc/pub/svm/html/._svm-bs003.html index bb33133ca..64c4fc579 100644 --- a/doc/pub/svm/html/._svm-bs003.html +++ b/doc/pub/svm/html/._svm-bs003.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -194,7 +196,7 @@ $$
  • 12
  • 13
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs004.html b/doc/pub/svm/html/._svm-bs004.html index 749e77be1..939997501 100644 --- a/doc/pub/svm/html/._svm-bs004.html +++ b/doc/pub/svm/html/._svm-bs004.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -210,7 +212,7 @@ When we try to separate hyperplanes, if it exists, we can use it to construct a
  • 13
  • 14
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs005.html b/doc/pub/svm/html/._svm-bs005.html index 58e847731..e25dc7676 100644 --- a/doc/pub/svm/html/._svm-bs005.html +++ b/doc/pub/svm/html/._svm-bs005.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -196,7 +198,7 @@ for our data sample.
  • 14
  • 15
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs006.html b/doc/pub/svm/html/._svm-bs006.html index db52ab566..bd69f3bf9 100644 --- a/doc/pub/svm/html/._svm-bs006.html +++ b/doc/pub/svm/html/._svm-bs006.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -192,7 +194,7 @@ $$
  • 15
  • 16
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs007.html b/doc/pub/svm/html/._svm-bs007.html index b748b5532..6c8374c5f 100644 --- a/doc/pub/svm/html/._svm-bs007.html +++ b/doc/pub/svm/html/._svm-bs007.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -196,7 +198,7 @@ $$
  • 16
  • 17
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs008.html b/doc/pub/svm/html/._svm-bs008.html index 48006344a..d78f7d1ea 100644 --- a/doc/pub/svm/html/._svm-bs008.html +++ b/doc/pub/svm/html/._svm-bs008.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -200,7 +202,7 @@ at all.
  • 17
  • 18
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs009.html b/doc/pub/svm/html/._svm-bs009.html index 80dfee3db..b1a972e43 100644 --- a/doc/pub/svm/html/._svm-bs009.html +++ b/doc/pub/svm/html/._svm-bs009.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -212,7 +214,7 @@ We have thus defined our margin as the invers of the norm of \( \boldsymbol{w} \
  • 18
  • 19
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs010.html b/doc/pub/svm/html/._svm-bs010.html index e8cac7084..d8d4c2f3f 100644 --- a/doc/pub/svm/html/._svm-bs010.html +++ b/doc/pub/svm/html/._svm-bs010.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -224,7 +226,7 @@ Then \( dz \) is no longer arbitrary.
  • 19
  • 20
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs011.html b/doc/pub/svm/html/._svm-bs011.html index 260e4471a..24b2a6c49 100644 --- a/doc/pub/svm/html/._svm-bs011.html +++ b/doc/pub/svm/html/._svm-bs011.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -217,7 +219,7 @@ $$
  • 20
  • 21
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs012.html b/doc/pub/svm/html/._svm-bs012.html index c73530b2f..47a93895f 100644 --- a/doc/pub/svm/html/._svm-bs012.html +++ b/doc/pub/svm/html/._svm-bs012.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -215,7 +217,7 @@ When \( \lambda_i > 0 \), the vectors \( \boldsymbol{x}_i \) are called support
  • 21
  • 22
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs013.html b/doc/pub/svm/html/._svm-bs013.html index 999868c65..b523ba1b2 100644 --- a/doc/pub/svm/html/._svm-bs013.html +++ b/doc/pub/svm/html/._svm-bs013.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -198,7 +200,7 @@ subject to \( \boldsymbol{y}^T\boldsymbol{\lambda}=0 \). Here we defined the vec
  • 22
  • 23
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs014.html b/doc/pub/svm/html/._svm-bs014.html index b56b6ce36..579cadacd 100644 --- a/doc/pub/svm/html/._svm-bs014.html +++ b/doc/pub/svm/html/._svm-bs014.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -208,7 +210,7 @@ Below we discuss how to find the optimal values of \( \lambda_i \). Before we pr
  • 23
  • 24
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs015.html b/doc/pub/svm/html/._svm-bs015.html index 6fc1126c9..5abf7c9cc 100644 --- a/doc/pub/svm/html/._svm-bs015.html +++ b/doc/pub/svm/html/._svm-bs015.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -209,7 +211,7 @@ misclassifications.
  • 24
  • 25
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs016.html b/doc/pub/svm/html/._svm-bs016.html index 7ae6500f9..b4a85d6ec 100644 --- a/doc/pub/svm/html/._svm-bs016.html +++ b/doc/pub/svm/html/._svm-bs016.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -227,6 +229,8 @@ $$
  • 24
  • 25
  • 26
  • +
  • ...
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs017.html b/doc/pub/svm/html/._svm-bs017.html index b832478ce..bc459cbb1 100644 --- a/doc/pub/svm/html/._svm-bs017.html +++ b/doc/pub/svm/html/._svm-bs017.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -171,6 +173,56 @@ obtain a separation between the classes which is almost linear. The change of basis, from \( x\rightarrow z=\phi(x) \) leads to the same type of equations to be solved, except that we need to introduce for example a polynomial transformation to a two-dimensional training set. +

    + + +

    import numpy as np
    +import os
    +
    +np.random.seed(42)
    +
    +# To plot pretty figures
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +X1D = np.linspace(-4, 4, 9).reshape(-1, 1)
    +X2D = np.c_[X1D, X1D**2]
    +y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.plot(X1D[:, 0][y==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][y==1], np.zeros(5), "g^")
    +plt.gca().get_yaxis().set_ticks([])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.2, 0.2])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], "bs")
    +plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], "g^")
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16])
    +plt.plot([-4.5, 4.5], [6.5, 6.5], "r--", linewidth=3)
    +plt.axis([-4.5, 4.5, -1, 17])
    +plt.subplots_adjust(right=1)
    +plt.show()
    +

    @@ -195,6 +247,7 @@ we need to introduce for example a polynomial transformation to a two-dimensiona

  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs018.html b/doc/pub/svm/html/._svm-bs018.html index d79c46dfd..f9dd5ae52 100644 --- a/doc/pub/svm/html/._svm-bs018.html +++ b/doc/pub/svm/html/._svm-bs018.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -213,6 +215,7 @@ the trouble of performing the transformation
  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs019.html b/doc/pub/svm/html/._svm-bs019.html index 2817079ed..5158782c4 100644 --- a/doc/pub/svm/html/._svm-bs019.html +++ b/doc/pub/svm/html/._svm-bs019.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -206,6 +208,7 @@ Given a kernel \( K \) and the targets \( y_i \) this matrix is easy to set up.
  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs020.html b/doc/pub/svm/html/._svm-bs020.html index 711036856..8f90bec88 100644 --- a/doc/pub/svm/html/._svm-bs020.html +++ b/doc/pub/svm/html/._svm-bs020.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -200,6 +202,7 @@ well in practice.
  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs021.html b/doc/pub/svm/html/._svm-bs021.html index 6bb3920cd..981db5f7d 100644 --- a/doc/pub/svm/html/._svm-bs021.html +++ b/doc/pub/svm/html/._svm-bs021.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -151,28 +153,199 @@ MathJax.Hub.Config({ -

    Mathematical optimization of convex functions

    - +

    The moons example

    -A mathematical (quadratic) optimization problem, or just optimization problem, has the form -$$ -\begin{align*} - &\mathrm{min}_{\lambda}\hspace{0.2cm} \frac{1}{2}\boldsymbol{\lambda}^T\boldsymbol{P}\boldsymbol{\lambda}+\boldsymbol{q}^T\boldsymbol{\lambda},\\ \nonumber - &\mathrm{subject\hspace{0.1cm}to} \hspace{0.2cm} \boldsymbol{G}\boldsymbol{\lambda} \preceq \boldsymbol{h} \wedge \boldsymbol{A}\boldsymbol{\lambda}=f. -\end{align*} -$$ -subject to some constraints for say a selected set \( i=1,2,\dots, n \). -In our case we are optimizing with respect to the Lagrangian multipliers \( \lambda_i \), and the -vector \( \boldsymbol{\lambda}=[\lambda_1, \lambda_2,\dots, \lambda_n] \) is the optimization variable we are dealing with. + +

    from __future__ import division, print_function, unicode_literals
     
    -

    -In our case we are particularly interested in a class of optimization problems called convex optmization problems. -In our discussion on gradient descent methods we discussed at length the definition of a convex function. +import numpy as np +np.random.seed(42) -

    -Convex optimization problems play a central role in applied mathematics and we recommend strongly Boyd and Vandenberghe's text on the topics. +import matplotlib +import matplotlib.pyplot as plt +plt.rcParams['axes.labelsize'] = 14 +plt.rcParams['xtick.labelsize'] = 12 +plt.rcParams['ytick.labelsize'] = 12 + +from sklearn.svm import SVC +from sklearn import datasets + + + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import StandardScaler +from sklearn.svm import LinearSVC + + +from sklearn.datasets import make_moons +X, y = make_moons(n_samples=100, noise=0.15, random_state=42) + +def plot_dataset(X, y, axes): + plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs") + plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^") + plt.axis(axes) + plt.grid(True, which='both') + plt.xlabel(r"$x_1$", fontsize=20) + plt.ylabel(r"$x_2$", fontsize=20, rotation=0) + +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.show() + +from sklearn.datasets import make_moons +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import PolynomialFeatures + +polynomial_svm_clf = Pipeline([ + ("poly_features", PolynomialFeatures(degree=3)), + ("scaler", StandardScaler()), + ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42)) + ]) + +polynomial_svm_clf.fit(X, y) + +def plot_predictions(clf, axes): + x0s = np.linspace(axes[0], axes[1], 100) + x1s = np.linspace(axes[2], axes[3], 100) + x0, x1 = np.meshgrid(x0s, x1s) + X = np.c_[x0.ravel(), x1.ravel()] + y_pred = clf.predict(X).reshape(x0.shape) + y_decision = clf.decision_function(X).reshape(x0.shape) + plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2) + plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1) + +plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) + +plt.show() + + +from sklearn.svm import SVC + +poly_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)) + ]) +poly_kernel_svm_clf.fit(X, y) + +poly100_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5)) + ]) +poly100_kernel_svm_clf.fit(X, y) + +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.title(r"$d=3, r=1, C=5$", fontsize=18) + +plt.subplot(122) +plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.title(r"$d=10, r=100, C=5$", fontsize=18) + +plt.show() + +def gaussian_rbf(x, landmark, gamma): + return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2) + +gamma = 0.3 + +x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1) +x2s = gaussian_rbf(x1s, -2, gamma) +x3s = gaussian_rbf(x1s, 1, gamma) + +XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)] +yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0]) + +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red") +plt.plot(X1D[:, 0][yk==0], np.zeros(4), "bs") +plt.plot(X1D[:, 0][yk==1], np.zeros(5), "g^") +plt.plot(x1s, x2s, "g--") +plt.plot(x1s, x3s, "b:") +plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1]) +plt.xlabel(r"$x_1$", fontsize=20) +plt.ylabel(r"Similarity", fontsize=14) +plt.annotate(r'$\mathbf{x}$', + xy=(X1D[3, 0], 0), + xytext=(-0.5, 0.20), + ha="center", + arrowprops=dict(facecolor='black', shrink=0.1), + fontsize=18, + ) +plt.text(-2, 0.9, "$x_2$", ha="center", fontsize=20) +plt.text(1, 0.9, "$x_3$", ha="center", fontsize=20) +plt.axis([-4.5, 4.5, -0.1, 1.1]) + +plt.subplot(122) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.axvline(x=0, color='k') +plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], "bs") +plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], "g^") +plt.xlabel(r"$x_2$", fontsize=20) +plt.ylabel(r"$x_3$ ", fontsize=20, rotation=0) +plt.annotate(r'$\phi\left(\mathbf{x}\right)$', + xy=(XK[3, 0], XK[3, 1]), + xytext=(0.65, 0.50), + ha="center", + arrowprops=dict(facecolor='black', shrink=0.1), + fontsize=18, + ) +plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3) +plt.axis([-0.1, 1.1, -0.1, 1.1]) + +plt.subplots_adjust(right=1) + +plt.show() + + +x1_example = X1D[3, 0] +for landmark in (-2, 1): + k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma) + print("Phi({}, {}) = {}".format(x1_example, landmark, k)) + +rbf_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001)) + ]) +rbf_kernel_svm_clf.fit(X, y) + + +from sklearn.svm import SVC + +gamma1, gamma2 = 0.1, 5 +C1, C2 = 0.001, 1000 +hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2) + +svm_clfs = [] +for gamma, C in hyperparams: + rbf_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C)) + ]) + rbf_kernel_svm_clf.fit(X, y) + svm_clfs.append(rbf_kernel_svm_clf) + +plt.figure(figsize=(11, 7)) + +for i, svm_clf in enumerate(svm_clfs): + plt.subplot(221 + i) + plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5]) + plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) + gamma, C = hyperparams[i] + plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16) + +plt.show() +

    @@ -193,6 +366,7 @@ Convex optimization problems play a central role in applied mathematics and we r

  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs022.html b/doc/pub/svm/html/._svm-bs022.html index 4244211c1..0ae797109 100644 --- a/doc/pub/svm/html/._svm-bs022.html +++ b/doc/pub/svm/html/._svm-bs022.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -151,28 +153,27 @@ MathJax.Hub.Config({ -

    How do we solve these problems?

    +

    Mathematical optimization of convex functions

    -If we use Python as programming language and wish to venture beyond -scikit-learn, tensorflow and similar software which makes our -lives so much easier, we need to dive into the wonderful world of -quadratic programming. We can, if we wish, solve the minimization -problem using say standard gradient methods or conjugate gradient -methods. However, these methods tend to exhibit a rather slow -converge. So, welcome to the promised land of quadratic programming. +A mathematical (quadratic) optimization problem, or just optimization problem, has the form +$$ +\begin{align*} + &\mathrm{min}_{\lambda}\hspace{0.2cm} \frac{1}{2}\boldsymbol{\lambda}^T\boldsymbol{P}\boldsymbol{\lambda}+\boldsymbol{q}^T\boldsymbol{\lambda},\\ \nonumber + &\mathrm{subject\hspace{0.1cm}to} \hspace{0.2cm} \boldsymbol{G}\boldsymbol{\lambda} \preceq \boldsymbol{h} \wedge \boldsymbol{A}\boldsymbol{\lambda}=f. +\end{align*} +$$ + +subject to some constraints for say a selected set \( i=1,2,\dots, n \). +In our case we are optimizing with respect to the Lagrangian multipliers \( \lambda_i \), and the +vector \( \boldsymbol{\lambda}=[\lambda_1, \lambda_2,\dots, \lambda_n] \) is the optimization variable we are dealing with.

    -The functions we need are contained in the quadratic programming package CVXOPT and we need to import it together with numpy as +In our case we are particularly interested in a class of optimization problems called convex optmization problems. +In our discussion on gradient descent methods we discussed at length the definition of a convex function.

    - - -

    import numpy
    -import cvxopt
    -
    -

    -This will make our life much easier. You don't need t write your own optimizer. +Convex optimization problems play a central role in applied mathematics and we recommend strongly Boyd and Vandenberghe's text on the topics.

    @@ -193,6 +194,7 @@ This will make our life much easier. You don't need t write your own optimizer.

  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs023.html b/doc/pub/svm/html/._svm-bs023.html index a8134b546..f2c0886d5 100644 --- a/doc/pub/svm/html/._svm-bs023.html +++ b/doc/pub/svm/html/._svm-bs023.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -151,71 +153,29 @@ MathJax.Hub.Config({ -

    A simplex example

    +

    How do we solve these problems?

    -We remind ourselves about the general problem we want to solve -$$ -\begin{align*} - &\mathrm{min}_{x}\hspace{0.2cm} \frac{1}{2}\boldsymbol{x}^T\boldsymbol{P}\boldsymbol{x}+\boldsymbol{q}^T\boldsymbol{x},\\ \nonumber - &\mathrm{subject\hspace{0.1cm} to} \hspace{0.2cm} \boldsymbol{G}\boldsymbol{x} \preceq \boldsymbol{h} \wedge \boldsymbol{A}\boldsymbol{x}=f. -\end{align*} -$$ +If we use Python as programming language and wish to venture beyond +scikit-learn, tensorflow and similar software which makes our +lives so much easier, we need to dive into the wonderful world of +quadratic programming. We can, if we wish, solve the minimization +problem using say standard gradient methods or conjugate gradient +methods. However, these methods tend to exhibit a rather slow +converge. So, welcome to the promised land of quadratic programming.

    -Let us show how to perform the optmization using a simple case. Assume we want to optimize the following problem -$$ -\begin{align*} - &\mathrm{min}_{x}\hspace{0.2cm} \frac{1}{2}x^2+5x+3y \\ \nonumber - &\mathrm{subject to} \\ \nonumber - &x, y \geq 0 \\ \nonumber - &x+3y \geq 15 \\ \nonumber - &2x+5y \leq 100 \\ \nonumber - &3x+4y \leq 80. \\ \nonumber -\end{align*} -$$ +The functions we need are contained in the quadratic programming package CVXOPT and we need to import it together with numpy as -The minimization problem can be rewritten in terms of vectors and matrices as (with \( x \) and \( y \) being the unknowns) -$$ -\frac{1}{2}\begin{bmatrix} x\\ y \end{bmatrix}^T \begin{bmatrix} 1 & 0\\ 0 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix}3\\ 4 \end{bmatrix}^T \begin{bmatrix}x \\ y \end{bmatrix}. -$$ - -Similarly, we can now set up the inequalities (we need to change \( \geq \) to \( \leq \) by multiplying with \( -1 \) on bot sides) as the following matrix-vector equation -$$ -\begin{bmatrix} -1 & 0 \\ 0 & -1 \\ -1 & -3 \\ 2 & 5 \\ 3 & 4\end{bmatrix}\begin{bmatrix} x \\ y\end{bmatrix} \preceq \begin{bmatrix}0 \\ 0\\ -15 \\ 100 \\ 80\end{bmatrix}. -$$ - -We have collapsed all the inequalities into a single matrix \( \boldsymbol{G} \). We see also that our matrix -$$ -\boldsymbol{P} =\begin{bmatrix} 1 & 0\\ 0 & 0 \end{bmatrix} -$$ - -is clearly positive semi-definite (all eigenvalues larger or equal zero). -Finally, the vector \( \boldsymbol{h} \) is defined as -$$ -\boldsymbol{h} = \begin{bmatrix}0 \\ 0\\ -15 \\ 100 \\ 80\end{bmatrix}. -$$ - -

    -Since we don't have any equalities the matrix \( \boldsymbol{A} \) is set to zero -The following code solves the equations for us

    -

    # Import the necessary packages
    -import numpy
    -from cvxopt import matrix
    -from cvxopt import solvers
    -P = matrix(numpy.diag([1,0]), tc=’d’)
    -q = matrix(numpy.array([3,4]), tc=’d’)
    -G = matrix(numpy.array([[-1,0],[0,-1],[-1,-3],[2,5],[3,4]]), tc=’d’)
    -h = matrix(numpy.array([0,0,-15,100,80]), tc=’d’)
    -# Construct the QP, invoke solver
    -sol = solvers.qp(P,q,G,h)
    -# Extract optimal value and solution
    -sol[’x’] 
    -sol[’primal objective’]
    +
    import numpy
    +import cvxopt
     
    +

    +This will make our life much easier. You don't need t write your own optimizer. +

    @@ -234,6 +194,7 @@ sol[’primal objective’]

  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs024.html b/doc/pub/svm/html/._svm-bs024.html index aa7fb5b20..87521650f 100644 --- a/doc/pub/svm/html/._svm-bs024.html +++ b/doc/pub/svm/html/._svm-bs024.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -151,26 +153,71 @@ MathJax.Hub.Config({ -

    Back to the more realistic cases

    +

    A simplex example

    -We are now ready to return to our setup of the optmization problem for a more realistic case. Introducint the slack parameter \( C \) we have +We remind ourselves about the general problem we want to solve $$ -\frac{1}{2} \boldsymbol{\lambda}^T\begin{bmatrix} y_1y_1K(\boldsymbol{x}_1,\boldsymbol{x}_1) & y_1y_2K(\boldsymbol{x}_1,\boldsymbol{x}_2) & \dots & \dots & y_1y_nK(\boldsymbol{x}_1,\boldsymbol{x}_n) \\ -y_2y_1K(\boldsymbol{x}_2,\boldsymbol{x}_1) & y_2y_2K(\boldsymbol{x}_2,\boldsymbol{x}_2) & \dots & \dots & y_1y_nK(\boldsymbol{x}_2,\boldsymbol{x}_n) \\ -\dots & \dots & \dots & \dots & \dots \\ -\dots & \dots & \dots & \dots & \dots \\ -y_ny_1K(\boldsymbol{x}_n,\boldsymbol{x}_1) & y_ny_2K(\boldsymbol{x}_n\boldsymbol{x}_2) & \dots & \dots & y_ny_nK(\boldsymbol{x}_n,\boldsymbol{x}_n) \\ -\end{bmatrix}\boldsymbol{\lambda}-\mathbb{I}\boldsymbol{\lambda}, +\begin{align*} + &\mathrm{min}_{x}\hspace{0.2cm} \frac{1}{2}\boldsymbol{x}^T\boldsymbol{P}\boldsymbol{x}+\boldsymbol{q}^T\boldsymbol{x},\\ \nonumber + &\mathrm{subject\hspace{0.1cm} to} \hspace{0.2cm} \boldsymbol{G}\boldsymbol{x} \preceq \boldsymbol{h} \wedge \boldsymbol{A}\boldsymbol{x}=f. +\end{align*} $$ -subject to \( \boldsymbol{y}^T\boldsymbol{\lambda}=0 \). Here we defined the vectors \( \boldsymbol{\lambda} =[\lambda_1,\lambda_2,\dots,\lambda_n] \) and -\( \boldsymbol{y}=[y_1,y_2,\dots,y_n] \). -With the slack constants this leads to the additional constraint \( 0\leq \lambda_i \leq C \). -

    -code will be added +Let us show how to perform the optmization using a simple case. Assume we want to optimize the following problem +$$ +\begin{align*} + &\mathrm{min}_{x}\hspace{0.2cm} \frac{1}{2}x^2+5x+3y \\ \nonumber + &\mathrm{subject to} \\ \nonumber + &x, y \geq 0 \\ \nonumber + &x+3y \geq 15 \\ \nonumber + &2x+5y \leq 100 \\ \nonumber + &3x+4y \leq 80. \\ \nonumber +\end{align*} +$$ +The minimization problem can be rewritten in terms of vectors and matrices as (with \( x \) and \( y \) being the unknowns) +$$ +\frac{1}{2}\begin{bmatrix} x\\ y \end{bmatrix}^T \begin{bmatrix} 1 & 0\\ 0 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix}3\\ 4 \end{bmatrix}^T \begin{bmatrix}x \\ y \end{bmatrix}. +$$ + +Similarly, we can now set up the inequalities (we need to change \( \geq \) to \( \leq \) by multiplying with \( -1 \) on bot sides) as the following matrix-vector equation +$$ +\begin{bmatrix} -1 & 0 \\ 0 & -1 \\ -1 & -3 \\ 2 & 5 \\ 3 & 4\end{bmatrix}\begin{bmatrix} x \\ y\end{bmatrix} \preceq \begin{bmatrix}0 \\ 0\\ -15 \\ 100 \\ 80\end{bmatrix}. +$$ + +We have collapsed all the inequalities into a single matrix \( \boldsymbol{G} \). We see also that our matrix +$$ +\boldsymbol{P} =\begin{bmatrix} 1 & 0\\ 0 & 0 \end{bmatrix} +$$ + +is clearly positive semi-definite (all eigenvalues larger or equal zero). +Finally, the vector \( \boldsymbol{h} \) is defined as +$$ +\boldsymbol{h} = \begin{bmatrix}0 \\ 0\\ -15 \\ 100 \\ 80\end{bmatrix}. +$$ + +

    +Since we don't have any equalities the matrix \( \boldsymbol{A} \) is set to zero +The following code solves the equations for us +

    + + +

    # Import the necessary packages
    +import numpy
    +from cvxopt import matrix
    +from cvxopt import solvers
    +P = matrix(numpy.diag([1,0]), tc=’d’)
    +q = matrix(numpy.array([3,4]), tc=’d’)
    +G = matrix(numpy.array([[-1,0],[0,-1],[-1,-3],[2,5],[3,4]]), tc=’d’)
    +h = matrix(numpy.array([0,0,-15,100,80]), tc=’d’)
    +# Construct the QP, invoke solver
    +sol = solvers.qp(P,q,G,h)
    +# Extract optimal value and solution
    +sol[’x’] 
    +sol[’primal objective’]
    +

    @@ -188,6 +235,7 @@ With the slack constants this leads to the additional constraint \( 0\leq \lamb

  • 24
  • 25
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/._svm-bs025.html b/doc/pub/svm/html/._svm-bs025.html index 6a1bdc7ab..265f3e28d 100644 --- a/doc/pub/svm/html/._svm-bs025.html +++ b/doc/pub/svm/html/._svm-bs025.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -151,9 +153,27 @@ MathJax.Hub.Config({ -

    Multiclass problems and regression with SVMs

    -This material will be added later. +

    Back to the more realistic cases

    +

    +We are now ready to return to our setup of the optmization problem for a more realistic case. Introducint the slack parameter \( C \) we have +$$ +\frac{1}{2} \boldsymbol{\lambda}^T\begin{bmatrix} y_1y_1K(\boldsymbol{x}_1,\boldsymbol{x}_1) & y_1y_2K(\boldsymbol{x}_1,\boldsymbol{x}_2) & \dots & \dots & y_1y_nK(\boldsymbol{x}_1,\boldsymbol{x}_n) \\ +y_2y_1K(\boldsymbol{x}_2,\boldsymbol{x}_1) & y_2y_2K(\boldsymbol{x}_2,\boldsymbol{x}_2) & \dots & \dots & y_1y_nK(\boldsymbol{x}_2,\boldsymbol{x}_n) \\ +\dots & \dots & \dots & \dots & \dots \\ +\dots & \dots & \dots & \dots & \dots \\ +y_ny_1K(\boldsymbol{x}_n,\boldsymbol{x}_1) & y_ny_2K(\boldsymbol{x}_n\boldsymbol{x}_2) & \dots & \dots & y_ny_nK(\boldsymbol{x}_n,\boldsymbol{x}_n) \\ +\end{bmatrix}\boldsymbol{\lambda}-\mathbb{I}\boldsymbol{\lambda}, +$$ + +subject to \( \boldsymbol{y}^T\boldsymbol{\lambda}=0 \). Here we defined the vectors \( \boldsymbol{\lambda} =[\lambda_1,\lambda_2,\dots,\lambda_n] \) and +\( \boldsymbol{y}=[y_1,y_2,\dots,y_n] \). +With the slack constants this leads to the additional constraint \( 0\leq \lambda_i \leq C \). + +

    +code will be added + +

      @@ -169,6 +189,8 @@ This material will be added later.
    • 24
    • 25
    • 26
    • +
    • 27
    • +
    • »
    diff --git a/doc/pub/svm/html/._svm-bs026.html b/doc/pub/svm/html/._svm-bs026.html new file mode 100644 index 000000000..256c542f6 --- /dev/null +++ b/doc/pub/svm/html/._svm-bs026.html @@ -0,0 +1,197 @@ + + + + + + + +Data Analysis and Machine Learning: Support Vector Machines + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Multiclass problems and regression with SVMs

    +This material will be added later. + +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/svm/html/svm-bs.html b/doc/pub/svm/html/svm-bs.html index d46b684c2..5a2191ad4 100644 --- a/doc/pub/svm/html/svm-bs.html +++ b/doc/pub/svm/html/svm-bs.html @@ -63,17 +63,18 @@ Automatically generated HTML file from DocOnce source ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -131,11 +132,12 @@ MathJax.Hub.Config({
  • The equations
  • The problem to solve
  • Different kernels and Mercer's theorem
  • -
  • Mathematical optimization of convex functions
  • -
  • How do we solve these problems?
  • -
  • A simplex example
  • -
  • Back to the more realistic cases
  • -
  • Multiclass problems and regression with SVMs
  • +
  • The moons example
  • +
  • Mathematical optimization of convex functions
  • +
  • How do we solve these problems?
  • +
  • A simplex example
  • +
  • Back to the more realistic cases
  • +
  • Multiclass problems and regression with SVMs
  • @@ -170,7 +172,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Nov 7, 2018

    +

    Nov 8, 2018


    @@ -194,7 +196,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 26
  • +
  • 27
  • »
  • diff --git a/doc/pub/svm/html/svm-reveal.html b/doc/pub/svm/html/svm-reveal.html index e68b85bc0..26583d00f 100644 --- a/doc/pub/svm/html/svm-reveal.html +++ b/doc/pub/svm/html/svm-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

     
    -

    Nov 7, 2018

    +

    Nov 8, 2018


    @@ -200,13 +200,83 @@ The theory behind support vector machines (SVM hereafter) is based on the mathematical description of so-called hyperplanes. Let us start with a two-dimensional case. This will also allow us to introduce our first SVM examples. These will be tailored to the case of two specific -classes, as displayed in the figure here. +classes, as displayed in the figure here based on the usage of the petal data.

    We assume here that our data set can be well separated into two domains, where a straight line does the job in the separating the two -classes. Here the two classes are represented by either crosses or +classes. Here the two classes are represented by either squares or circles. +

    + + +

    from sklearn import datasets
    +from sklearn.svm import SVC, LinearSVC
    +from sklearn.linear_model import SGDClassifier
    +from sklearn.preprocessing import StandardScaler
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +iris = datasets.load_iris()
    +X = iris["data"][:, (2, 3)]  # petal length, petal width
    +y = iris["target"]
    +
    +setosa_or_versicolor = (y == 0) | (y == 1)
    +X = X[setosa_or_versicolor]
    +y = y[setosa_or_versicolor]
    +
    +
    +
    +C = 5
    +alpha = 1 / (C * len(X))
    +
    +lin_clf = LinearSVC(loss="hinge", C=C, random_state=42)
    +svm_clf = SVC(kernel="linear", C=C)
    +sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha,
    +                        max_iter=100000, random_state=42)
    +
    +scaler = StandardScaler()
    +X_scaled = scaler.fit_transform(X)
    +
    +lin_clf.fit(X_scaled, y)
    +svm_clf.fit(X_scaled, y)
    +sgd_clf.fit(X_scaled, y)
    +
    +print("LinearSVC:                   ", lin_clf.intercept_, lin_clf.coef_)
    +print("SVC:                         ", svm_clf.intercept_, svm_clf.coef_)
    +print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)
    +
    +# Compute the slope and bias of each decision boundary
    +w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]
    +b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]
    +w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]
    +b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]
    +w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]
    +b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]
    +
    +# Transform the decision boundary lines back to the original scale
    +line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])
    +line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])
    +line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])
    +
    +# Plot all three decision boundaries
    +plt.figure(figsize=(11, 4))
    +plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC")
    +plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC")
    +plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier")
    +plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor"
    +plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa"
    +plt.xlabel("Petal length", fontsize=14)
    +plt.ylabel("Petal width", fontsize=14)
    +plt.legend(loc="upper center", fontsize=14)
    +plt.axis([0, 5.5, 0, 2])
    +
    +plt.show()
    +
    @@ -828,6 +898,57 @@ obtain a separation between the classes which is almost linear.

    The change of basis, from \( x\rightarrow z=\phi(x) \) leads to the same type of equations to be solved, except that we need to introduce for example a polynomial transformation to a two-dimensional training set. + +

    + + +

    import numpy as np
    +import os
    +
    +np.random.seed(42)
    +
    +# To plot pretty figures
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +X1D = np.linspace(-4, 4, 9).reshape(-1, 1)
    +X2D = np.c_[X1D, X1D**2]
    +y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.plot(X1D[:, 0][y==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][y==1], np.zeros(5), "g^")
    +plt.gca().get_yaxis().set_ticks([])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.2, 0.2])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], "bs")
    +plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], "g^")
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16])
    +plt.plot([-4.5, 4.5], [6.5, 6.5], "r--", linewidth=3)
    +plt.axis([-4.5, 4.5, -1, 17])
    +plt.subplots_adjust(right=1)
    +plt.show()
    +
    @@ -960,7 +1081,204 @@ well in practice.
    -

    Mathematical optimization of convex functions

    +

    The moons example

    +

    + + +

    from __future__ import division, print_function, unicode_literals
    +
    +import numpy as np
    +np.random.seed(42)
    +
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import StandardScaler
    +from sklearn.svm import LinearSVC
    +
    +
    +from sklearn.datasets import make_moons
    +X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
    +
    +def plot_dataset(X, y, axes):
    +    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")
    +    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")
    +    plt.axis(axes)
    +    plt.grid(True, which='both')
    +    plt.xlabel(r"$x_1$", fontsize=20)
    +    plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.show()
    +
    +from sklearn.datasets import make_moons
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import PolynomialFeatures
    +
    +polynomial_svm_clf = Pipeline([
    +        ("poly_features", PolynomialFeatures(degree=3)),
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))
    +    ])
    +
    +polynomial_svm_clf.fit(X, y)
    +
    +def plot_predictions(clf, axes):
    +    x0s = np.linspace(axes[0], axes[1], 100)
    +    x1s = np.linspace(axes[2], axes[3], 100)
    +    x0, x1 = np.meshgrid(x0s, x1s)
    +    X = np.c_[x0.ravel(), x1.ravel()]
    +    y_pred = clf.predict(X).reshape(x0.shape)
    +    y_decision = clf.decision_function(X).reshape(x0.shape)
    +    plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)
    +    plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)
    +
    +plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +
    +plt.show()
    +
    +
    +from sklearn.svm import SVC
    +
    +poly_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    +    ])
    +poly_kernel_svm_clf.fit(X, y)
    +
    +poly100_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5))
    +    ])
    +poly100_kernel_svm_clf.fit(X, y)
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=3, r=1, C=5$", fontsize=18)
    +
    +plt.subplot(122)
    +plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=10, r=100, C=5$", fontsize=18)
    +
    +plt.show()
    +
    +def gaussian_rbf(x, landmark, gamma):
    +    return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2)
    +
    +gamma = 0.3
    +
    +x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1)
    +x2s = gaussian_rbf(x1s, -2, gamma)
    +x3s = gaussian_rbf(x1s, 1, gamma)
    +
    +XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)]
    +yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red")
    +plt.plot(X1D[:, 0][yk==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][yk==1], np.zeros(5), "g^")
    +plt.plot(x1s, x2s, "g--")
    +plt.plot(x1s, x3s, "b:")
    +plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"Similarity", fontsize=14)
    +plt.annotate(r'$\mathbf{x}$',
    +             xy=(X1D[3, 0], 0),
    +             xytext=(-0.5, 0.20),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.text(-2, 0.9, "$x_2$", ha="center", fontsize=20)
    +plt.text(1, 0.9, "$x_3$", ha="center", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.1, 1.1])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], "bs")
    +plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], "g^")
    +plt.xlabel(r"$x_2$", fontsize=20)
    +plt.ylabel(r"$x_3$  ", fontsize=20, rotation=0)
    +plt.annotate(r'$\phi\left(\mathbf{x}\right)$',
    +             xy=(XK[3, 0], XK[3, 1]),
    +             xytext=(0.65, 0.50),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3)
    +plt.axis([-0.1, 1.1, -0.1, 1.1])
    +    
    +plt.subplots_adjust(right=1)
    +
    +plt.show()
    +
    +
    +x1_example = X1D[3, 0]
    +for landmark in (-2, 1):
    +    k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma)
    +    print("Phi({}, {}) = {}".format(x1_example, landmark, k))
    +
    +rbf_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
    +    ])
    +rbf_kernel_svm_clf.fit(X, y)
    +
    +
    +from sklearn.svm import SVC
    +
    +gamma1, gamma2 = 0.1, 5
    +C1, C2 = 0.001, 1000
    +hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)
    +
    +svm_clfs = []
    +for gamma, C in hyperparams:
    +    rbf_kernel_svm_clf = Pipeline([
    +            ("scaler", StandardScaler()),
    +            ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))
    +        ])
    +    rbf_kernel_svm_clf.fit(X, y)
    +    svm_clfs.append(rbf_kernel_svm_clf)
    +
    +plt.figure(figsize=(11, 7))
    +
    +for i, svm_clf in enumerate(svm_clfs):
    +    plt.subplot(221 + i)
    +    plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])
    +    plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +    gamma, C = hyperparams[i]
    +    plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)
    +
    +plt.show()
    +
    +
    + + +
    +

    Mathematical optimization of convex functions

    A mathematical (quadratic) optimization problem, or just optimization problem, has the form @@ -987,7 +1305,7 @@ Convex optimization problems play a central role in applied mathematics and we r

    -

    How do we solve these problems?

    +

    How do we solve these problems?

    If we use Python as programming language and wish to venture beyond @@ -1013,7 +1331,7 @@ This will make our life much easier. You don't need t write your own optimizer.

    -

    A simplex example

    +

    A simplex example

    We remind ourselves about the general problem we want to solve @@ -1094,7 +1412,7 @@ sol[’primal obj

    -

    Back to the more realistic cases

    +

    Back to the more realistic cases

    We are now ready to return to our setup of the optmization problem for a more realistic case. Introducint the slack parameter \( C \) we have @@ -1119,7 +1437,7 @@ With the slack constants this leads to the additional constraint \( 0\leq \lamb

    -

    Multiclass problems and regression with SVMs

    +

    Multiclass problems and regression with SVMs

    This material will be added later.
    diff --git a/doc/pub/svm/html/svm-solarized.html b/doc/pub/svm/html/svm-solarized.html index 582cd6470..3a6d1342e 100644 --- a/doc/pub/svm/html/svm-solarized.html +++ b/doc/pub/svm/html/svm-solarized.html @@ -57,17 +57,18 @@ div { text-align: justify; text-justify: inter-word; } ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -109,7 +110,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Nov 7, 2018

    +

    Nov 8, 2018












    @@ -155,14 +156,83 @@ The theory behind support vector machines (SVM hereafter) is based on the mathematical description of so-called hyperplanes. Let us start with a two-dimensional case. This will also allow us to introduce our first SVM examples. These will be tailored to the case of two specific -classes, as displayed in the figure here. +classes, as displayed in the figure here based on the usage of the petal data.

    We assume here that our data set can be well separated into two domains, where a straight line does the job in the separating the two -classes. Here the two classes are represented by either crosses or +classes. Here the two classes are represented by either squares or circles. +

    + +

    from sklearn import datasets
    +from sklearn.svm import SVC, LinearSVC
    +from sklearn.linear_model import SGDClassifier
    +from sklearn.preprocessing import StandardScaler
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +iris = datasets.load_iris()
    +X = iris["data"][:, (2, 3)]  # petal length, petal width
    +y = iris["target"]
    +
    +setosa_or_versicolor = (y == 0) | (y == 1)
    +X = X[setosa_or_versicolor]
    +y = y[setosa_or_versicolor]
    +
    +
    +
    +C = 5
    +alpha = 1 / (C * len(X))
    +
    +lin_clf = LinearSVC(loss="hinge", C=C, random_state=42)
    +svm_clf = SVC(kernel="linear", C=C)
    +sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha,
    +                        max_iter=100000, random_state=42)
    +
    +scaler = StandardScaler()
    +X_scaled = scaler.fit_transform(X)
    +
    +lin_clf.fit(X_scaled, y)
    +svm_clf.fit(X_scaled, y)
    +sgd_clf.fit(X_scaled, y)
    +
    +print("LinearSVC:                   ", lin_clf.intercept_, lin_clf.coef_)
    +print("SVC:                         ", svm_clf.intercept_, svm_clf.coef_)
    +print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)
    +
    +# Compute the slope and bias of each decision boundary
    +w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]
    +b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]
    +w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]
    +b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]
    +w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]
    +b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]
    +
    +# Transform the decision boundary lines back to the original scale
    +line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])
    +line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])
    +line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])
    +
    +# Plot all three decision boundaries
    +plt.figure(figsize=(11, 4))
    +plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC")
    +plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC")
    +plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier")
    +plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor"
    +plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa"
    +plt.xlabel("Petal length", fontsize=14)
    +plt.ylabel("Petal width", fontsize=14)
    +plt.legend(loc="upper center", fontsize=14)
    +plt.axis([0, 5.5, 0, 2])
    +
    +plt.show()
    +











    @@ -677,6 +747,56 @@ obtain a separation between the classes which is almost linear. The change of basis, from \( x\rightarrow z=\phi(x) \) leads to the same type of equations to be solved, except that we need to introduce for example a polynomial transformation to a two-dimensional training set. +

    + + +

    import numpy as np
    +import os
    +
    +np.random.seed(42)
    +
    +# To plot pretty figures
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +X1D = np.linspace(-4, 4, 9).reshape(-1, 1)
    +X2D = np.c_[X1D, X1D**2]
    +y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.plot(X1D[:, 0][y==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][y==1], np.zeros(5), "g^")
    +plt.gca().get_yaxis().set_ticks([])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.2, 0.2])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], "bs")
    +plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], "g^")
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16])
    +plt.plot([-4.5, 4.5], [6.5, 6.5], "r--", linewidth=3)
    +plt.axis([-4.5, 4.5, -1, 17])
    +plt.subplots_adjust(right=1)
    +plt.show()
    +











    @@ -789,7 +909,203 @@ well in practice.











    -

    Mathematical optimization of convex functions

    +

    The moons example

    +

    + + +

    from __future__ import division, print_function, unicode_literals
    +
    +import numpy as np
    +np.random.seed(42)
    +
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import StandardScaler
    +from sklearn.svm import LinearSVC
    +
    +
    +from sklearn.datasets import make_moons
    +X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
    +
    +def plot_dataset(X, y, axes):
    +    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")
    +    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")
    +    plt.axis(axes)
    +    plt.grid(True, which='both')
    +    plt.xlabel(r"$x_1$", fontsize=20)
    +    plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.show()
    +
    +from sklearn.datasets import make_moons
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import PolynomialFeatures
    +
    +polynomial_svm_clf = Pipeline([
    +        ("poly_features", PolynomialFeatures(degree=3)),
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))
    +    ])
    +
    +polynomial_svm_clf.fit(X, y)
    +
    +def plot_predictions(clf, axes):
    +    x0s = np.linspace(axes[0], axes[1], 100)
    +    x1s = np.linspace(axes[2], axes[3], 100)
    +    x0, x1 = np.meshgrid(x0s, x1s)
    +    X = np.c_[x0.ravel(), x1.ravel()]
    +    y_pred = clf.predict(X).reshape(x0.shape)
    +    y_decision = clf.decision_function(X).reshape(x0.shape)
    +    plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)
    +    plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)
    +
    +plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +
    +plt.show()
    +
    +
    +from sklearn.svm import SVC
    +
    +poly_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    +    ])
    +poly_kernel_svm_clf.fit(X, y)
    +
    +poly100_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5))
    +    ])
    +poly100_kernel_svm_clf.fit(X, y)
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=3, r=1, C=5$", fontsize=18)
    +
    +plt.subplot(122)
    +plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=10, r=100, C=5$", fontsize=18)
    +
    +plt.show()
    +
    +def gaussian_rbf(x, landmark, gamma):
    +    return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2)
    +
    +gamma = 0.3
    +
    +x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1)
    +x2s = gaussian_rbf(x1s, -2, gamma)
    +x3s = gaussian_rbf(x1s, 1, gamma)
    +
    +XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)]
    +yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red")
    +plt.plot(X1D[:, 0][yk==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][yk==1], np.zeros(5), "g^")
    +plt.plot(x1s, x2s, "g--")
    +plt.plot(x1s, x3s, "b:")
    +plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"Similarity", fontsize=14)
    +plt.annotate(r'$\mathbf{x}$',
    +             xy=(X1D[3, 0], 0),
    +             xytext=(-0.5, 0.20),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.text(-2, 0.9, "$x_2$", ha="center", fontsize=20)
    +plt.text(1, 0.9, "$x_3$", ha="center", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.1, 1.1])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], "bs")
    +plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], "g^")
    +plt.xlabel(r"$x_2$", fontsize=20)
    +plt.ylabel(r"$x_3$  ", fontsize=20, rotation=0)
    +plt.annotate(r'$\phi\left(\mathbf{x}\right)$',
    +             xy=(XK[3, 0], XK[3, 1]),
    +             xytext=(0.65, 0.50),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3)
    +plt.axis([-0.1, 1.1, -0.1, 1.1])
    +    
    +plt.subplots_adjust(right=1)
    +
    +plt.show()
    +
    +
    +x1_example = X1D[3, 0]
    +for landmark in (-2, 1):
    +    k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma)
    +    print("Phi({}, {}) = {}".format(x1_example, landmark, k))
    +
    +rbf_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
    +    ])
    +rbf_kernel_svm_clf.fit(X, y)
    +
    +
    +from sklearn.svm import SVC
    +
    +gamma1, gamma2 = 0.1, 5
    +C1, C2 = 0.001, 1000
    +hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)
    +
    +svm_clfs = []
    +for gamma, C in hyperparams:
    +    rbf_kernel_svm_clf = Pipeline([
    +            ("scaler", StandardScaler()),
    +            ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))
    +        ])
    +    rbf_kernel_svm_clf.fit(X, y)
    +    svm_clfs.append(rbf_kernel_svm_clf)
    +
    +plt.figure(figsize=(11, 7))
    +
    +for i, svm_clf in enumerate(svm_clfs):
    +    plt.subplot(221 + i)
    +    plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])
    +    plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +    gamma, C = hyperparams[i]
    +    plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)
    +
    +plt.show()
    +
    +

    +









    + +

    Mathematical optimization of convex functions

    A mathematical (quadratic) optimization problem, or just optimization problem, has the form @@ -814,7 +1130,7 @@ Convex optimization problems play a central role in applied mathematics and we r











    -

    How do we solve these problems?

    +

    How do we solve these problems?

    If we use Python as programming language and wish to venture beyond @@ -840,7 +1156,7 @@ This will make our life much easier. You don't need t write your own optimizer.











    -

    A simplex example

    +

    A simplex example

    We remind ourselves about the general problem we want to solve @@ -908,7 +1224,7 @@ sol[’primal obj











    -

    Back to the more realistic cases

    +

    Back to the more realistic cases

    We are now ready to return to our setup of the optmization problem for a more realistic case. Introducint the slack parameter \( C \) we have @@ -931,7 +1247,7 @@ With the slack constants this leads to the additional constraint \( 0\leq \lamb











    -

    Multiclass problems and regression with SVMs

    +

    Multiclass problems and regression with SVMs

    This material will be added later. diff --git a/doc/pub/svm/html/svm.html b/doc/pub/svm/html/svm.html index 7b4651af8..a41c5358e 100644 --- a/doc/pub/svm/html/svm.html +++ b/doc/pub/svm/html/svm.html @@ -62,17 +62,18 @@ div { text-align: justify; text-justify: inter-word; } ('The equations', 2, None, '___sec17'), ('The problem to solve', 2, None, '___sec18'), ("Different kernels and Mercer's theorem", 2, None, '___sec19'), + ('The moons example', 2, None, '___sec20'), ('Mathematical optimization of convex functions', 2, None, - '___sec20'), - ('How do we solve these problems?', 2, None, '___sec21'), - ('A simplex example', 2, None, '___sec22'), - ('Back to the more realistic cases', 2, None, '___sec23'), + '___sec21'), + ('How do we solve these problems?', 2, None, '___sec22'), + ('A simplex example', 2, None, '___sec23'), + ('Back to the more realistic cases', 2, None, '___sec24'), ('Multiclass problems and regression with SVMs', 2, None, - '___sec24')]} + '___sec25')]} end of tocinfo --> @@ -114,7 +115,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Nov 7, 2018

    +

    Nov 8, 2018












    @@ -160,14 +161,83 @@ The theory behind support vector machines (SVM hereafter) is based on the mathematical description of so-called hyperplanes. Let us start with a two-dimensional case. This will also allow us to introduce our first SVM examples. These will be tailored to the case of two specific -classes, as displayed in the figure here. +classes, as displayed in the figure here based on the usage of the petal data.

    We assume here that our data set can be well separated into two domains, where a straight line does the job in the separating the two -classes. Here the two classes are represented by either crosses or +classes. Here the two classes are represented by either squares or circles. +

    + +

    from sklearn import datasets
    +from sklearn.svm import SVC, LinearSVC
    +from sklearn.linear_model import SGDClassifier
    +from sklearn.preprocessing import StandardScaler
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +iris = datasets.load_iris()
    +X = iris["data"][:, (2, 3)]  # petal length, petal width
    +y = iris["target"]
    +
    +setosa_or_versicolor = (y == 0) | (y == 1)
    +X = X[setosa_or_versicolor]
    +y = y[setosa_or_versicolor]
    +
    +
    +
    +C = 5
    +alpha = 1 / (C * len(X))
    +
    +lin_clf = LinearSVC(loss="hinge", C=C, random_state=42)
    +svm_clf = SVC(kernel="linear", C=C)
    +sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha,
    +                        max_iter=100000, random_state=42)
    +
    +scaler = StandardScaler()
    +X_scaled = scaler.fit_transform(X)
    +
    +lin_clf.fit(X_scaled, y)
    +svm_clf.fit(X_scaled, y)
    +sgd_clf.fit(X_scaled, y)
    +
    +print("LinearSVC:                   ", lin_clf.intercept_, lin_clf.coef_)
    +print("SVC:                         ", svm_clf.intercept_, svm_clf.coef_)
    +print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)
    +
    +# Compute the slope and bias of each decision boundary
    +w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]
    +b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]
    +w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]
    +b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]
    +w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]
    +b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]
    +
    +# Transform the decision boundary lines back to the original scale
    +line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])
    +line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])
    +line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])
    +
    +# Plot all three decision boundaries
    +plt.figure(figsize=(11, 4))
    +plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC")
    +plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC")
    +plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier")
    +plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor"
    +plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa"
    +plt.xlabel("Petal length", fontsize=14)
    +plt.ylabel("Petal width", fontsize=14)
    +plt.legend(loc="upper center", fontsize=14)
    +plt.axis([0, 5.5, 0, 2])
    +
    +plt.show()
    +











    @@ -682,6 +752,56 @@ obtain a separation between the classes which is almost linear. The change of basis, from \( x\rightarrow z=\phi(x) \) leads to the same type of equations to be solved, except that we need to introduce for example a polynomial transformation to a two-dimensional training set. +

    + + +

    import numpy as np
    +import os
    +
    +np.random.seed(42)
    +
    +# To plot pretty figures
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +X1D = np.linspace(-4, 4, 9).reshape(-1, 1)
    +X2D = np.c_[X1D, X1D**2]
    +y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.plot(X1D[:, 0][y==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][y==1], np.zeros(5), "g^")
    +plt.gca().get_yaxis().set_ticks([])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.2, 0.2])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], "bs")
    +plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], "g^")
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16])
    +plt.plot([-4.5, 4.5], [6.5, 6.5], "r--", linewidth=3)
    +plt.axis([-4.5, 4.5, -1, 17])
    +plt.subplots_adjust(right=1)
    +plt.show()
    +











    @@ -794,7 +914,203 @@ well in practice.











    -

    Mathematical optimization of convex functions

    +

    The moons example

    +

    + + +

    from __future__ import division, print_function, unicode_literals
    +
    +import numpy as np
    +np.random.seed(42)
    +
    +import matplotlib
    +import matplotlib.pyplot as plt
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +
    +
    +
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import StandardScaler
    +from sklearn.svm import LinearSVC
    +
    +
    +from sklearn.datasets import make_moons
    +X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
    +
    +def plot_dataset(X, y, axes):
    +    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")
    +    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")
    +    plt.axis(axes)
    +    plt.grid(True, which='both')
    +    plt.xlabel(r"$x_1$", fontsize=20)
    +    plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
    +
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.show()
    +
    +from sklearn.datasets import make_moons
    +from sklearn.pipeline import Pipeline
    +from sklearn.preprocessing import PolynomialFeatures
    +
    +polynomial_svm_clf = Pipeline([
    +        ("poly_features", PolynomialFeatures(degree=3)),
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))
    +    ])
    +
    +polynomial_svm_clf.fit(X, y)
    +
    +def plot_predictions(clf, axes):
    +    x0s = np.linspace(axes[0], axes[1], 100)
    +    x1s = np.linspace(axes[2], axes[3], 100)
    +    x0, x1 = np.meshgrid(x0s, x1s)
    +    X = np.c_[x0.ravel(), x1.ravel()]
    +    y_pred = clf.predict(X).reshape(x0.shape)
    +    y_decision = clf.decision_function(X).reshape(x0.shape)
    +    plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)
    +    plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)
    +
    +plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +
    +plt.show()
    +
    +
    +from sklearn.svm import SVC
    +
    +poly_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    +    ])
    +poly_kernel_svm_clf.fit(X, y)
    +
    +poly100_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5))
    +    ])
    +poly100_kernel_svm_clf.fit(X, y)
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=3, r=1, C=5$", fontsize=18)
    +
    +plt.subplot(122)
    +plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
    +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +plt.title(r"$d=10, r=100, C=5$", fontsize=18)
    +
    +plt.show()
    +
    +def gaussian_rbf(x, landmark, gamma):
    +    return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2)
    +
    +gamma = 0.3
    +
    +x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1)
    +x2s = gaussian_rbf(x1s, -2, gamma)
    +x3s = gaussian_rbf(x1s, 1, gamma)
    +
    +XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)]
    +yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red")
    +plt.plot(X1D[:, 0][yk==0], np.zeros(4), "bs")
    +plt.plot(X1D[:, 0][yk==1], np.zeros(5), "g^")
    +plt.plot(x1s, x2s, "g--")
    +plt.plot(x1s, x3s, "b:")
    +plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1])
    +plt.xlabel(r"$x_1$", fontsize=20)
    +plt.ylabel(r"Similarity", fontsize=14)
    +plt.annotate(r'$\mathbf{x}$',
    +             xy=(X1D[3, 0], 0),
    +             xytext=(-0.5, 0.20),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.text(-2, 0.9, "$x_2$", ha="center", fontsize=20)
    +plt.text(1, 0.9, "$x_3$", ha="center", fontsize=20)
    +plt.axis([-4.5, 4.5, -0.1, 1.1])
    +
    +plt.subplot(122)
    +plt.grid(True, which='both')
    +plt.axhline(y=0, color='k')
    +plt.axvline(x=0, color='k')
    +plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], "bs")
    +plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], "g^")
    +plt.xlabel(r"$x_2$", fontsize=20)
    +plt.ylabel(r"$x_3$  ", fontsize=20, rotation=0)
    +plt.annotate(r'$\phi\left(\mathbf{x}\right)$',
    +             xy=(XK[3, 0], XK[3, 1]),
    +             xytext=(0.65, 0.50),
    +             ha="center",
    +             arrowprops=dict(facecolor='black', shrink=0.1),
    +             fontsize=18,
    +            )
    +plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3)
    +plt.axis([-0.1, 1.1, -0.1, 1.1])
    +    
    +plt.subplots_adjust(right=1)
    +
    +plt.show()
    +
    +
    +x1_example = X1D[3, 0]
    +for landmark in (-2, 1):
    +    k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma)
    +    print("Phi({}, {}) = {}".format(x1_example, landmark, k))
    +
    +rbf_kernel_svm_clf = Pipeline([
    +        ("scaler", StandardScaler()),
    +        ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
    +    ])
    +rbf_kernel_svm_clf.fit(X, y)
    +
    +
    +from sklearn.svm import SVC
    +
    +gamma1, gamma2 = 0.1, 5
    +C1, C2 = 0.001, 1000
    +hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)
    +
    +svm_clfs = []
    +for gamma, C in hyperparams:
    +    rbf_kernel_svm_clf = Pipeline([
    +            ("scaler", StandardScaler()),
    +            ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))
    +        ])
    +    rbf_kernel_svm_clf.fit(X, y)
    +    svm_clfs.append(rbf_kernel_svm_clf)
    +
    +plt.figure(figsize=(11, 7))
    +
    +for i, svm_clf in enumerate(svm_clfs):
    +    plt.subplot(221 + i)
    +    plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])
    +    plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    +    gamma, C = hyperparams[i]
    +    plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)
    +
    +plt.show()
    +
    +

    +









    + +

    Mathematical optimization of convex functions

    A mathematical (quadratic) optimization problem, or just optimization problem, has the form @@ -819,7 +1135,7 @@ Convex optimization problems play a central role in applied mathematics and we r











    -

    How do we solve these problems?

    +

    How do we solve these problems?

    If we use Python as programming language and wish to venture beyond @@ -845,7 +1161,7 @@ This will make our life much easier. You don't need t write your own optimizer.











    -

    A simplex example

    +

    A simplex example

    We remind ourselves about the general problem we want to solve @@ -913,7 +1229,7 @@ sol[’primal objective’]











    -

    Back to the more realistic cases

    +

    Back to the more realistic cases

    We are now ready to return to our setup of the optmization problem for a more realistic case. Introducint the slack parameter \( C \) we have @@ -936,7 +1252,7 @@ With the slack constants this leads to the additional constraint \( 0\leq \lamb











    -

    Multiclass problems and regression with SVMs

    +

    Multiclass problems and regression with SVMs

    This material will be added later. diff --git a/doc/pub/svm/ipynb/ipynb-svm-src.tar.gz b/doc/pub/svm/ipynb/ipynb-svm-src.tar.gz index dc344b8f0e308d3b66b96dac6d07b7419fbbd521..3aff4b71ff45dc112f2f48088f2c9e075d7b57db 100644 GIT binary patch literal 207 zcmb2|=3qD`@Fbdn`R)0GSxklk#|qEe9kn@VR9I>&{%T>n)5LuaDaq!!zBxime}7xY z_3g?%mnHx2KTU2+oDr!fCpTX_^rzn9)qz*jtfnTPn|)KWv}m1w&&-aMuXhG6-fFhU zIqCW|Y>gr}+l5SrUmv8zAh`Ci8vP{JXmF;*R|1&o=)3*KT_~{K>TXBgOfP*K7}dwO9E0 \n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", "\n", - "Date: **Nov 7, 2018**\n", + "Date: **Nov 8, 2018**\n", "\n", "Copyright 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -49,13 +49,96 @@ "the mathematical description of so-called hyperplanes. Let us start\n", "with a two-dimensional case. This will also allow us to introduce our\n", "first SVM examples. These will be tailored to the case of two specific\n", - "classes, as displayed in the figure here.\n", + "classes, as displayed in the figure here based on the usage of the petal data.\n", "\n", "We assume here that our data set can be well separated into two\n", "domains, where a straight line does the job in the separating the two\n", - "classes. Here the two classes are represented by either crosses or\n", - "circles.\n", + "classes. Here the two classes are represented by either squares or\n", + "circles." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", "\n", + "from sklearn import datasets\n", + "from sklearn.svm import SVC, LinearSVC\n", + "from sklearn.linear_model import SGDClassifier\n", + "from sklearn.preprocessing import StandardScaler\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['axes.labelsize'] = 14\n", + "plt.rcParams['xtick.labelsize'] = 12\n", + "plt.rcParams['ytick.labelsize'] = 12\n", + "\n", + "\n", + "iris = datasets.load_iris()\n", + "X = iris[\"data\"][:, (2, 3)] # petal length, petal width\n", + "y = iris[\"target\"]\n", + "\n", + "setosa_or_versicolor = (y == 0) | (y == 1)\n", + "X = X[setosa_or_versicolor]\n", + "y = y[setosa_or_versicolor]\n", + "\n", + "\n", + "\n", + "C = 5\n", + "alpha = 1 / (C * len(X))\n", + "\n", + "lin_clf = LinearSVC(loss=\"hinge\", C=C, random_state=42)\n", + "svm_clf = SVC(kernel=\"linear\", C=C)\n", + "sgd_clf = SGDClassifier(loss=\"hinge\", learning_rate=\"constant\", eta0=0.001, alpha=alpha,\n", + " max_iter=100000, random_state=42)\n", + "\n", + "scaler = StandardScaler()\n", + "X_scaled = scaler.fit_transform(X)\n", + "\n", + "lin_clf.fit(X_scaled, y)\n", + "svm_clf.fit(X_scaled, y)\n", + "sgd_clf.fit(X_scaled, y)\n", + "\n", + "print(\"LinearSVC: \", lin_clf.intercept_, lin_clf.coef_)\n", + "print(\"SVC: \", svm_clf.intercept_, svm_clf.coef_)\n", + "print(\"SGDClassifier(alpha={:.5f}):\".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)\n", + "\n", + "# Compute the slope and bias of each decision boundary\n", + "w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]\n", + "b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]\n", + "w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]\n", + "b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]\n", + "w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]\n", + "b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]\n", + "\n", + "# Transform the decision boundary lines back to the original scale\n", + "line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])\n", + "line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])\n", + "line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])\n", + "\n", + "# Plot all three decision boundaries\n", + "plt.figure(figsize=(11, 4))\n", + "plt.plot(line1[:, 0], line1[:, 1], \"k:\", label=\"LinearSVC\")\n", + "plt.plot(line2[:, 0], line2[:, 1], \"b--\", linewidth=2, label=\"SVC\")\n", + "plt.plot(line3[:, 0], line3[:, 1], \"r-\", label=\"SGDClassifier\")\n", + "plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\") # label=\"Iris-Versicolor\"\n", + "plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\") # label=\"Iris-Setosa\"\n", + "plt.xlabel(\"Petal length\", fontsize=14)\n", + "plt.ylabel(\"Petal width\", fontsize=14)\n", + "plt.legend(loc=\"upper center\", fontsize=14)\n", + "plt.axis([0, 5.5, 0, 2])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## What is a hyperplane?\n", "\n", "The aim of the SVM algorithm is to find a hyperplane in an $p$-dimensional space, where $p$ is the number of features that distinctly classifies the data points. \n", @@ -1079,8 +1162,69 @@ "obtain a separation between the classes which is almost linear. \n", "\n", "The change of basis, from $x\\rightarrow z=\\phi(x)$ leads to the same type of equations to be solved, except that\n", - "we need to introduce for example a polynomial transformation to a two-dimensional training set.\n", + "we need to introduce for example a polynomial transformation to a two-dimensional training set." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", "\n", + "np.random.seed(42)\n", + "\n", + "# To plot pretty figures\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['axes.labelsize'] = 14\n", + "plt.rcParams['xtick.labelsize'] = 12\n", + "plt.rcParams['ytick.labelsize'] = 12\n", + "\n", + "\n", + "from sklearn.svm import SVC\n", + "from sklearn import datasets\n", + "\n", + "\n", + "\n", + "X1D = np.linspace(-4, 4, 9).reshape(-1, 1)\n", + "X2D = np.c_[X1D, X1D**2]\n", + "y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "\n", + "plt.subplot(121)\n", + "plt.grid(True, which='both')\n", + "plt.axhline(y=0, color='k')\n", + "plt.plot(X1D[:, 0][y==0], np.zeros(4), \"bs\")\n", + "plt.plot(X1D[:, 0][y==1], np.zeros(5), \"g^\")\n", + "plt.gca().get_yaxis().set_ticks([])\n", + "plt.xlabel(r\"$x_1$\", fontsize=20)\n", + "plt.axis([-4.5, 4.5, -0.2, 0.2])\n", + "\n", + "plt.subplot(122)\n", + "plt.grid(True, which='both')\n", + "plt.axhline(y=0, color='k')\n", + "plt.axvline(x=0, color='k')\n", + "plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], \"bs\")\n", + "plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], \"g^\")\n", + "plt.xlabel(r\"$x_1$\", fontsize=20)\n", + "plt.ylabel(r\"$x_2$\", fontsize=20, rotation=0)\n", + "plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16])\n", + "plt.plot([-4.5, 4.5], [6.5, 6.5], \"r--\", linewidth=3)\n", + "plt.axis([-4.5, 4.5, -1, 17])\n", + "plt.subplots_adjust(right=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## The equations\n", "\n", "Suppose we define a polynomial transformation of degree two only (we continue to live in a plane with $x_i$ and $y_i$ as variables)" @@ -1277,6 +1421,211 @@ "well in practice.\n", "\n", "\n", + "## The moons example" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import division, print_function, unicode_literals\n", + "\n", + "import numpy as np\n", + "np.random.seed(42)\n", + "\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['axes.labelsize'] = 14\n", + "plt.rcParams['xtick.labelsize'] = 12\n", + "plt.rcParams['ytick.labelsize'] = 12\n", + "\n", + "\n", + "from sklearn.svm import SVC\n", + "from sklearn import datasets\n", + "\n", + "\n", + "\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.svm import LinearSVC\n", + "\n", + "\n", + "from sklearn.datasets import make_moons\n", + "X, y = make_moons(n_samples=100, noise=0.15, random_state=42)\n", + "\n", + "def plot_dataset(X, y, axes):\n", + " plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"bs\")\n", + " plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"g^\")\n", + " plt.axis(axes)\n", + " plt.grid(True, which='both')\n", + " plt.xlabel(r\"$x_1$\", fontsize=20)\n", + " plt.ylabel(r\"$x_2$\", fontsize=20, rotation=0)\n", + "\n", + "plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])\n", + "plt.show()\n", + "\n", + "from sklearn.datasets import make_moons\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import PolynomialFeatures\n", + "\n", + "polynomial_svm_clf = Pipeline([\n", + " (\"poly_features\", PolynomialFeatures(degree=3)),\n", + " (\"scaler\", StandardScaler()),\n", + " (\"svm_clf\", LinearSVC(C=10, loss=\"hinge\", random_state=42))\n", + " ])\n", + "\n", + "polynomial_svm_clf.fit(X, y)\n", + "\n", + "def plot_predictions(clf, axes):\n", + " x0s = np.linspace(axes[0], axes[1], 100)\n", + " x1s = np.linspace(axes[2], axes[3], 100)\n", + " x0, x1 = np.meshgrid(x0s, x1s)\n", + " X = np.c_[x0.ravel(), x1.ravel()]\n", + " y_pred = clf.predict(X).reshape(x0.shape)\n", + " y_decision = clf.decision_function(X).reshape(x0.shape)\n", + " plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)\n", + " plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)\n", + "\n", + "plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5])\n", + "plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])\n", + "\n", + "plt.show()\n", + "\n", + "\n", + "from sklearn.svm import SVC\n", + "\n", + "poly_kernel_svm_clf = Pipeline([\n", + " (\"scaler\", StandardScaler()),\n", + " (\"svm_clf\", SVC(kernel=\"poly\", degree=3, coef0=1, C=5))\n", + " ])\n", + "poly_kernel_svm_clf.fit(X, y)\n", + "\n", + "poly100_kernel_svm_clf = Pipeline([\n", + " (\"scaler\", StandardScaler()),\n", + " (\"svm_clf\", SVC(kernel=\"poly\", degree=10, coef0=100, C=5))\n", + " ])\n", + "poly100_kernel_svm_clf.fit(X, y)\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "\n", + "plt.subplot(121)\n", + "plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])\n", + "plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])\n", + "plt.title(r\"$d=3, r=1, C=5$\", fontsize=18)\n", + "\n", + "plt.subplot(122)\n", + "plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])\n", + "plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])\n", + "plt.title(r\"$d=10, r=100, C=5$\", fontsize=18)\n", + "\n", + "plt.show()\n", + "\n", + "def gaussian_rbf(x, landmark, gamma):\n", + " return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2)\n", + "\n", + "gamma = 0.3\n", + "\n", + "x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1)\n", + "x2s = gaussian_rbf(x1s, -2, gamma)\n", + "x3s = gaussian_rbf(x1s, 1, gamma)\n", + "\n", + "XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)]\n", + "yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "\n", + "plt.subplot(121)\n", + "plt.grid(True, which='both')\n", + "plt.axhline(y=0, color='k')\n", + "plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c=\"red\")\n", + "plt.plot(X1D[:, 0][yk==0], np.zeros(4), \"bs\")\n", + "plt.plot(X1D[:, 0][yk==1], np.zeros(5), \"g^\")\n", + "plt.plot(x1s, x2s, \"g--\")\n", + "plt.plot(x1s, x3s, \"b:\")\n", + "plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1])\n", + "plt.xlabel(r\"$x_1$\", fontsize=20)\n", + "plt.ylabel(r\"Similarity\", fontsize=14)\n", + "plt.annotate(r'$\\mathbf{x}$',\n", + " xy=(X1D[3, 0], 0),\n", + " xytext=(-0.5, 0.20),\n", + " ha=\"center\",\n", + " arrowprops=dict(facecolor='black', shrink=0.1),\n", + " fontsize=18,\n", + " )\n", + "plt.text(-2, 0.9, \"$x_2$\", ha=\"center\", fontsize=20)\n", + "plt.text(1, 0.9, \"$x_3$\", ha=\"center\", fontsize=20)\n", + "plt.axis([-4.5, 4.5, -0.1, 1.1])\n", + "\n", + "plt.subplot(122)\n", + "plt.grid(True, which='both')\n", + "plt.axhline(y=0, color='k')\n", + "plt.axvline(x=0, color='k')\n", + "plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], \"bs\")\n", + "plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], \"g^\")\n", + "plt.xlabel(r\"$x_2$\", fontsize=20)\n", + "plt.ylabel(r\"$x_3$ \", fontsize=20, rotation=0)\n", + "plt.annotate(r'$\\phi\\left(\\mathbf{x}\\right)$',\n", + " xy=(XK[3, 0], XK[3, 1]),\n", + " xytext=(0.65, 0.50),\n", + " ha=\"center\",\n", + " arrowprops=dict(facecolor='black', shrink=0.1),\n", + " fontsize=18,\n", + " )\n", + "plt.plot([-0.1, 1.1], [0.57, -0.1], \"r--\", linewidth=3)\n", + "plt.axis([-0.1, 1.1, -0.1, 1.1])\n", + " \n", + "plt.subplots_adjust(right=1)\n", + "\n", + "plt.show()\n", + "\n", + "\n", + "x1_example = X1D[3, 0]\n", + "for landmark in (-2, 1):\n", + " k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma)\n", + " print(\"Phi({}, {}) = {}\".format(x1_example, landmark, k))\n", + "\n", + "rbf_kernel_svm_clf = Pipeline([\n", + " (\"scaler\", StandardScaler()),\n", + " (\"svm_clf\", SVC(kernel=\"rbf\", gamma=5, C=0.001))\n", + " ])\n", + "rbf_kernel_svm_clf.fit(X, y)\n", + "\n", + "\n", + "from sklearn.svm import SVC\n", + "\n", + "gamma1, gamma2 = 0.1, 5\n", + "C1, C2 = 0.001, 1000\n", + "hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)\n", + "\n", + "svm_clfs = []\n", + "for gamma, C in hyperparams:\n", + " rbf_kernel_svm_clf = Pipeline([\n", + " (\"scaler\", StandardScaler()),\n", + " (\"svm_clf\", SVC(kernel=\"rbf\", gamma=gamma, C=C))\n", + " ])\n", + " rbf_kernel_svm_clf.fit(X, y)\n", + " svm_clfs.append(rbf_kernel_svm_clf)\n", + "\n", + "plt.figure(figsize=(11, 7))\n", + "\n", + "for i, svm_clf in enumerate(svm_clfs):\n", + " plt.subplot(221 + i)\n", + " plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])\n", + " plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])\n", + " gamma, C = hyperparams[i]\n", + " plt.title(r\"$\\gamma = {}, C = {}$\".format(gamma, C), fontsize=16)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Mathematical optimization of convex functions\n", "\n", "A mathematical (quadratic) optimization problem, or just optimization problem, has the form" @@ -1324,7 +1673,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -1456,7 +1805,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": { "collapsed": false }, diff --git a/doc/pub/svm/pdf/svm-minted.pdf b/doc/pub/svm/pdf/svm-minted.pdf index 9cea03dbbfc7ca7c257a742f1f04fdf712602d33..b57ad3883f99d5a519e39c544151cabcbf810424 100644 GIT binary patch delta 112837 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 z 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

    3mj!T_{v2Q^XN4fV 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 diff --git a/doc/src/SupportVMachines/svm.do.txt b/doc/src/SupportVMachines/svm.do.txt index da75a7df4..55bf6099f 100644 --- a/doc/src/SupportVMachines/svm.do.txt +++ b/doc/src/SupportVMachines/svm.do.txt @@ -37,12 +37,91 @@ The theory behind support vector machines (SVM hereafter) is based on the mathematical description of so-called hyperplanes. Let us start with a two-dimensional case. This will also allow us to introduce our first SVM examples. These will be tailored to the case of two specific -classes, as displayed in the figure here. +classes, as displayed in the figure here based on the usage of the petal data. We assume here that our data set can be well separated into two domains, where a straight line does the job in the separating the two -classes. Here the two classes are represented by either crosses or +classes. Here the two classes are represented by either squares or circles. +!bc pycod +from sklearn import datasets +from sklearn.svm import SVC, LinearSVC +from sklearn.linear_model import SGDClassifier +from sklearn.preprocessing import StandardScaler +import matplotlib +import matplotlib.pyplot as plt +plt.rcParams['axes.labelsize'] = 14 +plt.rcParams['xtick.labelsize'] = 12 +plt.rcParams['ytick.labelsize'] = 12 + + +iris = datasets.load_iris() +X = iris["data"][:, (2, 3)] # petal length, petal width +y = iris["target"] + +setosa_or_versicolor = (y == 0) | (y == 1) +X = X[setosa_or_versicolor] +y = y[setosa_or_versicolor] + + + +C = 5 +alpha = 1 / (C * len(X)) + +lin_clf = LinearSVC(loss="hinge", C=C, random_state=42) +svm_clf = SVC(kernel="linear", C=C) +sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha, + max_iter=100000, random_state=42) + +scaler = StandardScaler() +X_scaled = scaler.fit_transform(X) + +lin_clf.fit(X_scaled, y) +svm_clf.fit(X_scaled, y) +sgd_clf.fit(X_scaled, y) + +print("LinearSVC: ", lin_clf.intercept_, lin_clf.coef_) +print("SVC: ", svm_clf.intercept_, svm_clf.coef_) +print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_) + +# Compute the slope and bias of each decision boundary +w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1] +b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1] +w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1] +b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1] +w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1] +b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1] + +# Transform the decision boundary lines back to the original scale +line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]]) +line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]]) +line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]]) + +# Plot all three decision boundaries +plt.figure(figsize=(11, 4)) +plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC") +plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC") +plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier") +plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor" +plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa" +plt.xlabel("Petal length", fontsize=14) +plt.ylabel("Petal width", fontsize=14) +plt.legend(loc="upper center", fontsize=14) +plt.axis([0, 5.5, 0, 2]) + +plt.show() + + + + + + + + +!ec + + + !split ===== What is a hyperplane? ===== @@ -553,6 +632,58 @@ obtain a separation between the classes which is almost linear. The change of basis, from $x\rightarrow z=\phi(x)$ leads to the same type of equations to be solved, except that we need to introduce for example a polynomial transformation to a two-dimensional training set. +!bc pycod +import numpy as np +import os + +np.random.seed(42) + +# To plot pretty figures +import matplotlib +import matplotlib.pyplot as plt +plt.rcParams['axes.labelsize'] = 14 +plt.rcParams['xtick.labelsize'] = 12 +plt.rcParams['ytick.labelsize'] = 12 + + +from sklearn.svm import SVC +from sklearn import datasets + + + +X1D = np.linspace(-4, 4, 9).reshape(-1, 1) +X2D = np.c_[X1D, X1D**2] +y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0]) + +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.plot(X1D[:, 0][y==0], np.zeros(4), "bs") +plt.plot(X1D[:, 0][y==1], np.zeros(5), "g^") +plt.gca().get_yaxis().set_ticks([]) +plt.xlabel(r"$x_1$", fontsize=20) +plt.axis([-4.5, 4.5, -0.2, 0.2]) + +plt.subplot(122) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.axvline(x=0, color='k') +plt.plot(X2D[:, 0][y==0], X2D[:, 1][y==0], "bs") +plt.plot(X2D[:, 0][y==1], X2D[:, 1][y==1], "g^") +plt.xlabel(r"$x_1$", fontsize=20) +plt.ylabel(r"$x_2$", fontsize=20, rotation=0) +plt.gca().get_yaxis().set_ticks([0, 4, 8, 12, 16]) +plt.plot([-4.5, 4.5], [6.5, 6.5], "r--", linewidth=3) +plt.axis([-4.5, 4.5, -1, 17]) +plt.subplots_adjust(right=1) +plt.show() + +!ec + + + !split ===== The equations ===== @@ -658,6 +789,202 @@ Note that some frequently used kernels (such as the Sigmoid kernel) don’t resp well in practice. +!split +===== The moons example ===== +!bc pycod +from __future__ import division, print_function, unicode_literals + +import numpy as np +np.random.seed(42) + +import matplotlib +import matplotlib.pyplot as plt +plt.rcParams['axes.labelsize'] = 14 +plt.rcParams['xtick.labelsize'] = 12 +plt.rcParams['ytick.labelsize'] = 12 + + +from sklearn.svm import SVC +from sklearn import datasets + + + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import StandardScaler +from sklearn.svm import LinearSVC + + +from sklearn.datasets import make_moons +X, y = make_moons(n_samples=100, noise=0.15, random_state=42) + +def plot_dataset(X, y, axes): + plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs") + plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^") + plt.axis(axes) + plt.grid(True, which='both') + plt.xlabel(r"$x_1$", fontsize=20) + plt.ylabel(r"$x_2$", fontsize=20, rotation=0) + +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.show() + +from sklearn.datasets import make_moons +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import PolynomialFeatures + +polynomial_svm_clf = Pipeline([ + ("poly_features", PolynomialFeatures(degree=3)), + ("scaler", StandardScaler()), + ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42)) + ]) + +polynomial_svm_clf.fit(X, y) + +def plot_predictions(clf, axes): + x0s = np.linspace(axes[0], axes[1], 100) + x1s = np.linspace(axes[2], axes[3], 100) + x0, x1 = np.meshgrid(x0s, x1s) + X = np.c_[x0.ravel(), x1.ravel()] + y_pred = clf.predict(X).reshape(x0.shape) + y_decision = clf.decision_function(X).reshape(x0.shape) + plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2) + plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1) + +plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) + +plt.show() + + +from sklearn.svm import SVC + +poly_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)) + ]) +poly_kernel_svm_clf.fit(X, y) + +poly100_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5)) + ]) +poly100_kernel_svm_clf.fit(X, y) + +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.title(r"$d=3, r=1, C=5$", fontsize=18) + +plt.subplot(122) +plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5]) +plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) +plt.title(r"$d=10, r=100, C=5$", fontsize=18) + +plt.show() + +def gaussian_rbf(x, landmark, gamma): + return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1)**2) + +gamma = 0.3 + +x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1) +x2s = gaussian_rbf(x1s, -2, gamma) +x3s = gaussian_rbf(x1s, 1, gamma) + +XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)] +yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0]) + +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red") +plt.plot(X1D[:, 0][yk==0], np.zeros(4), "bs") +plt.plot(X1D[:, 0][yk==1], np.zeros(5), "g^") +plt.plot(x1s, x2s, "g--") +plt.plot(x1s, x3s, "b:") +plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1]) +plt.xlabel(r"$x_1$", fontsize=20) +plt.ylabel(r"Similarity", fontsize=14) +plt.annotate(r'$\mathbf{x}$', + xy=(X1D[3, 0], 0), + xytext=(-0.5, 0.20), + ha="center", + arrowprops=dict(facecolor='black', shrink=0.1), + fontsize=18, + ) +plt.text(-2, 0.9, "$x_2$", ha="center", fontsize=20) +plt.text(1, 0.9, "$x_3$", ha="center", fontsize=20) +plt.axis([-4.5, 4.5, -0.1, 1.1]) + +plt.subplot(122) +plt.grid(True, which='both') +plt.axhline(y=0, color='k') +plt.axvline(x=0, color='k') +plt.plot(XK[:, 0][yk==0], XK[:, 1][yk==0], "bs") +plt.plot(XK[:, 0][yk==1], XK[:, 1][yk==1], "g^") +plt.xlabel(r"$x_2$", fontsize=20) +plt.ylabel(r"$x_3$ ", fontsize=20, rotation=0) +plt.annotate(r'$\phi\left(\mathbf{x}\right)$', + xy=(XK[3, 0], XK[3, 1]), + xytext=(0.65, 0.50), + ha="center", + arrowprops=dict(facecolor='black', shrink=0.1), + fontsize=18, + ) +plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3) +plt.axis([-0.1, 1.1, -0.1, 1.1]) + +plt.subplots_adjust(right=1) + +plt.show() + + +x1_example = X1D[3, 0] +for landmark in (-2, 1): + k = gaussian_rbf(np.array([[x1_example]]), np.array([[landmark]]), gamma) + print("Phi({}, {}) = {}".format(x1_example, landmark, k)) + +rbf_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001)) + ]) +rbf_kernel_svm_clf.fit(X, y) + + +from sklearn.svm import SVC + +gamma1, gamma2 = 0.1, 5 +C1, C2 = 0.001, 1000 +hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2) + +svm_clfs = [] +for gamma, C in hyperparams: + rbf_kernel_svm_clf = Pipeline([ + ("scaler", StandardScaler()), + ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C)) + ]) + rbf_kernel_svm_clf.fit(X, y) + svm_clfs.append(rbf_kernel_svm_clf) + +plt.figure(figsize=(11, 7)) + +for i, svm_clf in enumerate(svm_clfs): + plt.subplot(221 + i) + plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5]) + plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) + gamma, C = hyperparams[i] + plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16) + +plt.show() + +!ec + + + !split ===== Mathematical optimization of convex functions =====