scikit-learn 支持向量机--图视化

代码笔记:

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

X,y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.6)
plt.scatter(X[:,0], X[:,1],c=y, s=50, cmap="rainbow" )
plt.xticks([])
plt.yticks([])
plt.show()

plt.scatter(X[:,0], X[:,1],c=y, s=50, cmap="rainbow" )
ax = plt.gca()#获取当前的子图,如果不存在,创建新的子图
xlim = ax.get_xlim()
ylim = ax.get_ylim()
#要画决策边界,必须要有网格
axisx = np.linspace(xlim[0], xlim[1],30)
axisy = np.linspace(ylim[0], ylim[1],30)
axisy, axisx = np.meshgrid(axisy, axisx)
#将特征向量转换为特征矩阵的函数
#核心是将两个特征向量广播,获取y.shape * x.shape 这么多个坐标点的横坐标和纵坐标
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
#ravel()是降维函数,vstack将多个结构一致的一维数组按行堆叠起来

#建模, fit计算相应的决策边界
clf = SVC(kernel="linear").fit(X,y)
P = clf.decision_function(xy).reshape(axisx.shape)
#decision function 返回每个输入样本对应的到决策边界的距离
#然后将这个距离转为axisx的结果
#画决策边界和平行于决策边界的超平面
ax.contour(axisx, axisy, P, colors="k", levels=[-1,0,1],alpha=0.5, linestyles=["--","-","--"])
ax.set_xlim(xlim)
ax.set_ylim(ylim)

def plot_svc_decision_function(model, ax=None):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    x = np.linspace(xlim[0], xlim[1],30)
    y = np.linspace(ylim[0], ylim[1],30)
    y, x = np.meshgrid(y, x)
    xy = np.vstack([x.ravel(), y.ravel()]).T
    P = model.decision_function(xy).reshape(x.shape)
    ax.contour(x, y, P, colors="k", levels=[-1,0,1],alpha=0.5, linestyles=["--","-","--"])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    
clf = SVC(kernel="linear").fit(X,y)
plt.scatter(X[:,0], X[:,1],c=y, s=50, cmap="rainbow" )
plot_svc_decision_function(clf)


from sklearn.datasets import make_circles
X,y = make_circles(100, factor=0.1, noise=0.1)
plt.scatter(X[:,0], X[:,1],c=y, s=50, cmap="rainbow" )
plt.show()

clf = SVC(kernel="linear").fit(X,y)
plt.scatter(X[:,0], X[:,1],c=y, s=50, cmap="rainbow" )
plot_svc_decision_function(clf)

import numpy as np
r = np.exp(-(X**2).sum(1))
rlim = np.linspace(min(r),max(r),0.2)

from mpl_toolkits import mplot3d #必须引入该库,否则下面的projection="3d"会报错

#elev 上下旋转的角度
#azim 平行旋转的角度
def plot_3D(elev = 60, azim = 30, X=X, y=y):
    ax = plt.subplot(projection="3d")
    ax.scatter3D(X[:,0], X[:,1],r, c = y,s=50, cmap='rainbow')
    ax.view_init(elev=elev, azim=azim)
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("z")
    plt.show()
plot_3D()

#引入交互
from ipywidgets import interact, fixed
interact(plot_3D, elev=[0,30,60],azim=(-180,180),X=fixed(X), y=fixed(y))
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值