【漫漫科研路\Python】畫支持向量機相關圖

在之前的一篇文章【圖解例說機器學習】支持向量機 (SVM)中,由於篇幅有限,我們只介紹了其理論部分。作爲補充,本文介紹文中所有圖像的繪製。我們全都是採用Python繪製,具體如下:

圖1-2:

圖1
圖2

圖1對應的Python源代碼爲:

# -*- coding: utf-8 -*-
# @Time : 2020/5/8 21:03
# @Author : tengweitw


import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font


x = [3, 4, 1]
y = [3, 3, 1]
c = [r'$\mathrm{x}_1$',r'$\mathrm{x}_2$',r'$\mathrm{x}_3$']

x1=np.linspace(0,2.5,10)
y1=5-2*x1

x2=np.linspace(0,3,10)
y2=3-x2

plt.figure()

plt.plot(x[:2],y[:2],'rs')
plt.plot(x[-1],y[-1],'bo')

plt.plot(x1,y1,'k-')
plt.plot(x2,y2,'k-')

for i in range(0, len(x)):
    plt.annotate(c[i], xy=(x[i], y[i]), xytext=(x[i] + 0.05, y[i] + 0.05),fontsize=16)
plt.annotate('$2x^{(1)}+x^{(2)}-5=0$', xy=(1, 3), xycoords='data',
             xytext=(0, 60), textcoords='offset points', color='g', fontsize=16, arrowprops=dict(arrowstyle="->",
             connectionstyle="arc,rad=0", color='k'))
plt.annotate('$x^{(1)}+x^{(2)}-3=0$', xy=(2.5, 0.5), xycoords='data',
             xytext=(30, 30), textcoords='offset points', color='g', fontsize=16, arrowprops=dict(arrowstyle="->",
             connectionstyle="arc,rad=0", color='k'))

# Set the labels
font = LabelFormat(plt)
plt.xlabel('$x^{(1)}$', font)
plt.ylabel('$y^{(2)}$', font)

plt.xlim(0,6)
plt.ylim(0,6)
plt.show()

圖2對應的Python源代碼爲:

# -*- coding: utf-8 -*-
# @Time : 2020/5/8 21:27
# @Author : tengweitw

import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

x1=2
y1=4
x11=1
y11=3

x2=2.5
y2=0.5
x22=3
y22=1

x3=np.linspace(-0.2,4.2,100)
y3=4-x3


fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)

fig.add_axes(ax)

ax.axis[:].set_visible(False)

font = LabelFormat(plt)

ax.axis["x"] = ax.new_floating_axis(0,0)

#Set properties of X axis
ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
ax.axis["x"].label.set_text('$x^{(1)}$')
ax.axis["x"].label.set_fontsize(16)


#Set properties of Y axis

ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].label.set_text('$x^{(2)}$')
ax.axis["y"].label.set_fontsize(16)

# Set ticks's direction
ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")

# Plot figures
plt.plot(x1,y1,'rs')
plt.text(x1+0.1,y1,r'$\mathrm{x}_1$',fontsize=16)
plt.plot(x2,y2,'bo')
plt.text(x2+0.05,y2-0.1,r'$\mathrm{x}_2$',fontsize=16)
plt.plot(x11,y11,'k+', markersize=16)
plt.text(x11-0.4,y11,r'$\mathrm{x}_1^{\perp}$',fontsize=16)
plt.plot(x22,y22,'k+', markersize=16)
plt.text(x22+0.1,y22-0.1,r'$\mathrm{x}_2^{\perp}$',fontsize=16)

plt.plot(x3,y3,'k-')
plt.quiver(0,0,np.sqrt(2)/2,np.sqrt(2)/2,units='xy',color='deepskyblue',scale=1,scale_units='xy')
plt.text(np.sqrt(2)/2,np.sqrt(2)/2, r'$\frac{\mathrm{w}}{|\mathrm{w}|}=(\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2})$', color='deepskyblue',  fontsize=16)

plt.quiver(0,0,x11,y11,units='xy',color='black',scale=1,scale_units='xy')
plt.quiver(x11,y11,x1-x11,y1-y11,units='xy',color='deepskyblue',scale=1,scale_units='xy')
plt.quiver(0,0,x1,y1,units='xy',color='red',scale=1,scale_units='xy')

