机器学习-SVM

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
前言
  • SVM(支持向量机)是一种常用的机器学习算法,用于分类和回归分析。它的主要目的是寻找一个最优超平面,将不同属性的数据分成不同的类别。SVM是一种有效的分类器,因为它可以处理高维数据,并且可以使用核函数处理非线性可分的数据。
SVM思想
  • 它的核心思想是通过将数据映射到高维空间来找到一个最优的超平面

  • SVM通过找到支持向量来定义最优超平面。支持向量是最接近超平面的数据点,它们对于定义超平面的位置和方向起着重要的作用。因此,SVM寻找最优超平面的过程可以简化为找到能够最大化支持向量到最优超平面的距离的超平面。

SVM流程
  1. 数据预处理

    在使用SVM之前,需要对数据进行预处理,包括数据清洗、特征选择和特征提取等。此外,还需要将数据分为训练集和测试集。

  2. 特征映射

    SVM的核心思想是通过将数据映射到高维空间来找到一个最优的超平面。因此,在这一步中,需要将数据通过核函数进行映射,将原始数据映射到高维空间。

  3. 寻找最优超平面

    在映射到高维空间后,SVM需要寻找一个最优的超平面,将数据分成不同的类别。为了找到最优超平面,需要确定一些参数,如C(惩罚系数)和γ(核函数的参数),以最大化分类器的准确性。

  4. 分类

    在训练好分类器后,需要使用测试数据集对分类器进行测试,并计算分类器的准确率和召回率等指标。

SVM优缺点
  • 优点
    • 高维数据处理能力:SVM可以很好地处理高维数据,并且可以使用核函数处理非线性可分的数据,因此适用于处理许多实际问题。
    • 鲁棒性:SVM对于噪声数据有很好的处理能力,因为它只关注最接近超平面的数据点。
    • 适用于小样本:SVM只需要找到支持向量而不是所有的数据点,因此适用于处理小样本问题。
    • 可调参数:SVM具有许多可调参数,如C(惩罚系数)和γ(核函数的参数),以最大化分类器的准确性。
  • 缺点
    • 计算复杂度高:在处理大规模数据时,SVM的计算复杂度较高,因此训练时间较长。
    • 需要选择适当的核函数:选择适当的核函数对于SVM的性能非常重要,但这往往需要进行一定的试验和调整。
    • 对缺失数据敏感:SVM对于缺失数据比较敏感,因此需要在预处理数据时进行处理。
  • 总结
    • SVM在处理高维数据和非线性数据时表现出色,并且对于噪声数据和小样本问题也有很好的效果。但是,SVM的计算复杂度较高,并且需要选择适当的核函数,因此在实际应用中需要仔细考虑其优缺点,以选择合适的机器学习算法。
底层代码实现
import numpy as np

class SVM:
    def __init__(self, learning_rate=0.01, lambda_param=0.01, n_iters=1000):
        self.lr = learning_rate       # 学习率
        self.lambda_param = lambda_param    # 正则化参数
        self.n_iters = n_iters         # 迭代次数
        self.w = None       # 参数w
        self.b = None       # 参数b

    def fit(self, X, y):
        n_samples, n_features = X.shape

        # 将标签y转换为{-1, 1},便于后续计算
        y_ = np.where(y <= 0, -1, 1)

        self.w = np.zeros(n_features)   # 初始化参数w为全零向量
        self.b = 0                      # 初始化参数b为0

        # 使用梯度下降法求解最优参数w和b
        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   # 判断样本点是否位于Margin之内
                if condition:
                    self.w -= self.lr * (2 * self.lambda_param * self.w)   # 如果在Margin之内,更新参数w
                else:
                    self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))   # 如果在Margin之外,更新参数w和b
                    self.b -= self.lr * y_[idx]     # 更新参数b

    def predict(self, X):
        approx = np.dot(X, self.w) - self.b   # 计算样本点到超平面的距离
        return np.sign(approx)    # 返回样本点的类别,即其符号

__init__函数中,定义了学习率、正则化参数和迭代次数等超参数。

fit函数中,使用梯度下降法求解最优参数w和b,其中当样本点位于Margin之外时,更新参数w和b。

predict函数中,计算样本点与超平面的距离,并返回其符号作为预测结果。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习