Python | 机器学习之SVM支持向量机

news2024/11/17 15:59:32

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《人工智能奇遇记》
🔖少年有梦不应止于心动,更要付诸行动。

目录结构


1. 机器学习之SVM支持向量机概念

1.1 机器学习

1.2 SVM支持向量机

2. SVM支持向量机算法

2.1 实验目的

2.2 实验准备

2.3 实验原理

2.4 实验内容

2.5 实验心得

致读者


1. 机器学习之SVM支持向量机概念

1.1 机器学习

传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。

机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。

机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。

1.2 SVM支持向量机

支持向量机(Support Vector Machine,简称SVM)是一种广泛应用于分类和回归分析的监督学习算法。其基本原理是通过在特征空间中找到一个最优的超平面,将不同类别的数据点分隔开。

在二分类问题中,SVM的目标是找到一个能够将两类数据点分隔开的超平面,使得两侧距离最近的数据点到超平面的距离(即间隔)最大。这些最靠近超平面的数据点被称为支持向量。超平面的选择不仅要使得间隔最大,还要满足不同类别的数据点被正确分类,即位于超平面两侧的点应被分到不同的类别。

SVM可以通过核函数来处理非线性问题,将数据映射到高维空间,从而找到一个在高维空间中的超平面来完成分类。常用的核函数有线性核、多项式核、径向基核等。

SVM在实际应用中表现出色,尤其在数据维度较高、样本数量不是很大的情况下。它对于处理线性和非线性问题都有很好的效果,是一个强大而灵活的分类算法。

机器学习源文件icon-default.png?t=N7T8https://download.csdn.net/download/m0_57532432/88521177?spm=1001.2014.3001.5503


2. SVM支持向量机算法

2.1 实验目的

(1)加深对监督学习的理解和认识;

(2)掌握SVM分类器的设计方法;

(3)通过鸢尾花的花萼(sepal)和花瓣(petal)的长和宽,建立SVM分类器来判断样本属于山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolor)还是维吉尼亚鸢尾(Iris Virginica)。


2.2 实验准备

(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;

(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。


2.3 实验原理

SVM(支持向量机)的实验原理基于其在特征空间中找到一个最优的超平面,以有效地对数据进行分类。以下是SVM实验的基本原理:

  1. 数据准备: 首先,需要一个带标签的训练数据集,其中包含了输入特征和相应的类别标签。

  2. 超平面的选择: SVM的目标是找到一个超平面,能够将不同类别的数据点分隔开,并使得两侧最靠近超平面的数据点到超平面的距离最大。这个最优的超平面可以通过求解一个凸优化问题来得到。

  3. 间隔最大化: SVM的关键思想是通过间隔最大化来确保分类的鲁棒性。间隔是指超平面两侧距离最近的数据点到超平面的距离。最优的超平面是使得间隔最大的超平面。

  4. 支持向量: 在最优超平面的两侧,存在一些被称为支持向量的数据点。这些支持向量是离超平面最近的数据点,它们对于定义最优超平面至关重要。

  5. 核函数: SVM可以通过核函数来处理非线性问题。核函数能够将数据映射到更高维的空间,使得在这个高维空间中存在一个线性超平面,从而在原始空间中完成非线性分类。

  6. 训练和预测: 通过解决优化问题,找到最优超平面的参数。在训练阶段,算法学习如何调整超平面的参数以实现最佳的分类。在预测阶段,新的数据点通过超平面的位置来进行分类。

SVM的实验原理主要依赖于数学优化的方法,通过数学模型和凸优化理论来找到一个最优的决策边界,以实现对数据的有效分类。


2.4 实验内容

使用Python手动实现SVM支持向量机代码如下:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_score, recall_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.1, num_iterations=2000):
        self.learning_rate = learning_rate
        self.lambda_param = lambda_param
        self.num_iterations = num_iterations
        self.W = None
        self.b = None

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

        for _ in range(self.num_iterations):
            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)