plt.quiver(0,0,x22,y22,units='xy',color='black',scale=1,scale_units='xy')
plt.quiver(x22,y22,x2-x22,y2-y22,units='xy',color='deepskyblue',scale=1,scale_units='xy')
plt.quiver(0,0,x2,y2,units='xy',color='blue',scale=1,scale_units='xy')



plt.annotate('$x^{(1)}+x^{(2)}-4=0$', xy=(2, 2), xycoords='data',
             xytext=(0, 100), textcoords='offset points', color='g', fontsize=16, arrowprops=dict(arrowstyle="->",
             connectionstyle="arc,rad=0", color='k'))
plt.xlim(-0.5,4.5)
plt.ylim(-0.5,4.5)


plt.show()

圖3-4主要體現瞭如何添加文字,旋轉,和標記點

圖3
圖4

圖3對應的Python源代碼:

# -*- coding: utf-8 -*-
# @Time : 2020/5/10 16:39
# @Author : tengweitw

import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

x1=3
y1=3

x2=4
y2=3

x3=1
y3=1

x4=np.linspace(-1.2,4.2,100)
y4=4-x4

x11=np.linspace(-0.2,5.2,100)
y11=6-x11
x33=np.linspace(-2.2,3.2,100)
y33=2-x33


fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)

fig.add_axes(ax)

ax.axis[:].set_visible(False)

font = LabelFormat(plt)

ax.axis["x"] = ax.new_floating_axis(0,0)


ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
ax.axis["x"].label.set_text('$x^{(1)}$')
ax.axis["x"].label.set_fontsize(16)


ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].label.set_text('$x^{(2)}$')
ax.axis["y"].label.set_fontsize(16)


ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")

# Plot figures
plt.plot(x1,y1,'rs')
plt.text(x1-0.5,y1,r'$\mathrm{x}_1$',fontsize=16)
plt.plot(x2,y2,'rs')
plt.text(x2+0.05,y2-0.1,r'$\mathrm{x}_2$',fontsize=16)
plt.plot(x3,y3,'bo')
plt.text(x3-0.5,y3-0.1,r'$\mathrm{x}_3$',fontsize=16)

plt.plot(x4,y4,'g-')
plt.text(1,1,r'$\frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2=0$',fontsize=16,rotation=-45,color='g')
plt.plot(x11,y11,'r-')
plt.text(2,2,r'$\frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2=1$',fontsize=16,rotation=-45,color='r')
plt.plot(x33,y33,'b-')
plt.text(0,0,r'$\frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2=-1$',fontsize=16,rotation=-45,color='b')

plt.xlim(-2.5,6.5)
plt.ylim(-2.5,6.5)

plt.show()


圖4對應的Python源代碼:

# -*- coding: utf-8 -*-
# @Time : 2020/5/17 17:14
# @Author : tengweitw

import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

x1=3
y1=3

x2=4
y2=3

x3=1
y3=1

x4,x5,x6,x12=2,1,2,3
y4,y5,y6,y12=5,5.5,1,2.5

x7,x8,x9,x10,x11=2,-1,-2,0.5,1
y7,y8,y9,y10,y11=-1,2,3,4.5,2.2

x222=np.linspace(-1.2,4.2,100)
y222=4-x222

x111=np.linspace(-0.2,5.2,100)
y111=6-x111
x333=np.linspace(-2.2,3.2,100)
y333=2-x333

#Create figure square
fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)

fig.add_axes(ax)

ax.axis[:].set_visible(False)

font = LabelFormat(plt)

ax.axis["x"] = ax.new_floating_axis(0,0)

#Set properties of X axis
ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
ax.axis["x"].label.set_fontsize(16)

#Set properties of Y axis
ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].label.set_fontsize(16)

# Set ticks's direction
ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")

# Plot figures
plt.plot(x2,y2,'rs')
plt.text(x2+0.5,y2-0.1,r'$\mathrm{x}_2$',fontsize=16)
plt.plot(x4,y4,'rs')
plt.text(x4+0.5,y4-0.1,r'$\mathrm{x}_4$',fontsize=16)
plt.plot(x5,y5,'rs')
plt.text(x5+0.5,y5-0.1,r'$\mathrm{x}_5$',fontsize=16)

#-------------------------------#
plt.plot(x1,y1,'rs')
plt.text(x1+0.2,y1-0.2,r'$\mathrm{x}_1$',fontsize=16)
plt.text(x1-0.2,y1+0.2,r'$\xi_1=0$',fontsize=14)

