sklearn之SVM支持向量机

支持向量机需要注意的地方:

1. 三个理解步骤:

    (1) 理解svm的损失函数,min ||w||^2/2并且y(wx+b)>=k的限制条件的推导

    (2) 拉格朗日定理求最小值,以及推导过程

2. 关于核函数的作用:

   可以通过升维度的方式将无法线性可分的数据可分,但升维的代价太大,所以通过核函数可以达到类似的效果并且计算量也不是那么大,核函数相当于增加了一维,在空间中形成更核函数类似的超平面( 理解决策边界 / 超平面 )

   通常【线性核函数】对于线性可分的数据集效果比较好,但非线性数据集就不是很好;【多项式核函数】的效果在不调节d参数时,跟线性核函数的效果差不多,,但是如果调节参数,多项式效果会比较好;【高斯核函数】在这几个核函数中是效果最好的;【sigmod核函数】的效果不是特别理想。

   根据几个核函数的公式,【线性核函数】几乎没有什么参数可调,【多项式核函数】可通过调d参数,但d越大,次方越大,付出的计算代价越大;【高斯核函数】高斯核函数可以调节两个参数;

3. svm最后的评估效果可以通过准确率和泛化误差来判定:

    准确率高,但测试集的泛化能力可能差(即超平面C参数很小),准确率      低,但可能的泛化能力会高一点(即超平面C参数间隔大)

 

 

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

# 使用make_blogs函数创建数据集合
X,y = make_blobs(n_samples=50,centers=2,random_state=0,cluster_std=0.6)
X.shape
pd.DataFrame(y)

plt.figure()
# 查看数据的分布情况
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
plt.xticks([])
plt.yticks()

def plot_svc_decision_function(model,ax=None):
    # 2.获取网格坐标xy
    if ax is None:
        ax=plt.gca()
    # 获取当前坐标轴的两端极值
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    # 将x/y轴的两极值切分成30等分
    axisx = np.linspace(xlim[0],xlim[1],30)
    axisy = np.linspace(ylim[0],ylim[1],30)

    axisx, axisy= np.meshgrid(axisx, axisy)

    xy = np.vstack([axisx.ravel(), axisy.ravel()]).T


    # 4.获取到决策树的决策边界坐标,decision_function接口主要获取每个样本到坐标决策边界转化后的坐标
    P = model.decision_function(xy).reshape(axisx.shape)

    #print(P.shape)
    # (30,30)

    ax.contour(axisx,axisy,P,colors=["r","b","r"],levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    
# 1.描点,建立坐标系,为网格坐标分割数组做准备
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
# 2.SVC训练数据
model = SVC(kernel="linear").fit(X,y)
# 3.画图
plot_svc_decision_function(model)
#plt.show()

# 通过环形数据来演示关于线性SVC的分类方式
from sklearn.datasets import make_circles
# X为生成数据坐标,y为标签,对应描点scatter的颜色
X,y = make_circles(100,factor=0.1,noise=.1)
# pd.DataFrame(y)

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值