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

目录

一、SVM的概念

       1.SVM

2. 线性可分

3. 寻找最大间隔

4. 硬间隔和软间隔 

二、SVM的优缺点与应用场景

1. 优点

2. 缺点

 3. 应用场景

三、基于SVM代码实现鸢尾花数据集分类 

四、实验结果分析 

五、总结


一、SVM的概念

       1.SVM

        支持向量机(Support Vector Machine,SVM)是机器学习中的一个二分类模型,用于分类和回归分析。它能够有效地处理线性可分和线性不可分的数据,并在高维空间中构建最优的决策边界。

        SVM 能够执行①线性或非线性分类②回归,甚至是③异常值检测任务

        SVM的核心思想是寻找到一个超平面使样本分成两类,并且间隔最大。这个超平面称为最大间隔超平面,它可以很好地进行分类预测。

        具体而言,SVM通过将样本映射到高维特征空间,使得数据在该空间中线性可分。如果在原始输入空间中无法找到一个线性超平面将数据分开,SVM引入了核函数,将计算复杂度从高维特征空间转移到原始输入空间中。常用的核函数有线性核、多项式核和高斯核等。

        SVM的训练过程是一个凸优化问题,目标是最小化模型的结构风险。在求解过程中,SVM只关注那些位于决策边界附近的样本,它们被称为支持向量。这种特性使得SVM具有较好的鲁棒性和泛化能力。

        总体而言,SVM是一种强大的机器学习算法,能够处理高维空间的数据,并通过寻找最优超平面实现分类和回归分析。它在许多领域如图像识别、文本分类和生物信息学中都取得了广泛的应用。

2. 线性可分

对于一个数据集合可以画一条直线将两组数据点分开,这样的数据成为线性可分(linearly separable),如下图所示:

  • 分割超平面:将上述数据集分隔开来的直线称为分隔超平面。对于二维平面来说,分隔超平面就是一条直线。对于三维及三维以上的数据来说,分隔数据的是个平面,称为超平面,也就是分类的决策边界。
  • 间隔:点到分割面的距离,称为点相对于分割面的间隔。数据集所有点到分隔面的最小间隔的2倍,称为分类器或数据集的间隔。SVM分类器就是要找最大的数据集间隔。
  • 支持向量:离分隔超平面最近的那些点。

SVM所做的工作就是找这样个超平面,能够将两个不同类别的样本划分开来,但是这种平面是不唯一的,即可能存在无数个超平面都可以将两种样本分开。为此Vapnik提出了一种方法,对每一种可能的超平面,我们将它进行平移,直到它与空间中的样本向量相交。我们称这两个向量为支持向量,之后我们计算支持向量到该超平面的距离d,分类效果最好的超平面应该使d最大。

3. 寻找最大间隔

(1)分割超平面

二维空间一条直线的方程为,y=ax+b,推广到n维空间,就变成了超平面方程,即

f(x)=w^{T}x+b

(2)寻找最大超平面

支持向量机的核心思想是最大间隔化, 最不受到噪声的干扰。如图所示,分类器A比分类器B的间隔(蓝色阴影)大,因此A的分类效果更好。

寻找最佳超平面: 

4. 硬间隔和软间隔 

(1)硬间隔

硬间隔分类就是严格地让所有实例都不在最大间隔之间,并且位于正确的一边。【如以上使用超平面分割数据的过程就是硬间隔分类】

硬间隔分类有两个问题:

  1. 它只在数据是线性可分离的时候才有效
  2. 它对异常值非常敏感

(2)软间隔

但在现实生活中,数据往往不是线性可分的。 如下图:

为了解决这个问题,我们引入了软间隔(soft margin)的概念。相比于硬间隔的苛刻条件,我们允许个别样本点出现在间隔带里面。这样,我们就可以在最大化间隔的同时,尽量减少不满足约束的样本数量,以便更好地拟合数据。

比如:

二、SVM的优缺点与应用场景

1. 优点

  1. 适用于高维空间:SVM在高维空间中处理数据效果良好。它可以有效地处理具有大量特征的数据集,并且不易受到维度灾难的影响。
  2. 处理线性和非线性问题:SVM在处理线性可分和线性不可分的数据时都能够取得良好的效果。通过使用核函数,SVM可以将数据映射到高维特征空间,从而处理非线性问题。
  3. 泛化能力强:SVM通过最大化分类间隔来构建最优的决策边界,从而在训练数据之外的新数据上表现出很好的泛化能力。这意味着SVM对未见过的数据也能进行准确的分类预测。
  4. 鲁棒性强:SVM在构建模型时只关注支持向量,即位于决策边界附近的样本点。这使得SVM对于噪声和异常值具有较好的鲁棒性,能够减少模型的过拟合风险。