plt.plot(x6,y6,'rs')
plt.text(x6+0.2,y6-0.1,r'$\mathrm{x}_6$',fontsize=16)
plt.plot(x6,y6,'bs', markersize=10, markerfacecolor="none")
plt.text(x6-0,y6-0.7,r'$\xi_6>1$',fontsize=14)

plt.plot(x12,y12,'rs')
plt.text(x12-0.9,y12-0.1,r'$\mathrm{x}_{12}}$',fontsize=16)
plt.plot(x12,y12,'rs', markersize=10, markerfacecolor="none")
plt.text(x12-0.7,y12-0.7,r'$0<\xi_{12}<1$',fontsize=14)

plt.plot(x7,y7,'bo')
plt.text(x7-0.7,y7-0.1,r'$\mathrm{x}_7$',fontsize=16)
plt.plot(x8,y8,'bo')
plt.text(x8-0.7,y8-0.1,r'$\mathrm{x}_8$',fontsize=16)
plt.plot(x9,y9,'bo')
plt.text(x9-0.7,y9-0.1,r'$\mathrm{x}_9$',fontsize=16)

#-----------------------------#
plt.plot(x3,y3,'bo')
plt.text(x3-0.7,y3-0.1,r'$\mathrm{x}_3$',fontsize=16)
plt.text(x3-0.9,y3-0.7,r'$\xi_3=0$',fontsize=14)

plt.plot(x10,y10,'bo')
plt.text(x10+0.2,y10-0.1,r'$\mathrm{x}_{10}$',fontsize=16)
plt.plot(x10,y10,'ro', markersize=10, markerfacecolor="none")
plt.text(x10-0.2,y10-0.5,r'$\xi_{10}>1$',fontsize=14)

plt.plot(x11,y11,'bo')
plt.text(x11-0.7,y11-0.3,r'$\mathrm{x}_{11}$',fontsize=16)
plt.plot(x11,y11,'bo', markersize=10, markerfacecolor="none")
plt.text(x11-1.5,y11+0.2,r'$0<\xi_{11}<1$',fontsize=14)

plt.plot(x222,y222,'g-')
plt.text(4,-1,r'$\hat y=0$',fontsize=16,rotation=45,color='g')
plt.plot(x111,y111,'r-')
plt.text(5,-0,r'$\hat y=+1$',fontsize=16,rotation=45,color='r')
plt.plot(x333,y333,'b-')
plt.text(2.5,-2.5,r'$\hat y=-1$',fontsize=16,rotation=45,color='b')


plt.text(-0.8,6.5,r'$x^{(2)}$',fontsize=16,rotation=90,color='k')
plt.text(6.3,-0.8,r'$x^{(1)}$',fontsize=16,rotation=0,color='k')

plt.xlim(-2.5,6.5)
plt.ylim(-2.5,6.5)
plt.show()

圖5-6主要體現畫三維圖

圖5
圖6

圖5對應的Python源代碼:

# -*- coding: utf-8 -*-
# @Time : 2020/5/14 16:35
# @Author : tengweitw


import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

x1=0
y1=1

x2=1
y2=0

x3=0
y3=0

x4=1
y4=1




fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)

fig.add_axes(ax)

ax.axis[:].set_visible(False)

font = LabelFormat(plt)

ax.axis["x"] = ax.new_floating_axis(0,0)


ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
ax.axis["x"].label.set_text('$x^{(1)}$')
ax.axis["x"].label.set_fontsize(16)



ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].label.set_text('$x^{(2)}$')
ax.axis["y"].label.set_fontsize(16)


ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")

# Plot figures
plt.plot(x1,y1,'rs')
plt.text(x1+0.05,y1+0.1,r'$\mathrm{x}_1$',fontsize=20)
plt.plot(x2,y2,'rs')
plt.text(x2+0.05,y2+0.1,r'$\mathrm{x}_2$',fontsize=20)
plt.plot(x3,y3,'bo')
plt.text(x3+0.05,y3+0.1,r'$\mathrm{x}_3$',fontsize=20)
plt.plot(x4,y4,'bo')
plt.text(x4+0.05,y4+0.1,r'$\mathrm{x}_4$',fontsize=20)

plt.xlim(-0.2,1.5)
plt.ylim(-0.2,1.5)


plt.show()

圖6對應的Python源代碼:

