机器学习-支持向量机

目录

7.1支持向量机

        7.11支持向量机介绍

        7.12超平面

        7.13分类间隔

        7.14支持向量

        7.15软间隔和硬间隔

7.2支持向量机进行数据分类

        7.21数据准备

        7.22数据分类

        7.23可视化超平面

         7.3实验结果分析与总结

        7.31实验结果分析

        7.32实验结果总结


7.1支持向量机

        7.11支持向量机介绍

        支持向量机是一种用于分类和回归的监督学习模型。它的主要目标是找到一个能够最大化分类间隔的决策边界(或超平面)。SVM 在解决二分类问题方面特别有效,并且可以通过核方法扩展到非线性分类问题。

        7.12超平面

在一维空间中,可以利用一个点来区分两类数据点,在二维空间中,超平面是一条直线;在三维空间中,是一个平面。在更高维的空间中,它是一个超平面SVM 的目标是找到能够最大化分类间隔的超平面,即在n维的平面中,总是能找到n-1维的超平面来划分数据。

        7.13分类间隔

        分类间隔是指从超平面到最近的样本点(支持向量)的距离。SVM 通过最大化这个间隔来找到最佳的决策边界。

        7.14支持向量

        支持向量是距离决策边界最近的样本点。这些样本点决定了最终的决策边界的具体位置。决策边界由那些靠近边界的点(支持向量)决定。在SVM中,只有支持向量会影响到超平面的方向和位置,其他的点不会对超平面的确定产生影响。

        7.15软间隔和硬间隔

        硬间隔:要求所有样本点都被正确分类,适用于线性可分的数据。

        软间隔:允许一些样本点被误分类,通过引入松弛变量和正则化参数来平衡分类准确性和间隔的大小,适用于线性不可分的数据。

7.2支持向量机进行数据分类

        7.21数据准备

本次实验所导入的包:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

        在本次实验中,除了利用numpy包来更好地进行计算,matplotli包的pyplot模块来进行可视化展示数据以及超平面,还利用了sklearn包来生成示例数据集。

if __name__ == '__main__':
    X, y = datasets.make_blobs(n_samples=100, n_features=2, centers=2, cluster_std=1.05, random_state=40)
    y = np.where(y == 0, -1, 1)
    svm = LinearSVM()
    svm.fit(X, y)   
    # 绘制决策边界
    plot_hyperplane(X, y, svm.w, svm.b)

         使用datasets.make_blobs 生成一个二分类的数据集并训练 SVM 模型。在本次实验中,主要是对二分类问题进行解决,所以本次生成的数据集,包括了100个样本点、2个特征值、两个类别。并将每个类别中样本点的标准差设置为 1.05,(假设你有一个聚类中心在 (0, 0),标准差为 1.05。那么,大多数样本点会分布在距离 (0, 0) 不超过 1.05 个单位的范围内,但有些点可能会分布得更远。)并设置随机数种子,保证结果的可重复性。

        由于上述所生成的数据可以得到,X是一个形状为(100,2)的数组,包含了100个样本点的两个特征,而y是一个长度为100的数组,包含了每个样本点的标签(0,1),并且为了分别对应决策的正类和负类,需要将标签从0/1转化为-1/1。

        

        图一:生成的数据集(部分)和标签集

        7.22数据分类

在进行实验的数据分类之前,

学习率设置为:0.001,用于控制每次更新的步长。

正则化参数:0.01,用于控制模型对错误分类的容忍度与决策边界的简单性之间的权衡。

迭代次数:1000,用于表示模型训练过程中更新参数的次数。

class LinearSVM:
    def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iters=1000):
        self.learning_rate = 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.learning_rate * (2 * self.lambda_param * self.w)
                else:
                    self.w -= self.learning_rate * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
                    self.b -= self.learning_rate * y_[idx]
 
    def predict(self, X):
        linear_output = np.dot(X, self.w) - self.b
        return np.sign(linear_output)

        在fit函数中,首先获取样本的特征数,并将标签从0/1转化到-1/1,初始化权重向量为全零向量,长度为特征数量。并将偏置值初始化为0。

 对数据集进行训练,枚举每个样本点及其索引,检查当前样本点是否满足条件                 y_{i} (w * x_{i} -b) \geq 1

如果条件成立,更新权重w,仅仅对权重进行衰减,如果不成立则更新权重向量w,和偏置值b。

        在predict函数重,首先计算输出X*w - b,并返回预测结果的符号,+1表示正类,-1表示负类。

        这个LinearrSVM类实现了一个简单的线性支持向量机模型,包括训练和预测功能。通过初始化权重和偏置,并在每次迭代中根据 SVM 的条件更新它们,模型可以找到最优的决策边界。fit方法用于训练模型,predict方法用于对新数据进行分类。

        7.23可视化超平面

def plot_hyperplane(X, y, w, b):
    plt.scatter(X[:, 0], X[:, 1], marker='o', c=y, s=100, edgecolors='k', cmap='winter')
    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 = (np.dot(xy, w) - b).reshape(XX.shape)
    ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
    plt.show()

        在函数plot_hyperplane中,利用 matplotlib 库来可视化 SVM 模型学习到的决策边界和数据点的分布,帮助理解分类效果和决策边界的位置。        

  图二:(正则化参数0.01)支持向量机分类效果展示

 

图三:(正则化参数0.1)支持向量机分类效果展示 

         7.3实验结果分析与总结

        7.31实验结果分析

        在本次支持向量机进行数据分类的实验中,首先,可视化的决策边界能够清晰地展示出模型对数据点的分类能力,其次,可以明显通过调整正则化参数(lambda_param)可以影响模型的收敛速度和最终分类效果,需要进行适当的调优。当参数为0.1时可以明显发现有个别样本点落在决策边界和超平面之间,当参数设置为0.01时,这种情况就出现明显好转,因此在进行该实验时,需要进行适当的参数选择,可以使 SVM 在不同类型的数据集上取得良好的分类结果。

        优点:

        对于样本数量不大但特征维度较高的数据集,SVM 的计算效率较高,因为它主要依赖于支持向量而不是整个数据集。SVM 在高维空间中表现良好,适合处理具有许多特征的数据集。SVM 通过最大化决策边界到支持向量(距离最近的训练样本点)的距离,可以有效地防止过拟合,具有良好的泛化能力。

        缺点:

        当训练样本数量非常大时,SVM 的训练时间较长,尤其是在非线性核函数和复杂数据结构下。SVM 对数据的质量要求较高,特别是对缺失数据敏感,需要在预处理阶段进行适当的数据调整

        7.32实验结果总结

        在本次SVM实验中,理解支持向量机的工作原理,以及如何调节参数以优化模型的性能。合适的参数设置和数据条件下,能够提供较好的分类性能和泛化能力。通过实验结果的分析,可以帮助确定在实际应用中如何调整和优化支持向量机模型,以适应不同的数据分布和问题需求。

        同时,也让我明白了支持向量的在不同方面的优缺点,SVM 在高维空间中表现良好,适合处理具有许多特征的数据集。并且SVM具有较好的泛化能力,能够较好地来防止过拟合,但对于样本数量较大情况,SVM的效率相对没那么高。

         

         

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值