支持向量机 Part 3:线性不可分下的支持向量分类与python实现——机器学习笔记

* * *  The Machine Learning Noting Series  * * *

导航

1、解决线性不可分问题的一般解决方式

2、支持向量分类克服维灾难的途径

4、核函数与线性变换

3、python实现

1、解决线性不可分问题的一般解决方式

核心思想:

将低维空间中线性不可分问题,通过恰当的非线性变换转化为高维空间中的线性可分(使用曲面)问题。

例如,将X1,X2这一二维空间上线性不可分的严格不能,进行非线性变换称X1,X2,Z三维空间上的分布,而在三维空间上就可以找到一个平面将两类分开。

建模思路:

1)映射。使用特定的非线性映射函数\varphi _{M}(),将原来低维空间上的点映射到M维空间R^{M}上;

2)寻找超平面。

为找到低维空间中可将两类分开的分类曲线(曲面),需到高维空间中寻找与其对应的平面。

缺陷:

在高维空间中会出现维灾难(Curse of Dimensionality):因超平面待估参数过多而导致的计算问题或无法估计。

原因:对原p维空间通过d阶交乘变换到高维空间后,待估参数变为\frac{(p+d-1)!}{d!(p-1)!}个。例如,当p=10,d=3时,需估计220个参数,可见高维将导致计算复杂度急剧增加,而在小样本下几乎无法实现。

2、支持向量机克服维灾难的途径

分类结果取决于点积

点积度量了两样本点相似性

两点空间位置关系代表相似性,由点积度量

3、核函数与线性变换

非线性可分下支持向量分类的基本思路是,找到一个函数K(X_{i},X_{j}),若它基于低维空间的特征就能度量出两点Xi,Xj在高维空间中的位置关系,即其函数值恰好等于变换后的点积:

K(X_{i},X_{j})\equiv \left [ \varphi _{M}(X_{i}) \right ]^{T}\varphi _{M}(X_{j})

则有对偶目标函数式(9.21)成立:

常见核函数

3、python实现

基于模拟数据,使用多项式核和径向基核,在不同惩罚参数C下进行分类。

#导入模块
import numpy as np
from numpy import random
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import warnings
warnings.filterwarnings(action = 'ignore')
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.model_selection import train_test_split,KFold
import sklearn.neural_network as net
import sklearn.linear_model as LM
from scipy.stats import multivariate_normal
from sklearn.metrics import r2_score,mean_squared_error,classification_report
from sklearn import svm
import os
# 采用不同核函数和惩罚参数C进行分类
N=100
X,Y=make_circles(n_samples=N,noise=0.2,factor=0.5,random_state=123)
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.85, random_state=1)
X1,X2= np.meshgrid(np.linspace(X_train[:,0].min(),X_train[:,0].max(),500),np.linspace(X_train[:,1].min(),X_train[:,1].max(),500))
X0=np.hstack((X1.reshape(len(X1)*len(X2),1),X2.reshape(len(X1)*len(X2),1)))
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(15,12))
for C,ker,H,L in [(1,'poly',0,0),(1,'rbf',0,1),(1000,'poly',1,0),(1000,'rbf',1,1)]:
    modelSVC=svm.SVC(kernel=ker,random_state=123,C=C) 
    modelSVC.fit(X_train,Y_train)
    Y0=modelSVC.predict(X0)
    axes[H,L].scatter(X0[np.where(Y0==1),0],X0[np.where(Y0==1),1],c='lightgray')
    axes[H,L].scatter(X0[np.where(Y0==0),0],X0[np.where(Y0==0),1],c='mistyrose')
    for k,m in [(1,'^'),(0,'o')]:
        axes[H,L].scatter(X_train[Y_train==k,0],X_train[Y_train==k,1],marker=m,s=40)
        axes[H,L].scatter(X_test[Y_test==k,0],X_test[Y_test==k,1],marker=m,s=40,c='',edgecolors='g')
        
    axes[H,L].scatter(modelSVC.support_vectors_[:,0],modelSVC.support_vectors_[:,1],marker='o',c='b',s=120,alpha=0.3)
    axes[H,L].set_xlabel("X1")
    axes[H,L].set_ylabel("X2")
    axes[H,L].set_title("线性不可分下的支持向量机最大边界超平面(C=%.1f,Kernal=%s,测试误差=%.2f)"%(C,ker,1-modelSVC.score(X_test,Y_test)))
    axes[H,L].grid(True,linestyle='-.')

分类结果如下图所示:其中深色和浅色分别对应两个预测类别区域。大圆圈圈住的点为支持向量。左侧两图使用3阶多项式核。可以看出,惩罚参数C越大,将导致分类边界更加“努力”拟合边界点,从而呈现出更多的弯曲变化。从样本分布特点和测试误差来看,这里应采用径向基核。

参考文献

《Python机器学习 数据建模与分析》,薛薇 等/著

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值