线性SVM(支持向量机)算法及python代码实现

SVM(support vector machines):

        支持向量机是一种二分类模型,将实例的特征向量映射为空间的一些点。

算法目的

        画线“最好地”区分这两类点

                         其中红线最好的区分了这两类,而蓝色其次,绿色无法区分这两类。

画线的原则

        SVM 将会寻找可以区分两个类别并且能使间隔(margin)最大的划分超平面。比较好的划分超平面,样本局部扰动时对它的影响最小、产生的分类结果最鲁棒、对未见示例的泛化能力最强。

 间隔(margin):

        对于任意一个超平面,其两侧数据点都距离它有一个最小距离,这两个最小距离的和就是间隔。对于上图来说,第一种超平面的划分方式导致其间隔较小,而第二种明显增大。

支持向量:

        虚线上的点(它到超平面的距离相同)

超平面表达及求解:

 超平面: w^{T}X+b=0

  • w={w1​;w2​;...;wd​} 是一个法向量,决定了超平面的方向, d 是特征值的个数

        针对上图来说,此时特征值为x1,x2两个 即w = {w1;w2}

  • X为训练样本
  • b为位移项,决定了超平面与原点之间的距离

我们使用python的sklearn库来学习SVM的应用问题

# sklearn 库中导入 svm 模块
import numpy as np
import pylab as pl  # 绘图功能
from sklearn import svm

# 定义三个点和标签
X = [[2, 0], [1, 1], [2,3]]
print(X)
# 分类 0为第一类 1为第二类
y = [0, 0, 1]
# 定义分类器,clf 意为 classifier,是分类器的传统命名
clf = svm.SVC(kernel='linear')  # .SVC()就是 SVM 的方程,参数 kernel 为线性核函数
# 训练分类器
clf.fit(X, y)  # 调用分类器的 fit 函数建立模型(即计算出划分超平面,且所有相关属性都保存在了分类器 cls 里)
# 打印分类器 clf 的一系列参数
print(clf)
# 支持向量
print(clf.support_vectors_)
# 属于支持向量的点的 index
print(clf.support_)
# 在每一个类中有多少个点属于支持向量
print(clf.n_support_)
# 预测一个新的点
print(clf.predict([[2, 0]]))

w = clf.coef_[0]  # w 是一个二维数据,coef 就是 w = [w0,w1]
a = -w[0] / w[1]  # 斜率
xx = np.linspace(-5, 5)  # 从 -5 到 5 产生一些连续的值(随机的)
# .intercept[0] 获得 bias,即 b 的值,b / w[1] 是截距
yy = a * xx - (clf.intercept_[0]) / w[1]  # 带入 x 的值,获得直线方程

# 画出和划分超平面平行且经过支持向量的两条线(斜率相同,截距不同)
b = clf.support_vectors_[0] # 取出第一个支持向量点
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1] # 取出最后一个支持向量点
yy_up = a * xx + (b[1] - a * b[0])

# 查看相关的参数值
print("w: ", w)
print("a: ", a)
print("support_vectors_: ", clf.support_vectors_)
print("clf.coef_: ", clf.coef_)

# 在 scikit-learin 中,coef_ 保存了线性模型中划分超平面的参数向量。形式为(n_classes, n_features)。若 n_classes > 1,则为多分类问题,(1,n_features) 为二分类问题。
X = np.array([[2, 0], [1, 1], [2, 3]])
# 绘制划分超平面,边际平面和样本点
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')
# 圈出支持向量
pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
           s=80, facecolors='none')
pl.scatter(X[:, 0], X[:, 1])

pl.axis('tight')
pl.show()

结果说明:

[[2, 0], [1, 1], [2, 3]]
SVC(kernel='linear')
[[1. 1.]
 [2. 3.]]
[1 2]
[1 1]
[0]
w:  [0.4 0.8]
a:  -0.5
support_vectors_:  [[1. 1.]
 [2. 3.]]
clf.coef_:  [[0.4 0.8]]

参考:

i机器学习算法(一)SVM_不吃饭就会放大招的博客-CSDN博客_机器学习svmx

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Python支持向量机(Support Vector Machine,SVM)是一种非常常用的机器学习算法,用于分类和回归问题。下面是关于其设计与实现的简要说明: 首先,我们需要导入所需的库,例如`numpy`用于数值计算,`sklearn.svm`用于实现SVM模型。然后,我们可以通过调用`svm.SVC()`创建一个支持向量机分类模型。 接下来,我们需要准备训练集和测试集的数据。通常,我们需要将数据集分为输入特征(X)和目标变量(y)。特征是用于训练模型的属性,而目标变量是我们希望预测的输出。确保数据已经适当地进行了预处理,例如特征缩放。 然后,我们可以使用`fit(X, y)`方法拟合我们的模型,这将根据训练集的特征和目标变量训练模型。之后,我们可以使用`predict(X_test)`方法对测试集的特征进行预测,并得到预测结果。 在实际实施中,我们还可以调整一些参数来优化模型的性能。例如,我们可以调整正则化参数C值,以控制模型对误分类样本的惩罚程度;还可以选择不同的核函数,例如线性核、多项式核或高斯径向基函数(RBF)核,以适应不同的数据分布。 最后,我们可以使用准确率、精确率、召回率等指标来评估我们的模型的性能。这些指标可以通过引入`sklearn.metrics`库实现。 总之,基于PythonSVM算法实现涉及导入相关库、创建模型、准备数据、训练模型、预测及评估模型。这种机器学习算法非常适用于分类和回归问题,尤其对于非线性数据或具有高维特征的数据集效果显著。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值