1. 导入鸢尾花数据集;

# Step 1: 导入鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

2. 数据归一化

# Step 2: 数据归一化
scaler = StandardScaler()
X = scaler.fit_transform(X)

3. 训练集和测试数据集划分;

# Step 3: 训练集和测试数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2022)

4. 评价分类结果TP、FN、FP、TN以及精确率和召回率;

# Step 4: 评价分类结果
def evaluate_results(y_true, y_pred):
    confusion = confusion_matrix(y_true, y_pred)
    tp = confusion[1, 1]
    fn = confusion[1, 0]
    fp = confusion[0, 1]
    tn = confusion[0, 0]
    
    precision = precision_score(y_true, y_pred, average='weighted')
    recall = recall_score(y_true, y_pred, average='weighted')
    
    print("Confusion Matrix:")
    print(confusion)
    print("True Positives:", tp)
    print("False Negatives:", fn)
    print("False Positives:", fp)
    print("True Negatives:", tn)
    print("Precision:", precision)
    print("Recall:", recall)

# 创建SVM对象
svm = SVM()

5. 加入松弛因子后,与未加松弛因子之前效果做对比。

# Step 5: 加入松弛因子后的对比
svm_no_slack = SVM(lambda_param=0.0)  # 未加入松弛因子
svm_slack = SVM(lambda_param=101)     # 加入松弛因子


# 训练模型(未加入松弛因子)
svm_no_slack.fit(X_train, y_train)

# 预测(未加入松弛因子)
y_pred_slack = svm_no_slack.predict(X_test)

# 评价分类结果(未加入松弛因子)
print("=====未加入松弛因子=====")
evaluate_results(y_test, y_pred_slack)


# 训练模型(加入松弛因子)
svm_slack.fit(X_train, y_train)

# 预测(加入松弛因子)
y_pred_slack = svm_slack.predict(X_test)

# 评价分类结果(加入松弛因子)
print("=====加入松弛因子后=====")
evaluate_results(y_test, y_pred_slack)

实验结果

未加入松弛因子:

图5-1

加入松弛因子:

图5-2

完整代码如下:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_score, recall_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris


class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.1, num_iterations=2000):
        self.learning_rate = learning_rate
        self.lambda_param = lambda_param
        self.num_iterations = num_iterations
        self.W = None
        self.b = None

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

        self.W = np.zeros(n_features)
        self.b = 0

        for _ in range(self.num_iterations):
            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)

# Step 1: 导入鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# Step 2: 数据归一化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# Step 3: 训练集和测试数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2022)

# Step 4: 评价分类结果
def evaluate_results(y_true, y_pred):
    confusion = confusion_matrix(y_true, y_pred)
    tp = confusion[1, 1]
    fn = confusion[1, 0]
    fp = confusion[0, 1]
    tn = confusion[0, 0]
    
    precision = precision_score(y_true, y_pred, average='weighted')
    recall = recall_score(y_true, y_pred, average='weighted')
    
    print("Confusion Matrix:")
    print(confusion)
    print("True Positives:", tp)
    print("False Negatives:", fn)
    print("False Positives:", fp)
    print("True Negatives:", tn)
    print("Precision:", precision)
    print("Recall:", recall)

# 创建SVM对象
svm = SVM()

# Step 5: 加入松弛因子后的对比
svm_no_slack = SVM(lambda_param=0.0)  # 未加入松弛因子
svm_slack = SVM(lambda_param=101)     # 加入松弛因子

# 训练模型(未加入松弛因子)
svm_no_slack.fit(X_train, y_train)

# 预测(未加入松弛因子)
y_pred_slack = svm_no_slack.predict(X_test)

# 评价分类结果(未加入松弛因子)
print("=====未加入松弛因子=====")
evaluate_results(y_test, y_pred_slack)


