Python3入门机器学习 - 支撑向量机SVM

简介: SVM的主要思想可以概括为两点:它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。

SVM的主要思想可以概括为两点:

  1. 它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
  2. 它基于结构风险最小化理论之上在特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。


    img_e0de2c454fb92f5d91aeaf77df18c117.png






Hard Margin SVM


img_f2631c283d32472f287e740ae52d9d66.png
n维平面中点到直线的距离公式
对于红点和蓝点每个点应满足的不等式条件
img_18f14a49f0f9ed2f0e082b672447c332.png
image.png
问题最终转化为
img_21c29f45dd661e5f8c74078042fdb1b4.png

即最终转化为有条件的最优化问题
img_a888add75ae5166f912ba11a5ca1be9d.png
有条件的最优化问题




Soft Margin SVM


img_9fcba23ba7744ba19fff6453e93738f1.png
将eta值加入模型正则化项,给模型一定的容错能力,C越大,容错空间越小,C越小,容错空间越大
使用scikit-learn中的svm
from sklearn import datasets
import numpy as np 
import matplotlib.pyplot as plt

#准备数据
iris = datasets.load_iris()
X = iris['data']
y = iris['target']
X = X[y<2,:2]
y = y[y<2]
#数据归一化(SVC涉及距离,应该使用数据归一化处理)
from sklearn.preprocessing import StandardScaler
stdScaler = StandardScaler()
stdScaler.fit(X)
X_standard = stdScaler.transform(X)
#实例化svc对象,训练模型
from sklearn.svm import LinearSVC
svc = LinearSVC(C=1e9)
svc.fit(X_standard,y)
AI 代码解读
def plot_svc_decision_boundary(model,axis):
    x0,x1 = np.meshgrid(
        np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)),
        np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100))
    )
    X_new = np.c_[x0.ravel(),x1.ravel()]
    
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    
    plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_cmap)

    #除去决策边界外,还要画出svc支撑向量的线
    w = model.coef_[0]
    b = model.intercept_[0]
    
    # w0x0 + w1x1 + b = 0
    # => x1 = -w0/w1*w0-b/w1
    
    plot_x = np.linspace(axis[0],axis[1],200)
    up_y = -w[0]/w[1] * plot_x - b/w[1] +1/w[1]
    down_y = -w[0]/w[1] * plot_x - b/w[1] -1/w[1]
    
    up_index = (up_y>=axis[2])&(up_y<=axis[3])
    down_index = (down_y>=axis[2])&(down_y<=axis[3])
    plt.plot(plot_x[up_index],up_y[up_index],color='black')
    plt.plot(plot_x[down_index],down_y[down_index],color='black')

plot_svc_decision_boundary(svc,axis=[-3,3,-3,3])
plt.scatter(X_standard[y==0,0],X_standard[y==0,1])
plt.scatter(X_standard[y==1,0],X_standard[y==1,1])
plt.show()
AI 代码解读
img_bd43a3c930e398f7fefcdea4a89f7559.png
svc = LinearSVC(C=1e9)

img_8f35f1d33c4a582279cba77d3de6a158.png
svc = LinearSVC(C=0.1)
多项式特征应用于SVM
#使用制作数据的方法生成数据,噪音为0.15
X,y = datasets.make_moons(noise=0.15)

plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

def PolynomialSVC(degree,C=1.0):
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("std_standard",StandardScaler()),
        ("svc",LinearSVC(C=C))
    ])
AI 代码解读
img_ced5762888d9181de76f5440c73edbec.png
使用多项式核函数的SVM
from sklearn.svm import SVC

def PolynomialKernelSVC(degree,C=1.0):
    return Pipeline([
        ("std_scaler",StandardScaler()),
        ("kernelSVC",SVC(kernel="poly",degree=degree,C=C))
    ])

poly_kernel_svc = PolynomialKernelSVC(degree=5)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
AI 代码解读
img_eb6a1a4b0290c9cb6d529949030056b8.png
与使用LinearSVC不同
原理
img_435c1c09334a2e29e8f5b696d1dedfb1.png
将原来的损失函数转换为右式

img_ac256a9f31c2b3c4071a2a640224050a.png
多项式原本转换是将xi,ji转换为新的矩阵,这里多项式核函数就是K函数,用函数K计算出新的矩阵,达到和原来多项式转换相同的效果

img_1991f04d5d0e4ae738d30ef9aef98570.png
二次项K函数的计算方法

img_0e6397cbfdfa4d3796ba3021971f2a76.png
d代表degree,用多项式核函数的方法计算新的矩阵




RBFKernel(高斯核函数)


img_e722890a7814216daa31a0a8331c61e3.png
gamma为高斯核的超参数
def RBFKernelSVC(gamma=1.0):
    return Pipeline([
        ("std_sacler",StandardScaler()),
        ("svc",SVC(kernel="rbf",gamma=gamma))
    ])

svc = RBFKernelSVC()
svc.fit(X,y)
AI 代码解读
def plot_decision_boundary(model,axis):
    x0,x1 = np.meshgrid(
        np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)),
        np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100))
    )
    X_new = np.c_[x0.ravel(),x1.ravel()]
    
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    
    plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_cmap)

plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
AI 代码解读
img_4aa0c1a4c54cf28be65270dedf9d4b99.png
gamma=1.0的高斯核函数进行SVC

img_3d83953d5fb965617075f6ec1242e59d.png
gamma=100的高斯核,过拟合

img_50b9e95d494ff6f9819b4ab9cb299333.png
gamma=0.1的高斯核,欠拟合


SVM思想解决回归问题

img_4c5b941abff09539518a4bd5101a1cf0.png

boston = datasets.load_boston()

X = boston['data']
y = boston['target']

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y)

from sklearn.svm import LinearSVR
#epsilon为超参数
def StandardLinearSVR(epsilon=0.1):
    return Pipeline([
        ("std_scaler",StandardScaler()),
        ("svc",LinearSVR(epsilon=epsilon))
    ])

lin_svr = StandardLinearSVR()
lin_svr.fit(X_train,y_train)
lin_svr.score(X_test,y_test)
>>> 0.6735924094720267
AI 代码解读
目录
打赏
0
0
0
0
8
分享
相关文章
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
30 7
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
38 9
Python与机器学习:使用Scikit-learn进行数据建模
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等