2. 缺点

  1. 难以处理大规模数据集:SVM的计算复杂度随着训练样本数量的增加而增加。当处理大规模数据集时,训练时间和内存消耗可能会变得非常高,甚至难以承受。
  2. 对参数和核函数选择敏感:SVM中有一些关键参数需要选择,如正则化参数C和核函数的参数。选择不当的参数值可能导致模型性能下降。此外,选择合适的核函数也是一个挑战,不同的数据集可能需要不同的核函数。
  3. 对缺失数据敏感:SVM对于缺失数据比较敏感。如果数据中存在缺失值,需要进行额外的处理,如填充缺失值或者使用特定的方法处理缺失数据,否则可能影响模型的性能。 

 3. 应用场景

  1. 二分类问题:SVM最初被设计用于解决二分类问题,特别是在数据线性可分的情况下,SVM能够找到最优的超平面来准确地将两个类别分开。
  2. 多分类问题:虽然SVM最初是为二分类问题设计的,但也可以通过一对多或一对一策略扩展到多类别分类问题。一对多策略将每个类别与其他所有类别进行区分,而一对一策略则构建一组分类器来处理每对类别。
  3. 文本分类与情感分析:SVM在文本分类任务中表现出色,可以用于将文本分为不同的类别,如垃圾邮件识别、情感分析等。通过将文本表示为特征向量,SVM可以学习一个决策边界来准确地分类新的文本样本。

三、基于SVM代码实现鸢尾花数据集分类 

1. 数据集介绍

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

数据集内容:

     sepal_len  sepal_wid  petal_len  petal_wid  label
0          5.1        3.5        1.4        0.2      0
1          4.9        3.0        1.4        0.2      0
2          4.7        3.2        1.3        0.2      0
3          4.6        3.1        1.5        0.2      0
4          5.0        3.6        1.4        0.2      0
..         ...        ...        ...        ...    ...
145        6.7        3.0        5.2        2.3      2
146        6.3        2.5        5.0        1.9      2
147        6.5        3.0        5.2        2.0      2
148        6.2        3.4        5.4        2.3      2
149        5.9        3.0        5.1        1.8      2

2. 基于sklearn的代码实现

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
 
 
def create_data():
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    data = np.array(df.iloc[:100, [0, 1, -1]])
    for i in range(len(data)):
        if data[i,-1] == 0:
            data[i,-1] = -1
    return data[:,:2], data[:,-1]
 
 
X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
 
 
plt.scatter(X[:50,0],X[:50,1], label='0')
plt.scatter(X[50:,0],X[50:,1], label='1')
plt.show()
 
 
model = SVC()
model.fit(X_train, y_train)
 
SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
 
 
print('train accuracy: ' + str(model.score(X_train, y_train)))
print('test accuracy: ' + str(model.score(X_test, y_test)))

这段代码主要进行了以下操作:

  1. 通过create_data()函数加载了鸢尾花数据集,并处理成了特征和标签的形式,其中标签被转换为-1和1。
  2. 将数据集划分为训练集和测试集,其中训练集占 75%。
  3. 使用 matplotlib 对数据进行了可视化,展示了 sepal length 和 sepal width 特征的散点图。
  4. 创建了一个支持向量机(SVM)的模型,并用训练集对其进行训练。
  5. 输出了模型在训练集和测试集上的准确率。

3. 运行结果 

3.1 数据分布展示:

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

train accuracy: 1.0
test accuracy: 0.96

四、实验结果分析 

 从输出结果来看,训练集准确率为 1.0,即 100%,表明模型在训练集上表现完美,而测试集准确率为 0.96,即 96%,说明模型在测试集上也有较好的表现,但仍存在一定的泛化误差。这就说明该模型可能存在轻微的过拟合,可以进行模型参数调优、交叉验证等方法来改善模型的泛化能力。

五、总结

支持向量机是一种强大的机器学习算法,用于分类和回归。它通过最优超平面来分隔不同类别的样本,并具有较好的泛化能力和鲁棒性。然而,SVM在计算复杂度和参数选择方面存在挑战。在实际应用中,需要适当调整参数和进行模型优化。

情感识别系统是一种可以自动判断和分类文本或语音中所表达的情感的算法。支持向量机(SVM)是一种常用的机器学习方法,在情感识别中也广泛应用。 SVM基于对数据进行特征映射,将数据从低维空间转化为高维空间,以便更好地进行分类。在情感识别中,我们可以将文本或语音数据转化为特征向量表示,然后使用SVM进行分类。通常选择常用的特征表示方法如词袋模型或者TF-IDF进行特征提取。 下面给出一个用Matlab实现情感识别系统的示例代码: ```matlab % 导入情感数据集 data = importdata('emotion_data.txt'); % 划分训练集和测试集 trainRatio = 0.8; trainSize = int32(length(data) * trainRatio); trainData = data(1:trainSize,:); testData = data(trainSize+1:end,:); % 提取特征和标签 trainFeatures = trainData(:,1:end-1); trainLabels = trainData(:,end); testFeatures = testData(:,1:end-1); testLabels = testData(:,end); % 创建SVM模型 svmModel = fitcsvm(trainFeatures, trainLabels); % 在测试集上进行预测 predictedLabels = predict(svmModel, testFeatures); % 计算准确率 accuracy = sum(predictedLabels == testLabels) / length(testLabels); disp(['准确率:' num2str(accuracy*100) '%']); ``` 以上代码中,我们首先导入情感数据集,然后将数据划分为训练集和测试集。接着我们提取特征和标签,即将文本数据转化为特征向量表示。 然后我们使用fitcsvm函数来创建SVM模型,并通过predict函数在测试集上进行预测。最后我们计算准确率来评估模型的性能。 这是一个简单的情感识别系统的实现示例,实际情感识别会有更多的特征提取方法和模型调参等工作。希望这个回答能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值