# 训练模型(加入松弛因子)
svm_slack.fit(X_train, y_train)

# 预测(加入松弛因子)
y_pred_slack = svm_slack.predict(X_test)

# 评价分类结果(加入松弛因子)
print("=====加入松弛因子后=====")
evaluate_results(y_test, y_pred_slack)

代码分析:

1.导入必要的库和模块

  1. numpy:用于数值计算的Python库。
  2. train_test_split:用于将数据集划分为训练集和测试集的函数。
  3. confusion_matrix、precision_score、recall_score:用于评估分类结果的指标。
  4. StandardScaler:用于数据归一化的类。
  5. load_iris:用于加载鸢尾花数据集的函数。

2.定义支持向量机类(SVM)

  1. __init__方法:初始化SVM对象的学习率(learning_rate)、正则化参数(lambda_param)和迭代次数(num_iterations)等属性。
  2. fit方法:用于训练SVM模型。接受特征数据(X)和标签(y)作为输入。该方法使用梯度下降法更新模型的权重(W)和偏置(b)。
  3. predict方法:用于预测新的样本。接受特征数据(X)作为输入,通过计算线性输出(linear_output)并对其进行符号化处理,返回预测结果。

3.加载鸢尾花数据集

  1. 使用load_iris函数加载鸢尾花数据集,将特征数据存储在X中,将标签存储在y中。

4.数据归一化

  1. 使用StandardScaler类创建一个归一化器对象(scaler)。
  2. 调用fit_transform方法对特征数据进行归一化,将归一化后的数据保存回X中。

5.训练集和测试数据集划分

  1. 使用train_test_split函数将数据集按照指定的比例划分为训练集和测试集。将训练集特征数据存储在X_train中,训练集标签存储在y_train中,测试集特征数据存储在X_test中,测试集标签存储在y_test中。

6.评价分类结果的函数

  1. 定义了一个名为evaluate_results的函数,用于评估分类结果。接受真实标签(y_true)和预测标签(y_pred)作为输入。
  2. 使用confusion_matrix函数计算混淆矩阵,并从中提取真阳性(tp)、假阴性(fn)、假阳性(fp)和真阴性(tn)的数量。
  3. 使用precision_score和recall_score函数计算精确率(precision)和召回率(recall)。

7.输出混淆矩阵、真阳性、假阴性、假阳性、真阴性、精确率和召回率的结果。

8.创建SVM对象

  1. 使用默认参数创建一个SVM对象(svm)。

9.加入松弛因子后的对比

  1. 创建两个SVM对象:一个没有加入松弛因子(svm_no_slack)的对象,另一个加入了松弛因子(svm_slack)的对象。
  2. lambda_param参数控制松弛因子的大小,0.0表示没有松弛因子,101表示加入了较大的松弛因子。

10.训练模型(未加入松弛因子)

  1. 使用训练集数据(X_train和y_train)调用fit方法训练未加入松弛因子的SVM模型。

11.预测(未加入松弛因子)

  1. 使用测试集数据(X_test)调用predict方法进行预测,将预测结果存储在y_pred_slack中。

12.评价分类结果(未加入松弛因子)

  1. 调用evaluate_results函数,传入真实标签(y_test)和预测标签(y_pred_slack),输出评价结果。

13.训练模型(加入松弛因子)

  1. 使用训练集数据(X_train和y_train)调用fit方法训练加入松弛因子的SVM模型。

14.预测(加入松弛因子)

  1. 使用测试集数据(X_test)调用predict方法进行预测,将预测结果存储在y_pred_slack中。

15.评价分类结果(加入松弛因子)

  1. 调用evaluate_results函数,传入真实标签(y_test)和预测标签(y_pred_slack),输出评价结果。

2.5 实验心得

通过本次支持向量机(SVM)算法实验,我在鸢尾花数据集上进行了分类任务,着重比较了加入松弛因子和未加入松弛因子情况下的分类结果,并深入研究了支持向量机的原理和参数设置。

