机器学习——支持向量机(SVM)

一、支持向量机介绍

        支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

1.svm算法原理

        SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如上图所示,w *x+b=0 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。        

问题 :将训练样本分开的超平面可能有很多, 哪一个好呢?
答案: 应选择”正中间” , 容忍性好, 鲁棒性高, 泛化能力最强

支持向量:距超平面(c)距离最近的点。

支持向量平面:恰好过这些点的平面(a、b)。

超平面:超平面是n维欧氏空间中余维度等于一的线性子空间,也就是必须是(n-1)维度。 如果空间是3维的,那么它的超平面是二维平面,而如果空间是二维的,则其超平面是一维线。

2.支持向量机分类

二、最大间隔与分类

1.超平面方程

w^{T}x+b=0

2.最大间隔

        SVM中,分隔超平面是一个能够将正负样本恰好隔开的超平面,并且使得正样本在分隔超平面“上方”,负样本在分隔超平面”下方“。这就意味着w^{T}x+b=0,分隔超平面中的w,b需要满足以下条件:          

间隔:  d=\frac{2}{||w||}

解释一下这个间隔的由来:上图中的x1点代入得到式1:w^{T}x_{1}+b=1,x2代入得到式2:w^{T}x_{2}+b =-1,将式1-式2得到:w^{T}(\vec{x}_{1}-\vec{x}_{2})=2,根据向量相乘的性质 

\left \| w \right \|\cdot \left \| \vec{x}_{1}-\vec{x}_{2} \right \|\cdot cos\theta =2,由上图可以看出\left \| \vec{x}_{1}-\vec{x}_{2} \right \|\cdot cos\theta =d,即\left \| w \right \|\cdot d=2

所以d=\frac{2}{\left \| w \right \|}

最大化间隔:寻找参数wb , 使得下述公式最大

\frac{2}{\left \| w \right \|}的最大值,就是求其倒数的最小值

三、对偶问题

1.等式约束

        给定一个目标函数 f : R n R ,希望找到 x R n ,在满足约束条件 g ( x )=0 的前提
下,使得 f ( x ) 有最小值。该约束优化问题记为:
                                        ​​​​​​​        
可建立拉格朗日函数:L(x,\lambda )=f(x)+\lambda g(x)
其中 λ 称为拉格朗日乘数。因此,可将原本的约束优化问题转换成等价的
无约束优化问题:

2.不等式约束的KKT条件

将约束等式 g ( x )=0 推广为不等式 g ( x )≤0 。这个约束优化问题可改为:
同理,其拉格朗日函数为:
其约束范围为不等式,因此可等价转化成 Karush-Kuhn-Tucker(KKT) 条件:
在此基础上,通过优化方式(如二次规划或 SMO )求解其最优解。
原始问题:
对偶问题:
其中,αi​是拉格朗日乘子。求解对偶问题会得到αi​,然后可以通过以下公式计算w和b:
其中,k是任意一个满足0<αk​<C的索引。

四、SVM实现鸢尾花分类

1.数据集介绍

        鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作例子。数据集内包含 3 类共 150 个样本,每类各 50 个样本,每条样本都有 4 个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这 4 个特征预测鸢尾花属于(iris-setosa, iris-versicolour, iris-virginica)中的哪个品种。

花萼长度花萼宽度花瓣长度花瓣宽度
5.13.31.70.5
5.02.33.31.0
6.42.85.62.2
品种(标签)
0(山鸢尾)
1(变色鸢尾)
2(维吉尼亚鸢尾)

2.代码实现

# 导入所需的库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

class SVM:
    def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iters=1000):
        self.lr = learning_rate
        self.lambda_param = lambda_param
        self.n_iters = n_iters
        self.w = None
        self.b = None

    def fit(self, X, y):
        n_samples, n_features = X.shape
        y_ = np.where(y <= 0, -1, 1)
        self.w = np.zeros(n_features)
        self.b = 0

        for _ in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1
                if condition:
                    self.w -= self.lr * (2 * self.lambda_param * self.w)
                else:
                    self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
                    self.b -= self.lr * y_[idx]

    def predict(self, X):
        linear_output = np.dot(X, self.w) - self.b
        return np.sign(linear_output)

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征以便于可视化
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建并训练SVM模型
model = SVM()
model.fit(X_train, y_train)

# 预测训练集和测试集
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

# 计算训练集和测试集的准确率
train_accuracy = np.sum(y_train_pred == y_train) / len(y_train)
test_accuracy = np.sum(y_test_pred == y_test) / len(y_test)
print(f'Train Accuracy: {train_accuracy*100:.2f}%')
print(f'Test Accuracy: {test_accuracy*100:.2f}%')

# 可视化
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.coolwarm)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = model.predict(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
plt.show()

3.运行结果

训练集和测试机上的准确性:

五、参阅

机器学习——支持向量机-CSDN博客

超平面_百度百科 (baidu.com)

支持向量机(SVM)——原理篇 - 知乎 (zhihu.com)

机器学习 —— 支持向量机-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值