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

svm与logstic异同

       svm支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

        svm是一种分类算法,分类算法的起源来自于logstic算法。svm也从logstic延续一些概念如线性分类器和决策边界。然而,svm和logstic在处理非线性问题时,处理方式不同。logstic使用逻辑函数来对数据进行分类,而svm使用核函数来将数据映射到高维空间,以便找到一个超平面来分隔不同类别数据。所以svm在处理非线性数据时有更好的泛化能力和鲁棒性。

最大分类间隔

      

        线性模型: 在样本空间中寻找一个超平面, 将不同类别的样本分开

         超平面方程:W^{t}+b=0

训练数据:
令 x + 和 x 位于决策边界上,标签分 别为正、负的两个样本,考虑 x + 到分类线的距离为:
因此,分类间隔为:

在SVM中,寻找参数w和b的过程可以通过求解以下优化问题来实现:

                                       

                                    

其中,xi​表示第i个样本点的特征向量,yi​为其所属的类别(+1或-1),∥w∥表示向量w的模长,b表示偏置项,i=1,2,...,n表示样本的总数。

上述优化问题的目标是最大化分类间隔,即最小化分割超平面到各个类别的最近样本点的距离之和的一半。同时,约束条件要求所有样本点都位于其对应类别的分割超平面的正确侧,即确保分类的正确性。

通过拉格朗日乘子法,可以将上述约束条件转化为以下等价的无约束问题:

                  

其中,αi​为拉格朗日乘子,用于将原问题转化为对偶问题,并且其取值必须满足αi​⩾0,∀i。

接着,可以通过求解argmax​L(w,b,α)来最终确定参数w和b的值,从而得到一个具有最大间隔的分割超平面。

对偶问题

     

       对于支持向量机(SVM),其对偶问题是将原始问题转化为一个只涉及拉格朗日乘子的优化问题。通过求解对偶问题,可以得到最优的拉格朗日乘子,并进一步计算出最优的参数。

       首先,给定训练样本集D={(x1​,y1​),(x2​,y2​),...,(xn​,yn​)},其中xi​表示输入样本,yi​表示对应的类别标签,且yi​∈{−1,+1}。

       原始问题的目标是找到一个超平面wTx+b=0,使得所有正样本位于超平面上方,负样本位于超平面下方,并且使得间隔最大化。该问题可以表述为以下优化问题:

                                           

                                      

       对于原始问题,引入拉格朗日乘子αi​≥0,得到拉格朗日函数:

                        

      然后,使用拉格朗日函数对w和 b求偏导,并令导数为零,可以得到如下的对偶问题:

                           

                                 

      在求解对偶问题时,通过优化拉格朗日乘子αi​,可以求得最优的αi∗​。然后,通过计算参数w和b,可以得到最优的超平面:

 

                                    

         其中,xj​为任意一个支持向量(对应于非零的拉格朗日乘子αj∗,yj​为其对应的类别标签。通过求解对偶问题,可以得到最优的拉格朗日乘子,从而确定最大间隔的分割超平面。

 

 核函数

       在支持向量机(SVM)中,核函数是一种用于处理非线性可分问题的技术。它通过将输入样本从原始特征空间映射到一个高维特征空间,使得在高维空间中的样本线性可分或更容易分开。

       核函数的作用是计算两个样本点在高维特征空间中的内积,而无需显式地进行特征向量的计算。这样做的好处是避免了高维特征空间的计算复杂度,而只需在原始特征空间中进行计算。

      常用的核函数包括:

  1. 线性核函数(Linear Kernel):K(x,z)=x^{T}z,它对应于原始特征空间,适用于线性可分的情况。

  2. 多项式核函数(Polynomial Kernel)K(x,z)=(x^{t}z+c)d,其中c为常数,d为多项式的次数。它通过引入高阶项,可以处理一定程度上的非线性可分问题。

  3. 高斯核函数(Gaussian Kernel),也称为径向基函数(Radial Basis Function,RBF):                    

        其中σ为控制高斯核函数宽度的参数。它可以将样本映射到无穷维的特征空间,适用于复杂的非线性可分问题。

       5.Sigmoid核函数(Sigmoid Kernel):K(x,z)=tanh(αx^{T}z+c),其中α和c为常数。它通常用于神经网络等特定的任务。

软间隔与正则化

       软间隔(soft margin)允许在寻找最优超平面时,允许一些样本点出现在间隔边界上或甚至被错分类。这主要是为了在处理线性不可分问题时保持一定的鲁棒性。软间隔通过引入松弛变量(slack variable),将原始问题转化为一个带有约束的优化问题。

       对于给定的训练样本集D={(x1​,y1​),(x2​,y2​),...,(xn​,yn​)},其中xi​表示输入样本,yi​表示对应的类别标签,且yi∈{−1,+1}yi​∈{−1,+1}。软间隔的目标是找到一个超平面wTx+b=0,使得大部分样本点位于间隔边界以内,并且尽量少的样本点位于间隔边界之外。

优化问题可以表述为以下形式:

                   

                             

        其中,ξi​是松弛变量,C是控制错误分类与间隔边界之间权衡的惩罚因子。通过调整参数C的值,可以平衡间隔边界的宽度和错误分类的容忍程度。

        正则化(regularization)是为了避免模型过拟合而引入的一种技术。在支持向量机中,常用的正则化形式是L2正则化,也称为岭回归。

优化问题可以进一步修改为:

                         

                              

       其中,λ是L2正则化的惩罚系数,用于控制模型的复杂度。较大的λ值会使得模型更加趋向于简单的解决方案,从而减少过拟合的风险。


支持向量回归

特点:允许模型输出和实际输出间存在 2 ε 的偏差 .
落入中间 2 ε 间隔带的样本不计算损失 , 从而使得模型获得稀疏性
训练策略

代码实现

        通过支持向量机(Support Vector Machine,SVM)算法对Titanic数据集进行分类预测,代码的目标是根据Titanic数据集中的乘客信息,预测乘客是否生还(1表示生还,-1表示未生还)。

  1. loadDataset()函数加载数据集,将数据转换为合适的格式,并进行一些预处理,如删除无关特征、缺失值处理、数据类型转换等。

  2. split_data()函数将数据集划分为数据矩阵和标签向量。

  3. select_j_rand()函数随机选择另一个待优化的alpha值。

  4. clip_alptha()函数修剪alpha值,确保其在指定范围内。

  5. smo()函数实现序列最小最优化算法,通过计算误差和优化alpha来求解支持向量。

  6. caluelate_w()函数根据求得的alpha值计算权重向量w。

  7. prediction()函数进行预测,根据权重向量w和偏置b来判断样本的类别。

  8. if __name__ == "__main__":下,先加载测试集和训练集,然后调用上述函数进行模型训练和预测。最后统计预测准确率。

1.导入包

import csv
import numpy as np
import matplotlib.pyplot as plt
import copy
from time import sleep
import random
import types

2.数据处理

def loadDataset(filename):with open(filename, 'r') as f:lines = csv.reader(f)data_set = list(lines)if filename != 'titanic.csv':for i in range(len(data_set)):del(data_set[i][0])# 整理数据for i in range(len(data_set)):del(data_set[i][0])del(data_set[i][2])data_set[i][4] += data_set[i][5]del(data_set[i][5])del(data_set[i][5])del(data_set[i][6])del(data_set[i][-1])category = data_set[0]del (data_set[0])# 转换数据格式for data in data_set:data[0] = int(data[0])data[1] = int(data[1])if data[3] != '':data[3] = float(data[3])else:data[3] = Nonedata[4] = float(data[4])data[5] = float(data[5])# 补全缺失值 转换记录方式 分类for data in data_set:if data[3] is None:data[3] = 28# male : 1, female : 0if data[2] == 'male':data[2] = 1else:data[2] = 0
# 经过测试,如果不将数据进行以下处理,分布会过于密集,处理后,数据的分布变得稀疏了# age <25 为0, 25<=age<31为1,age>=31为2if data[3] < 25:data[3] = 0elif data[3] >= 21 and data[3] < 60: # 但是测试得60分界准确率最高???!!!data[3] = 1else:data[3] = 2# sibsp&parcg以2为界限,小于为0,大于为1if data[4] < 2:data[4] = 0else:data[4] = 1# fare以64为界限if data[-1] < 64:data[-1] = 0else:data[-1] = 1return data_set, categorydef split_data(data):data_set = copy.deepcopy(data)data_mat = []label_mat = []for i in range(len(data_set)):if data_set[i][0] == 0:data_set[i][0] = -1label_mat.append(data_set[i][0])del(data_set[i][0])data_mat.append(data_set[i])print(data_mat)print(label_mat)return data_mat, label_mat

3.SVM

def select_j_rand(i ,m):# 选取alphaj = iwhile j == i:j = int(random.uniform(0, m))return jdef clip_alptha(aj, H, L):# 修剪alphaif aj > H:aj = Hif L > aj:aj = Lreturn ajdef smo(data_mat_In, class_label, C, toler, max_iter):# 转化为numpy的mat存储data_matrix = np.mat(data_mat_In)label_mat = np.mat(class_label).transpose()# data_matrix = data_mat_In# label_mat = class_label# 初始化b,统计data_matrix的纬度b = 0m, n = np.shape(data_matrix)# 初始化alpha,设为0alphas = np.mat(np.zeros((m, 1)))# 初始化迭代次数iter_num = 0# 最多迭代max_iter次while iter_num < max_iter:alpha_pairs_changed = 0for i in range(m):# 计算误差Eifxi = float(np.multiply(alphas, label_mat).T*(data_matrix*data_matrix[i, :].T)) + bEi = fxi - float(label_mat[i])# 优化alpha,松弛向量if (label_mat[i]*Ei < -toler and alphas[i] < C) or (label_mat[i]*Ei > toler and alphas[i] > 0):# 随机选取另一个与alpha_j成对优化的alpha_jj = select_j_rand(i, m)# 1.计算误差Ejfxj = float(np.multiply(alphas, label_mat).T*(data_matrix*data_matrix[j, :].T)) + bEj = fxj - float(label_mat[j])# 保存更新前的alpha,deepcopyalpha_i_old = copy.deepcopy(alphas[i])alpha_j_old = copy.deepcopy(alphas[j])# 2.计算上下界L和Hif label_mat[i] != label_mat[j]:L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])if L == H:print("L == H")continue# 3.计算etaeta = 2.0 * data_matrix[i, :]*data_matrix[j, :].T - data_matrix[i, :]*data_matrix[i, :].T - data_matrix[j, :]*data_matrix[j, :].Tif eta >= 0:print("eta >= 0")continue# 4.更新alpha_jalphas[j] -= label_mat[j]*(Ei - Ej)/eta# 5.修剪alpha_jalphas[j] = clip_alptha(alphas[j], H, L)if abs(alphas[j] - alphas[i]) < 0.001:print("alpha_j变化太小")continue# 6.更新alpha_ialphas[i] += label_mat[j]*label_mat[i]*(alpha_j_old - alphas[j])# 7.更新b_1和b_2b_1 = b - Ei - label_mat[i]*(alphas[i] - alpha_i_old)*data_matrix[i, :]*data_matrix[i, :].T - label_mat[j]*(alphas[j] - alpha_j_old)*data_matrix[i, :]*data_matrix[j, :].Tb_2 = b - Ej - label_mat[i]*(alphas[i] - alpha_i_old)*data_matrix[i, :]*data_matrix[j, :].T - label_mat[j]*(alphas[j] - alpha_j_old)*data_matrix[j, :] * data_matrix[j, :].T# 8.根据b_1和b_2更新bif 0 < alphas[i] and C > alphas[i]:b = b_1elif 0 < alphas[j] and C > alphas[j]:b = b_2else:b = (b_1 + b_2)/2# 统计优化次数alpha_pairs_changed += 1# 打印统计信息print("第%d次迭代 样本:%d , alpha优化次数:%d" % (iter_num, i, alpha_pairs_changed))# 更新迭代次数if alpha_pairs_changed == 0:iter_num += 1else:iter_num = 0print("迭代次数:%d" % iter_num)return b, alphasdef caluelate_w(data_mat, label_mat, alphas):# 计算walphas = np.array(alphas)data_mat = np.array(data_mat)label_mat = np.array(label_mat)# numpy.tile(A, reps):通过重复A给出的次数来构造数组。# numpy中reshape函数的三种常见相关用法# reshape(1, -1)转化成1行:# reshape(2, -1)转换成两行:# reshape(-1, 1)转换成1列:# reshape(-1, 2)转化成两列w = np.dot((np.tile(label_mat.reshape(1, -1).T, (1, 5))*data_mat).T, alphas)return w.tolist()

4.预测

def prediction(test, w, b):test = np.mat(test)result = []for i in test:if i*w+b > 0:result.append(1)else:result.append(-1)print(result)return result

5.主程序

if __name__ == "__main__":test_set, category = loadDataset('titanic_test.csv')data_set, category = loadDataset('titanic_train.csv')test_mat, test_label = split_data(test_set)data_mat, label_mat = split_data(data_set)b, alphas = smo(data_mat, list(label_mat), 0.6, 0.001, 40)print(b)print(alphas)w = caluelate_w(data_mat, label_mat, alphas)print(w)print(test_mat)print(test_label)result = prediction(test_mat, w, b)count = 0for i in range(len(result)):if result[i] == test_label[i]:count += 1print(count)print(count/len(result))

总结

       支持向量机(Support Vector Machine,SVM)是一种强大的监督学习算法,常用于分类和回归问题,广泛应用于文本分类、图像识别、生物信息学、金融预测等许多领域。

  1. 优点:

    • 在高维空间中有较好的分类性能,适用于复杂的非线性问题。
    • 可有效处理小样本情况,具有较好的泛化能力。
    • 使用支持向量的形式来表示分类决策函数,因此模型比较简洁。
  2. 缺点:

    • 对大规模训练样本的计算复杂度较高。
    • 对参数的选择敏感,需要进行调参。
    • 对噪声数据比较敏感,可能导致过拟合。

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

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

相关文章

微服务保护--熔断降级

1.熔断降级介绍 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例&#xff0c;如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求&#xff1b;而当服务恢复时&#xff0c;断路器会放行访问该服务的请求。 断路器控制熔断和放行…

3小时快速入门自动化测试 —— Selenium测试工具

自动化测试 自动化测试简单来说就是利用自动化测试工具和自动化测试脚本来完成指定的测试任务&#xff0c;测试启动过程无需人工参与&#xff0c;但自动化测试之前的准备工作需要人工手动配置好。它是一种将重复性、繁琐的测试任务交给计算机自动执行的方法&#xff0c;能够显…

安恒明御安全网关 aaa_local_web_preview文件上传漏洞复现

0x01 产品简介 明御安全网关秉持安全可视、简单有效的理念,以资产为视角,构建全流程防御的下一代安全防护体系,并融合传统防火墙、入侵检测、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 0x02 漏洞概述 明御安全网关在…

【采坑分享】npm login/publish/whoami失败采坑,解决npmERR426、ETIMEDOUT、ECONNREFUSED等错误

目录 前言背景&#xff1a; 采坑之路&#xff1a; 1.修改https为http&#xff0c;问题还在 2.修改为淘宝镜像&#xff0c;问题还在 3.修改为官网地址&#xff0c;问题还在 4.升级node和npm&#xff0c;问题还在 5.猜想网络问题&#xff0c;问题解决 采坑总结&#xff1a…

HTTP 414错误:请求URI过长,如何避免

在Web开发中&#xff0c;HTTP状态码是用于表示Web服务器响应的各种状态。其中&#xff0c;HTTP 414错误表示请求URI过长&#xff0c;这意味着客户端发送的请求URL超过了服务器所能处理的长度限制。 当请求的URI过长时&#xff0c;服务器可能无法正确处理请求&#xff0c;从而导…

Spring批量加载Resource目录下的文件

项目中的配置文件用json方式存储在了resources下面的文件夹下面。如下&#xff1a; 在代码里面需要将他们全部读出来。 但是ClassLoader.getResource 只能读取单个文件&#xff0c;不能读取文件列表。然后就想到了 mybatis 同样也是要读配置文件列表&#xff0c;就想看看 myba…

01-EEA电子电器架构

1.背景 汽车正在从传统的机械装置逐步电气化&#xff0c;汽车电子电气功能不断的丰富。越来越多的电气系统和功能被集成到汽车上&#xff0c;传统的原理及线束设计已经远远不能满足。为此&#xff0c;EEA(电子电气架构)应运而生。如何设计电子电气架构&#xff0c;满足日益增长…

字符串——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、字符串相加1、题目讲解2、思路讲解3、代码实现 二、仅仅反转字母1、题目讲解2、思路讲解3…

前端面试CSS知识点

目录 前言 一、块级元素、行内元素和行内块元素的区别 1. 块级元素-display:block 1.1.1 常见的块级元素 1.1.2 块级元素的特点 2. 行内元素-display-inline 2.1.1 常见的行内元素 2.1.2 行内元素的特点 3. 行内块元素-display:inline-block 3.1.1 常见的行内块元素 3.1.2 行内…

媒体直播平台有哪些,活动直播如何扩大曝光?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体直播平台包括人民视频、新华社现场云、中国网、新浪新闻直播、搜狐视频直播、凤凰新闻直播、腾讯新闻直播等。活动直播想要扩大曝光&#xff0c;可以考虑以下方式&#xff1a; 1.选择…

Nginx七层代理,四层代理 + Tomcat多实例部署

目录 1.tomcat多实例部署 准备两台虚拟机 进入pc1 pc2同时安装jdk 进入pc1 pc2安装tomcat PC1配置&#xff08;192.168.88.50&#xff09; 安装tomcat多实例 tomcat2中修改端口 启动tomcat1 tomcat2 分别在三个tomcat服务上部署jsp的动态页面 2.nginx的七层代理&…

Logistic 回归算法

Logistic 回归 Logistic 回归算法Logistic 回归简述Sigmoid 函数Logistic 回归模型表达式求解参数 $\theta $梯度上升优化算法 Logistic 回归简单实现使用 sklearn 构建 Logistic 回归分类器Logistic 回归算法的优缺点 Logistic 回归算法 Logistic 回归简述 Logistic 回归是一…

ros2+xml格式launch文件示例代码(重要内容)

源自githubeasy_ros2_launch_talk/easy_launch_demo/launch/demo_launch.xml at main tylerjw/easy_ros2_launch_talk GitHub <launch><arg name"robot_ip" default"xxx.yyy.zzz.www" /><arg name"use_fake_hardware" default…

【Spring】07 懒加载

文章目录 1.定义2. 作用3. 配置方式1&#xff09;XML配置2&#xff09;Java配置3&#xff09;注解方式 4. 应用场景5. 注意事项总结 1.定义 懒加载&#xff08;Lazy Initialization&#xff09;是Spring 框架中的一项强大的特性&#xff0c;它允许我们推迟 Bean 的初始化&…

直播源自动检测工具iptv-m3u-maker

【申明】&#xff1a;本文不提供任何播放列表或其他数字内容。屏幕截图中的频道和图片仅供演示和说明之用。 老苏以前介绍过 IPTV Checker &#xff0c;能对直播源进行有效性检测 文章传送门&#xff1a;用Jellyfin➕xTeVe播放和录制IPTV 今天要介绍的 iptv-m3u-maker 功能是一…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…

Axure的动态图使用以及说明

认识Axure动态图 Axure动态图是Axure中的一种功能&#xff0c;它允许用户在原型中添加动画效果和交互动作&#xff0c;使原型更加生动和具有真实的用户体验。用户可以通过添加动态图来展示页面过渡、按钮点击、下拉菜单等交互操作的效果。 这是&#xff1a;就是我们今天要叫的…

生产环境_Spark处理轨迹中跨越本初子午线的经度列

使用spark处理数据集&#xff0c;解决gis轨迹点在地图上跨本初子午线的问题&#xff0c;这个问题很复杂&#xff0c;先补充一版我写的 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.func…

【️什么是分布式系统的一致性 ?】

&#x1f60a;引言 &#x1f396;️本篇博文约8000字&#xff0c;阅读大约30分钟&#xff0c;亲爱的读者&#xff0c;如果本博文对您有帮助&#xff0c;欢迎点赞关注&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; &#x1f5a5;️什么是分布式系统的一致性 &#xff1f…

Linux---查看文件内容命令

1. 查看文件内容命令的使用 命令说明cat查看小型文件more分屏查看大型文件 cat命令的效果图 说明: cat命令结合重定向可以完成多个文件的合并gedit 文件编辑命令&#xff0c;可以查看和编辑文件 more命令的效果图 当查看内容信息过长无法在一屏上显示时&#xff0c;可以使…