# -*- coding: utf-8 -*-
# @Time : 2020/5/14 16:47
# @Author : tengweitw


from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

fig = plt.figure(figsize=(6, 6))
ax = plt.axes(projection='3d')

x1,y1,z1=0,0,1
x2,y2,z2=0,1,0
x3,y3,z3=0,0,0
x4,y4,z4=1,1,1

x=np.linspace(-0.1,1.1,100)
y=np.linspace(-0.1,1.1,100)
X, Y = np.meshgrid(x, y)
Z = 0.75+2*X-Y


ax.scatter([x1,x2],[y1,y2],[z1,z2],marker='s',alpha=1,c='r',s=30)
ax.scatter([x3,x4],[y3,y4],[z3,z4],marker='o',alpha=1,c='b',s=30)

ax.plot_surface(X,Y,Z,cmap='rainbow')

ax.set_xlim(-0.1, 1.1)
ax.set_ylim(-0.1, 1.1)
ax.set_zlim(-0.1, 1.1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

圖7-8是特徵空間轉化圖:

圖7
圖8

圖7對應的Python源代碼爲:

# -*- coding: utf-8 -*-
# @Time : 2020/5/14 16:57
# @Author : tengweitw

import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

theta=np.linspace(0,2*np.pi,10)
r1=1
r2=2
x1=r1*np.sin(theta)
y1=r1*np.cos(theta)
x2=r2*np.sin(theta)
y2=r2*np.cos(theta)


fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)
ax.axis[:].set_visible(False)

font = LabelFormat(plt)
ax.axis["x"] = ax.new_floating_axis(0,0)

ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
# ax.axis["x"].label.set_text('$x^{(1)}$')
ax.axis["x"].label.set_fontsize(16)

ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
# ax.axis["y"].label.set_text('$x^{(2)}$')
ax.axis["y"].label.set_fontsize(16)

ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")
ax.axis["y"].label.set_verticalalignment("top")
ax.axis["x"].label.set_verticalalignment("top")
ax.axis["y"].label.set_horizontalalignment("left")
ax.axis["x"].label.set_horizontalalignment("left")
# Plot figures
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'rs')

plt.text(-0.4,3.5,r'$x^{(2)}$',fontsize=16,rotation=90,color='k')
plt.text(3.3,-0.4,r'$x^{(1)}$',fontsize=16,rotation=0,color='k')

plt.xlim(-4,4)
plt.ylim(-4,4)


plt.show()

圖8對應的Python源代碼爲:

# -*- coding: utf-8 -*-
# @Time : 2020/5/16 14:50
# @Author : tengweitw

import mpl_toolkits.axisartist as axisartist
import numpy as np
import matplotlib.pyplot as plt
# Set the format of labels
def LabelFormat(plt):
    ax = plt.gca()
    plt.tick_params(labelsize=14)
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    font = {'family': 'Times New Roman',
            'weight': 'normal',
            'size': 16,
            }
    return font

theta=np.linspace(0,2*np.pi,10)
r1=1
r2=2
x1=r1*np.sin(theta)
y1=r1*np.cos(theta)
x2=r2*np.sin(theta)
y2=r2*np.cos(theta)

x11=x1**2
y11=y1**2

x22=x2**2
y22=y2**2

x3=np.linspace(-0.5,3,100)
y3=2.5-x3

fig = plt.figure(figsize=(6, 6))

ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)
ax.axis[:].set_visible(False)

font = LabelFormat(plt)
ax.axis["x"] = ax.new_floating_axis(0,0)

ax.axis["x"].major_ticklabels.set_fontsize(14)
ax.axis["x"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["x"].set_axisline_style("->", size = 1.0)
ax.axis["x"].label.set_text('$x^{(1)}$')
ax.axis["x"].label.set_fontsize(16)

ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].major_ticklabels.set_fontsize(14)
ax.axis["y"].major_ticklabels.set_fontname('Times New Roman')
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].label.set_text('$x^{(2)}$')
ax.axis["y"].label.set_fontsize(16)

ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")

# Plot figures
plt.plot(x11,y11,'bo')
plt.plot(x22,y22,'rs')
plt.plot(x3,y3,'g-')
plt.text(0.5,0.5,r'$x^{(1)}+x^{(2)}-2.5=0$',fontsize=16,rotation=-45,color='g')

plt.xlim(-1,5)
plt.ylim(-1,5)

plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章