支持向量机是用于分类和回归任务的强大算法,其核心思想是寻找最优的超平面,将不同类别的样本分隔开。在实验中,我分别训练了一个未加入松弛因子的SVM模型和一个引入了松弛因子的模型。

松弛因子的引入允许一些样本存在于超平面错误的一侧,从而提供一定的容错能力。这种机制使模型更具鲁棒性,能够容忍噪声或异常值的存在。通过设置不同的松弛因子参数,我探讨了模型的容错程度,实验中分别使用了松弛因子参数为0(未加入松弛因子)和101(加入较大松弛因子),并采用默认的学习率和迭代次数(0.0001和2000),对数据进行了归一化处理,确保特征具有相似的尺度,避免了某些特征对模型训练的主导影响。

在训练集和测试集划分方面,我采用了train_test_split函数,将数据集按照70%的训练集和30%的测试集进行划分,以确保模型在训练和测试阶段具有足够的数据支持。

实验结果显示,适度引入松弛因子可以提高模型的鲁棒性,使其更好地适应噪声或异常值。选择合适的松弛因子参数根据数据集的特点和任务要求,较小的参数适用于清晰数据,而较大的参数适用于复杂数据和存在噪声的情况。这次实验使我更深入了解了支持向量机的应用和参数调优。


致读者

风自火出,家人;君子以言有物而行有恒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1222456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这就是不创业的最大的原因,机器视觉兄弟们创业要谨慎,为什么99.99%机器视觉公司老板是销售人员?

机器视觉公司&#xff0c;99%公司实行销售优先原则&#xff0c;企业老板99%从销售人员中产生。所以机器视觉兄弟们创业要谨慎。 企业的本质就是通过销售获得利润的组织&#xff0c;销售是立足之本&#xff0c;没有销售&#xff0c;创业就是耍流氓。因此&#xff0c;企业的一切…

基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)

消息一致性处理 在后端执行完相应的操作后&#xff0c;我们需要将执行操作后的结果与数据返回前端&#xff0c;前端 调用我们传回去的数据&#xff0c;前端是如何知道我们传回去的数据名称的&#xff1f; 答&#xff1a;前后端遵循了同一个"协议"。这个协议就是定义…

贝茄莱BR AS实时数据采集功能

实时数据采集功能在PLC系统调试过程中&#xff0c;有助于调试人员对变量变化进行监测&#xff0c;通过波形对比&#xff0c;反应不同变量间的相互作用。该测试目的在于验证贝加莱系统组态软件的实时数据采集功能。 贝加莱系统组态软件提供Trace功能&#xff0c;连接PLC&#x…

国产高云FPGA:OV5640图像视频采集系统,提供Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Gowin工程详解5、上板调试验证并演示准备工作静态演示 6、福利&#xff1…

解锁OpenAI潜力:OpenAI 全面解析与最佳实践

该项目是由OpenAI公司提供的一个大型代码库&#xff0c;其中包含了各类与OpenAI API相关的代码示例和最佳实践。 此项目名为OpenAI Cookbook&#xff0c;目的是为了帮助使用者更有效地利用OpenAI API&#xff0c;将其应用于自己的工作和生活中。具体来说&#xff0c;可以解决一…

CF1899C Yarik and Array(DP,贪心)

题目链接 题目 A subarray is a continuous part of array. Yarik recently found an array a of n elements and became very interested in finding the maximum sum of a non empty subarray. However, Yarik doesn’t like consecutive integers with the same parity, s…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)

公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…

虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火

一、故障现象 一辆2015款奔驰G63AMG车&#xff0c;搭载157发动机&#xff0c;累计行驶里程约为9.4万km。车主反映&#xff0c;该车低速行驶时&#xff0c;发动机偶尔会自动熄火&#xff0c;故障大概1个星期出现1次。 二、故障诊断 接车后路试&#xff0c;故障未能再现。用故障检…

