Fitxer:Kernel trick idea.svg
De testwiki
Salta a la navegació
Salta a la cerca
Mida d'aquesta previsualització PNG del fitxer SVG: 800 × 343 píxels. Altres resolucions: 320 × 137 píxels | 640 × 274 píxels | 1.024 × 439 píxels | 1.280 × 549 píxels | 2.560 × 1.097 píxels | 1.344 × 576 píxels.
Fitxer original (fitxer SVG, nominalment 1.344 × 576 píxels, mida del fitxer: 13 Ko)
Aquest fitxer prové de Wikimedia Commons i pot ser usat per altres projectes. La descripció de la seva pàgina de descripció es mostra a continuació.
Resum
| DescripcióKernel trick idea.svg |
English: An illustration of kernel trick in SVM. Here the kernel is given by:
|
| Data | |
| Font | Treball propi |
| Autor | Shiyu Ji |
Python Source Code
import numpy as np
import matplotlib
matplotlib.use('svg')
import matplotlib.pyplot as plt
from sklearn import svm
from matplotlib import cm
# Prepare the training set.
# Suppose there is a circle with center at (0, 0) and radius 1.2.
# All the points within the circle are labeled 1.
# All the points outside the circle are labeled 0.
nSamples = 100
spanLen = 2
X = np.zeros((nSamples, 2))
y = np.zeros((nSamples, ))
for i in range(nSamples):
a, b = [np.random.uniform(-spanLen, spanLen) for _ in ['x', 'y']]
X[i][0], X[i][1] = a, b
y[i] = 1 if a*a + b*b < 1.2*1.2 else 0
# Custom kernel,
def my_kernel(A, B):
gram = np.zeros((A.shape[0], B.shape[0]))
for i in range(A.shape[0]):
for j in range(B.shape[0]):
assert A.shape[1] == B.shape[1]
L2A, L2B = 0.0, 0.0
for k in range(A.shape[1]):
gram[i, j] += A[i, k] * B[j, k]
L2A += A[i, k] * A[i, k]
L2B += B[j, k] * B[j, k]
gram[i, j] += L2A * L2B
return gram
# SVM train.
clf = svm.SVC(kernel = my_kernel)
clf.fit(X, y)
coef = clf.dual_coef_[0]
sup = clf.support_
b = clf.intercept_
x_min, x_max = -spanLen, spanLen
y_min, y_max = -spanLen, spanLen
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the 2D layout.
fig = plt.figure(figsize = (6, 14))
plt1 = plt.subplot(121)
plt1.set_xlim([-spanLen, spanLen])
plt1.set_ylim([-spanLen, spanLen])
plt1.set_xticks([-1, 0, 1])
plt1.set_yticks([-1, 0, 1])
plt1.pcolormesh(xx, yy, Z, cmap=cm.Paired)
y_unique = np.unique(y)
colors = cm.rainbow(np.linspace(0.0, 1.0, y_unique.size))
for this_y, color in zip(y_unique, colors):
this_Xx = [X[i][0] for i in range(len(X)) if y[i] == this_y]
this_Xy = [X[i][1] for i in range(len(X)) if y[i] == this_y]
plt1.scatter(this_Xx, this_Xy, c=color, alpha=0.5)
# Process the training data into 3D by applying the kernel mapping:
# phi(x, y) = (x, y, x*x + y*y).
X3d = np.ndarray((X.shape[0], 3))
for i in range(X.shape[0]):
a, b = X[i][0], X[i][1]
X3d[i, 0], X3d[i, 1], X3d[i, 2] = [a, b, a*a + b*b]
# Plot the 3D layout after applying the kernel mapping.
from mpl_toolkits.mplot3d import Axes3D
plt2 = plt.subplot(122, projection="3d")
plt2.set_xlim([-spanLen, spanLen])
plt2.set_ylim([-spanLen, spanLen])
plt2.set_xticks([-1, 0, 1])
plt2.set_yticks([-1, 0, 1])
plt2.set_zticks([0, 2, 4])
for this_y, color in zip(y_unique, colors):
this_Xx = [X3d[i, 0] for i in range(len(X3d)) if y[i] == this_y]
this_Xy = [X3d[i, 1] for i in range(len(X3d)) if y[i] == this_y]
this_Xz = [X3d[i, 2] for i in range(len(X3d)) if y[i] == this_y]
plt2.scatter(this_Xx, this_Xy, this_Xz, c=color, alpha=0.5)
# Plot the 3D boundary.
def onBoundary(x, y, z, X3d, coef, sup, b):
err = 0.0
n = len(coef)
for i in range(n):
err += coef[i] * (x*X3d[sup[i], 0] + y*X3d[sup[i], 1] + z*X3d[sup[i], 2])
err += b
if abs(err) < .1:
return True
return False
Xr = np.arange(x_min, x_max, .02)
Yr = np.arange(y_min, y_max, .02)
Z = np.zeros(Z.shape)
for i in range(Xr.shape[0]):
x = Xr[i]
for j in range(Yr.shape[0]):
y = Yr[j]
for z in np.arange(0, 2, .02):
if onBoundary(x, y, z, X3d, coef, sup, b):
Z[i, j] = z
break
plt2.plot_surface(xx, yy, Z, cmap='summer', alpha=0.2)
plt.savefig("kernel_trick_idea.svg", format = "svg")
Llicència
Jo, el titular dels drets d'autor d'aquest treball, el public sota la següent llicència:
This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
- Sou lliure de:
- compartir – copiar, distribuir i comunicar públicament l'obra
- adaptar – fer-ne obres derivades
- Amb les condicions següents:
- reconeixement – Heu de donar la informació adequada sobre l'autor, proporcionar un enllaç a la llicència i indicar si s'han realitzat canvis. Podeu fer-ho amb qualsevol mitjà raonable, però de cap manera no suggereixi que l'autor us dóna suport o aprova l'ús que en feu.
- compartir igual – Si modifiqueu, transformeu, o creeu a partir del material, heu de distribuir les vostres contribucions sota una llicència similar o una de compatible amb l'original.
Llegendes
Afegeix una explicació d'una línia del que representa aquest fitxer
Elements representats en aquest fitxer
representa l'entitat
Algun valor sense element de Wikidata
27 juny 2017
Historial del fitxer
Cliqueu una data/hora per veure el fitxer tal com era aleshores.
| Data/hora | Miniatura | Dimensions | Usuari/a | Comentari | |
|---|---|---|---|---|---|
| actual | 15:41, 17 jul 2020 | 1.344 × 576 (13 Ko) | wikimediacommons>SemperVinco | Optimized svg code |
Ús del fitxer
La pàgina següent utilitza aquest fitxer: