mirror of
https://github.com/donnemartin/data-science-ipython-notebooks.git
synced 2024-03-22 13:30:56 +08:00
Remove *.py~
This commit is contained in:
parent
f5e2d75713
commit
05e2cd4cf9
|
@ -1,4 +0,0 @@
|
||||||
from .sgd_separator import plot_sgd_separator
|
|
||||||
from .linear_regression import plot_linear_regression
|
|
||||||
from .ML_flow_chart import plot_supervised_chart, plot_unsupervised_chart
|
|
||||||
from .helpers import plot_iris_knn
|
|
|
@ -1,75 +0,0 @@
|
||||||
"""
|
|
||||||
Small helpers for code that is not shown in the notebooks
|
|
||||||
"""
|
|
||||||
|
|
||||||
from sklearn import neighbors, datasets, linear_model
|
|
||||||
import pylab as pl
|
|
||||||
import numpy as np
|
|
||||||
from matplotlib.colors import ListedColormap
|
|
||||||
|
|
||||||
# Create color maps for 3-class classification problem, as with iris
|
|
||||||
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
|
|
||||||
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
|
|
||||||
|
|
||||||
def plot_iris_knn():
|
|
||||||
iris = datasets.load_iris()
|
|
||||||
X = iris.data[:, :2] # we only take the first two features. We could
|
|
||||||
# avoid this ugly slicing by using a two-dim dataset
|
|
||||||
y = iris.target
|
|
||||||
|
|
||||||
knn = neighbors.KNeighborsClassifier(n_neighbors=3)
|
|
||||||
knn.fit(X, y)
|
|
||||||
|
|
||||||
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
|
|
||||||
y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
|
|
||||||
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
|
|
||||||
np.linspace(y_min, y_max, 100))
|
|
||||||
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
|
|
||||||
|
|
||||||
# Put the result into a color plot
|
|
||||||
Z = Z.reshape(xx.shape)
|
|
||||||
pl.figure()
|
|
||||||
pl.pcolormesh(xx, yy, Z, cmap=cmap_light)
|
|
||||||
|
|
||||||
# Plot also the training points
|
|
||||||
pl.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold)
|
|
||||||
pl.xlabel('sepal length (cm)')
|
|
||||||
pl.ylabel('sepal width (cm)')
|
|
||||||
pl.axis('tight')
|
|
||||||
|
|
||||||
|
|
||||||
def plot_polynomial_regression():
|
|
||||||
rng = np.random.RandomState(0)
|
|
||||||
x = 2*rng.rand(100) - 1
|
|
||||||
|
|
||||||
f = lambda t: 1.2 * t**2 + .1 * t**3 - .4 * t **5 - .5 * t ** 9
|
|
||||||
y = f(x) + .4 * rng.normal(size=100)
|
|
||||||
|
|
||||||
x_test = np.linspace(-1, 1, 100)
|
|
||||||
|
|
||||||
pl.figure()
|
|
||||||
pl.scatter(x, y, s=4)
|
|
||||||
|
|
||||||
X = np.array([x**i for i in range(5)]).T
|
|
||||||
X_test = np.array([x_test**i for i in range(5)]).T
|
|
||||||
regr = linear_model.LinearRegression()
|
|
||||||
regr.fit(X, y)
|
|
||||||
pl.plot(x_test, regr.predict(X_test), label='4th order')
|
|
||||||
|
|
||||||
X = np.array([x**i for i in range(10)]).T
|
|
||||||
X_test = np.array([x_test**i for i in range(10)]).T
|
|
||||||
regr = linear_model.LinearRegression()
|
|
||||||
regr.fit(X, y)
|
|
||||||
pl.plot(x_test, regr.predict(X_test), label='9th order')
|
|
||||||
|
|
||||||
pl.legend(loc='best')
|
|
||||||
pl.axis('tight')
|
|
||||||
pl.title('Fitting a 4th and a 9th order polynomial')
|
|
||||||
|
|
||||||
pl.figure()
|
|
||||||
pl.scatter(x, y, s=4)
|
|
||||||
pl.plot(x_test, f(x_test), label="truth")
|
|
||||||
pl.axis('tight')
|
|
||||||
pl.title('Ground truth (9th order polynomial)')
|
|
||||||
|
|
||||||
|
|
|
@ -1,331 +0,0 @@
|
||||||
"""
|
|
||||||
==========
|
|
||||||
Libsvm GUI
|
|
||||||
==========
|
|
||||||
|
|
||||||
A simple graphical frontend for Libsvm mainly intended for didactic
|
|
||||||
purposes. You can create data points by point and click and visualize
|
|
||||||
the decision region induced by different kernels and parameter settings.
|
|
||||||
|
|
||||||
To create positive examples click the left mouse button; to create
|
|
||||||
negative examples click the right button.
|
|
||||||
|
|
||||||
If all examples are from the same class, it uses a one-class SVM.
|
|
||||||
|
|
||||||
"""
|
|
||||||
from __future__ import division, print_function
|
|
||||||
|
|
||||||
print(__doc__)
|
|
||||||
|
|
||||||
# Author: Peter Prettenhoer <peter.prettenhofer@gmail.com>
|
|
||||||
#
|
|
||||||
# License: BSD 3 clause
|
|
||||||
|
|
||||||
import matplotlib
|
|
||||||
matplotlib.use('TkAgg')
|
|
||||||
|
|
||||||
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
|
|
||||||
from matplotlib.backends.backend_tkagg import NavigationToolbar2TkAgg
|
|
||||||
from matplotlib.figure import Figure
|
|
||||||
from matplotlib.contour import ContourSet
|
|
||||||
|
|
||||||
import Tkinter as Tk
|
|
||||||
import sys
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from sklearn import svm
|
|
||||||
from sklearn.datasets import dump_svmlight_file
|
|
||||||
from sklearn.externals.six.moves import xrange
|
|
||||||
|
|
||||||
y_min, y_max = -50, 50
|
|
||||||
x_min, x_max = -50, 50
|
|
||||||
|
|
||||||
|
|
||||||
class Model(object):
|
|
||||||
"""The Model which hold the data. It implements the
|
|
||||||
observable in the observer pattern and notifies the
|
|
||||||
registered observers on change event.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.observers = []
|
|
||||||
self.surface = None
|
|
||||||
self.data = []
|
|
||||||
self.cls = None
|
|
||||||
self.surface_type = 0
|
|
||||||
|
|
||||||
def changed(self, event):
|
|
||||||
"""Notify the observers. """
|
|
||||||
for observer in self.observers:
|
|
||||||
observer.update(event, self)
|
|
||||||
|
|
||||||
def add_observer(self, observer):
|
|
||||||
"""Register an observer. """
|
|
||||||
self.observers.append(observer)
|
|
||||||
|
|
||||||
def set_surface(self, surface):
|
|
||||||
self.surface = surface
|
|
||||||
|
|
||||||
def dump_svmlight_file(self, file):
|
|
||||||
data = np.array(self.data)
|
|
||||||
X = data[:, 0:2]
|
|
||||||
y = data[:, 2]
|
|
||||||
dump_svmlight_file(X, y, file)
|
|
||||||
|
|
||||||
|
|
||||||
class Controller(object):
|
|
||||||
def __init__(self, model):
|
|
||||||
self.model = model
|
|
||||||
self.kernel = Tk.IntVar()
|
|
||||||
self.surface_type = Tk.IntVar()
|
|
||||||
# Whether or not a model has been fitted
|
|
||||||
self.fitted = False
|
|
||||||
|
|
||||||
def fit(self):
|
|
||||||
print("fit the model")
|
|
||||||
train = np.array(self.model.data)
|
|
||||||
X = train[:, 0:2]
|
|
||||||
y = train[:, 2]
|
|
||||||
|
|
||||||
C = float(self.complexity.get())
|
|
||||||
gamma = float(self.gamma.get())
|
|
||||||
coef0 = float(self.coef0.get())
|
|
||||||
degree = int(self.degree.get())
|
|
||||||
kernel_map = {0: "linear", 1: "rbf", 2: "poly"}
|
|
||||||
if len(np.unique(y)) == 1:
|
|
||||||
clf = svm.OneClassSVM(kernel=kernel_map[self.kernel.get()],
|
|
||||||
gamma=gamma, coef0=coef0, degree=degree)
|
|
||||||
clf.fit(X)
|
|
||||||
else:
|
|
||||||
clf = svm.SVC(kernel=kernel_map[self.kernel.get()], C=C,
|
|
||||||
gamma=gamma, coef0=coef0, degree=degree)
|
|
||||||
clf.fit(X, y)
|
|
||||||
if hasattr(clf, 'score'):
|
|
||||||
print("Accuracy:", clf.score(X, y) * 100)
|
|
||||||
X1, X2, Z = self.decision_surface(clf)
|
|
||||||
self.model.clf = clf
|
|
||||||
self.model.set_surface((X1, X2, Z))
|
|
||||||
self.model.surface_type = self.surface_type.get()
|
|
||||||
self.fitted = True
|
|
||||||
self.model.changed("surface")
|
|
||||||
|
|
||||||
def decision_surface(self, cls):
|
|
||||||
delta = 1
|
|
||||||
x = np.arange(x_min, x_max + delta, delta)
|
|
||||||
y = np.arange(y_min, y_max + delta, delta)
|
|
||||||
X1, X2 = np.meshgrid(x, y)
|
|
||||||
Z = cls.decision_function(np.c_[X1.ravel(), X2.ravel()])
|
|
||||||
Z = Z.reshape(X1.shape)
|
|
||||||
return X1, X2, Z
|
|
||||||
|
|
||||||
def clear_data(self):
|
|
||||||
self.model.data = []
|
|
||||||
self.fitted = False
|
|
||||||
self.model.changed("clear")
|
|
||||||
|
|
||||||
def add_example(self, x, y, label):
|
|
||||||
self.model.data.append((x, y, label))
|
|
||||||
self.model.changed("example_added")
|
|
||||||
|
|
||||||
# update decision surface if already fitted.
|
|
||||||
self.refit()
|
|
||||||
|
|
||||||
def refit(self):
|
|
||||||
"""Refit the model if already fitted. """
|
|
||||||
if self.fitted:
|
|
||||||
self.fit()
|
|
||||||
|
|
||||||
|
|
||||||
class View(object):
|
|
||||||
"""Test docstring. """
|
|
||||||
def __init__(self, root, controller):
|
|
||||||
f = Figure()
|
|
||||||
ax = f.add_subplot(111)
|
|
||||||
ax.set_xticks([])
|
|
||||||
ax.set_yticks([])
|
|
||||||
ax.set_xlim((x_min, x_max))
|
|
||||||
ax.set_ylim((y_min, y_max))
|
|
||||||
canvas = FigureCanvasTkAgg(f, master=root)
|
|
||||||
canvas.show()
|
|
||||||
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
|
|
||||||
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
|
|
||||||
canvas.mpl_connect('button_press_event', self.onclick)
|
|
||||||
toolbar = NavigationToolbar2TkAgg(canvas, root)
|
|
||||||
toolbar.update()
|
|
||||||
self.controllbar = ControllBar(root, controller)
|
|
||||||
self.f = f
|
|
||||||
self.ax = ax
|
|
||||||
self.canvas = canvas
|
|
||||||
self.controller = controller
|
|
||||||
self.contours = []
|
|
||||||
self.c_labels = None
|
|
||||||
self.plot_kernels()
|
|
||||||
|
|
||||||
def plot_kernels(self):
|
|
||||||
self.ax.text(-50, -60, "Linear: $u^T v$")
|
|
||||||
self.ax.text(-20, -60, "RBF: $\exp (-\gamma \| u-v \|^2)$")
|
|
||||||
self.ax.text(10, -60, "Poly: $(\gamma \, u^T v + r)^d$")
|
|
||||||
|
|
||||||
def onclick(self, event):
|
|
||||||
print(event.button)
|
|
||||||
if event.xdata and event.ydata:
|
|
||||||
if event.button == 1:
|
|
||||||
self.controller.add_example(event.xdata, event.ydata, 1)
|
|
||||||
elif event.button == 3:
|
|
||||||
self.controller.add_example(event.xdata, event.ydata, -1)
|
|
||||||
|
|
||||||
def update_example(self, model, idx):
|
|
||||||
x, y, l = model.data[idx]
|
|
||||||
if l == 1:
|
|
||||||
color = 'w'
|
|
||||||
elif l == -1:
|
|
||||||
color = 'k'
|
|
||||||
self.ax.plot([x], [y], "%so" % color, scalex=0.0, scaley=0.0)
|
|
||||||
|
|
||||||
def update(self, event, model):
|
|
||||||
if event == "examples_loaded":
|
|
||||||
for i in xrange(len(model.data)):
|
|
||||||
self.update_example(model, i)
|
|
||||||
|
|
||||||
if event == "example_added":
|
|
||||||
self.update_example(model, -1)
|
|
||||||
|
|
||||||
if event == "clear":
|
|
||||||
self.ax.clear()
|
|
||||||
self.ax.set_xticks([])
|
|
||||||
self.ax.set_yticks([])
|
|
||||||
self.contours = []
|
|
||||||
self.c_labels = None
|
|
||||||
self.plot_kernels()
|
|
||||||
|
|
||||||
if event == "surface":
|
|
||||||
self.remove_surface()
|
|
||||||
self.plot_support_vectors(model.clf.support_vectors_)
|
|
||||||
self.plot_decision_surface(model.surface, model.surface_type)
|
|
||||||
|
|
||||||
self.canvas.draw()
|
|
||||||
|
|
||||||
def remove_surface(self):
|
|
||||||
"""Remove old decision surface."""
|
|
||||||
if len(self.contours) > 0:
|
|
||||||
for contour in self.contours:
|
|
||||||
if isinstance(contour, ContourSet):
|
|
||||||
for lineset in contour.collections:
|
|
||||||
lineset.remove()
|
|
||||||
else:
|
|
||||||
contour.remove()
|
|
||||||
self.contours = []
|
|
||||||
|
|
||||||
def plot_support_vectors(self, support_vectors):
|
|
||||||
"""Plot the support vectors by placing circles over the
|
|
||||||
corresponding data points and adds the circle collection
|
|
||||||
to the contours list."""
|
|
||||||
cs = self.ax.scatter(support_vectors[:, 0], support_vectors[:, 1],
|
|
||||||
s=80, edgecolors="k", facecolors="none")
|
|
||||||
self.contours.append(cs)
|
|
||||||
|
|
||||||
def plot_decision_surface(self, surface, type):
|
|
||||||
X1, X2, Z = surface
|
|
||||||
if type == 0:
|
|
||||||
levels = [-1.0, 0.0, 1.0]
|
|
||||||
linestyles = ['dashed', 'solid', 'dashed']
|
|
||||||
colors = 'k'
|
|
||||||
self.contours.append(self.ax.contour(X1, X2, Z, levels,
|
|
||||||
colors=colors,
|
|
||||||
linestyles=linestyles))
|
|
||||||
elif type == 1:
|
|
||||||
self.contours.append(self.ax.contourf(X1, X2, Z, 10,
|
|
||||||
cmap=matplotlib.cm.bone,
|
|
||||||
origin='lower', alpha=0.85))
|
|
||||||
self.contours.append(self.ax.contour(X1, X2, Z, [0.0], colors='k',
|
|
||||||
linestyles=['solid']))
|
|
||||||
else:
|
|
||||||
raise ValueError("surface type unknown")
|
|
||||||
|
|
||||||
|
|
||||||
class ControllBar(object):
|
|
||||||
def __init__(self, root, controller):
|
|
||||||
fm = Tk.Frame(root)
|
|
||||||
kernel_group = Tk.Frame(fm)
|
|
||||||
Tk.Radiobutton(kernel_group, text="Linear", variable=controller.kernel,
|
|
||||||
value=0, command=controller.refit).pack(anchor=Tk.W)
|
|
||||||
Tk.Radiobutton(kernel_group, text="RBF", variable=controller.kernel,
|
|
||||||
value=1, command=controller.refit).pack(anchor=Tk.W)
|
|
||||||
Tk.Radiobutton(kernel_group, text="Poly", variable=controller.kernel,
|
|
||||||
value=2, command=controller.refit).pack(anchor=Tk.W)
|
|
||||||
kernel_group.pack(side=Tk.LEFT)
|
|
||||||
|
|
||||||
valbox = Tk.Frame(fm)
|
|
||||||
controller.complexity = Tk.StringVar()
|
|
||||||
controller.complexity.set("1.0")
|
|
||||||
c = Tk.Frame(valbox)
|
|
||||||
Tk.Label(c, text="C:", anchor="e", width=7).pack(side=Tk.LEFT)
|
|
||||||
Tk.Entry(c, width=6, textvariable=controller.complexity).pack(
|
|
||||||
side=Tk.LEFT)
|
|
||||||
c.pack()
|
|
||||||
|
|
||||||
controller.gamma = Tk.StringVar()
|
|
||||||
controller.gamma.set("0.01")
|
|
||||||
g = Tk.Frame(valbox)
|
|
||||||
Tk.Label(g, text="gamma:", anchor="e", width=7).pack(side=Tk.LEFT)
|
|
||||||
Tk.Entry(g, width=6, textvariable=controller.gamma).pack(side=Tk.LEFT)
|
|
||||||
g.pack()
|
|
||||||
|
|
||||||
controller.degree = Tk.StringVar()
|
|
||||||
controller.degree.set("3")
|
|
||||||
d = Tk.Frame(valbox)
|
|
||||||
Tk.Label(d, text="degree:", anchor="e", width=7).pack(side=Tk.LEFT)
|
|
||||||
Tk.Entry(d, width=6, textvariable=controller.degree).pack(side=Tk.LEFT)
|
|
||||||
d.pack()
|
|
||||||
|
|
||||||
controller.coef0 = Tk.StringVar()
|
|
||||||
controller.coef0.set("0")
|
|
||||||
r = Tk.Frame(valbox)
|
|
||||||
Tk.Label(r, text="coef0:", anchor="e", width=7).pack(side=Tk.LEFT)
|
|
||||||
Tk.Entry(r, width=6, textvariable=controller.coef0).pack(side=Tk.LEFT)
|
|
||||||
r.pack()
|
|
||||||
valbox.pack(side=Tk.LEFT)
|
|
||||||
|
|
||||||
cmap_group = Tk.Frame(fm)
|
|
||||||
Tk.Radiobutton(cmap_group, text="Hyperplanes",
|
|
||||||
variable=controller.surface_type, value=0,
|
|
||||||
command=controller.refit).pack(anchor=Tk.W)
|
|
||||||
Tk.Radiobutton(cmap_group, text="Surface",
|
|
||||||
variable=controller.surface_type, value=1,
|
|
||||||
command=controller.refit).pack(anchor=Tk.W)
|
|
||||||
|
|
||||||
cmap_group.pack(side=Tk.LEFT)
|
|
||||||
|
|
||||||
train_button = Tk.Button(fm, text='Fit', width=5,
|
|
||||||
command=controller.fit)
|
|
||||||
train_button.pack()
|
|
||||||
fm.pack(side=Tk.LEFT)
|
|
||||||
Tk.Button(fm, text='Clear', width=5,
|
|
||||||
command=controller.clear_data).pack(side=Tk.LEFT)
|
|
||||||
|
|
||||||
|
|
||||||
def get_parser():
|
|
||||||
from optparse import OptionParser
|
|
||||||
op = OptionParser()
|
|
||||||
op.add_option("--output",
|
|
||||||
action="store", type="str", dest="output",
|
|
||||||
help="Path where to dump data.")
|
|
||||||
return op
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
|
||||||
op = get_parser()
|
|
||||||
opts, args = op.parse_args(argv[1:])
|
|
||||||
root = Tk.Tk()
|
|
||||||
model = Model()
|
|
||||||
controller = Controller(model)
|
|
||||||
root.wm_title("Scikit-learn Libsvm GUI")
|
|
||||||
view = View(root, controller)
|
|
||||||
model.add_observer(view)
|
|
||||||
Tk.mainloop()
|
|
||||||
|
|
||||||
if opts.output:
|
|
||||||
model.dump_svmlight_file(opts.output)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main(sys.argv)
|
|
Loading…
Reference in New Issue
Block a user