简单线性回归函数

简单线性回归函数 定义术语理解简单线性回归例子 定义 线性回归&#xff1a;利用线性回归方程中最小平方函数对一个或多个自变量和因变量之间关系进行建模的一个回归分析。该建模的目标为找到各个系数的最佳值让预测误差最小 简单线性回归&#xff1a;只有一个自变量的线性回…

重磅消息:ChatGPT创始人Sam Altman被开除!

OpenAI CEO Sam Altman 将离开公司&#xff0c;GregBrockman 将辞去董事会主席一职。首席技术官 Mira Murati将担任临时CEO。 至于 Altman 先生的离职&#xff0c;这是董事会经过深思熟虑的宙查后做出的决定。董事会发现 Altman 在与董事会的沟通中并非始终保持坦率&#xff0c…

WebGoat通关攻略之 SQL Injection (intro)

SQL Injection (intro) 1. What is SQL? 本题练习SQL查询语句&#xff0c;就是写一句SQL获取叫Bob Franco所在的department SELECT department FROM employees WHERE first_name Bob AND last_name Franco成功通关&#xff01; 2. Data Manipulation Language (DML) 本题…

一些RLHF的平替汇总

卷友们好&#xff0c;我是rumor。 众所周知&#xff0c;RLHF十分玄学且令人望而却步。我听过有的小道消息说提升很大&#xff0c;也有小道消息说效果不明显&#xff0c;究其根本还是系统链路太长自由度太高&#xff0c;不像SFT一样可以通过数据配比、prompt、有限的超参数来可控…

python引入自己不同目录的模块

1.目录结构 from manual_data.utils import delete_and_insert_center

时间序列预测:移动平均线、指数平滑和 SARIMA

一、说明 在我的上一篇文章中&#xff0c;我们介绍了用于数据分析和清理的不同技术&#xff0c;以准备用于预测的数据。在完成数据的分析和提炼后&#xff0c;我们成功实现了获得不存在任何缺失值、异常值或其他异常的原始数据集的目标。 现在&#xff0c;我们将继续使用上一篇…

【算法每日一练]-图论(保姆级教程 篇4(遍历))#传送门 #负环判断 #灾后重建

今天继续 目录 题目&#xff1a;传送门 思路&#xff1a; 题目&#xff1a;负环判断 思路&#xff1a; 题目&#xff1a;灾后重建 思路&#xff1a; 题目&#xff1a;传送 门 思路&#xff1a; 先跑一边floyd&#xff0c;然后依次加入每个传送门&#xff0c;O(n^5)不行…

CF1899B 250 Thousand Tons of TNT

题目链接 题目 题目大意 T T T 组测试数据 每组 n n n 个货物&#xff0c;第 i i i 个货物 的重量是 a i a_i ai​ 用k辆货车按顺序装这些货物&#xff0c;条件是每辆车上的货物个数都一样&#xff0c;也即是说 n n n 必须能被 k k k 整除&#xff0c; 求任意两辆车货物总…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

利用ETLCloud自动化流程实现业务系统数据快速同步至数仓

现代企业有不少都完成了数字化的转型&#xff0c;而还未转型的企业或商铺也有进行数字化转型的趋势&#xff0c;由此可见&#xff0c;数据已经成为企业决策的重要依据。企业需要先获取数据&#xff0c;将业务系统数据同步至数仓进行整合&#xff0c;然后再进行数据分析。为了更…

vivado产生报告阅读分析7-时序报告3

1、“ Timing Summary Report ”详情 “ Timing Summary Report ” &#xff08; 时序汇总报告 &#xff09; 包含下列部分 &#xff1a; • “ General Information ”部分 • “ Timer Settings ”部分 • “ Design Timing Summary ”部分 • “ Clock Summary ”部…

代码随想录算法训练营第五十八天丨 动态规划part18

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…