Python大数据分析——SVM模型(支持向量机)

Python大数据分析——SVM模型(支持向量机)

  • 认知模型
    • 介绍
    • 距离计算
    • 模型思想
    • 目标函数
    • 函数与几何间隔
  • 线性可分SVM模型
    • 目标函数
    • 函数代码
  • 非线性可分SVM模型
    • 目标函数
    • 函数代码
  • 示例
    • 手写体字母识别
    • 森林火灾面积预测

认知模型

介绍

超平面的理解:在一维空间中,如需将数据切分为两段,只需要一个点即可;在二维空间中,对于线性可分的样本点,将其切分为两类,只需一条直线即可;在三维空间中,将样本点切分开来,就需要一个平面。
在这里插入图片描述

距离计算

在这里插入图片描述
点到线的距离:
在这里插入图片描述

平行线间的距离:
在这里插入图片描述

模型思想

在这里插入图片描述

绘制了两条分割直线,利用这两条直线,可以方便地将样本点所属的类别判断出来。虽然从直观上来看这两条分割线都没有问题,但是哪一条直线的分类效果更佳呢(训练样本点的分类效果一致,并不代表测试样本点的分类效果也一样)?甚至于在直线和之间还存在无数多个分割直线,那么在这么多的分割线中是否存在一条最优的“超平面”呢?
在这里插入图片描述

假设直线Li是L1和L2以之间的某条直线(分割面),为了能够寻找到最优的分割面山Li,需要做三件事,首先计算两个类别中的样本点到直线的Li距离;然后从两组距离中各挑选出一个最短的(如图中所示的距离d1和d2),继续比较d1和d2,再选出最短的距离(如图中的d1),并以该距离构造“分割带”(如图中经平移后的两条虚线);最后利用无穷多个分割直线Li,构造无穷多个“分割带”,并从这些“分割带”中挑选出带宽最大的Li。
在这里插入图片描述

“分割带”代表了模型划分样本点的能力或可信度,“分割带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型泛化能力越强,分类的可信度越高;反之,“分割带”越窄,说明模型的准确率越容易受到异常点的响,进而理解为模型的预测能力越弱,分类的可信度越低。

目标函数

在这里插入图片描述

函数与几何间隔

指的就是我们的分隔带
在这里插入图片描述
将图中五角星所代表的正例样本用1表示,将实心圆所代表的负例样本用-1表示;实体加粗直线表示某条分割面;两条虚线分别表示因变量y取值为+1和-1时的情况,它们与分割面平行。
不管是五角星代表的样本点,还是实心圆代表的样本点,这些点均落在两条虚线以及虚线之外,则说明这些点带入到方程w’x+b所得的绝对值一定大于等于1。
进而可以说明如果点对应的取值越小于-1,该样本为负例的可能性越高;点对应的取值越大于+1,样本为正例的可能性越高。
在这里插入图片描述
对于几何间隔,就是对于距离的公式是如何来的。
在这里插入图片描述
||w||二范式也就是平方开根,也就是距离公式。

线性可分SVM模型

目标函数

通过函数间隔、距离公式可得
在这里插入图片描述
在这里插入图片描述

拉格朗日乘子法:
在这里插入图片描述
我们通过拉格朗日乘子法,来简化,得到基于拉格朗日乘子法的目标函数。

在这里插入图片描述

在这里插入图片描述
紧接着我们对目标函数求解:

  1. 首先求偏导,令为0
    在这里插入图片描述
  2. 将导函数反代之目标函数
    将上面得出的w=Σαiyixi带入
    在这里插入图片描述
    最后得
    在这里插入图片描述

函数代码

LinearSVC(tol=0.0001, C=1.0, multi_class=‘ovr’, fit_intercept=True, intercept_scaling=1, class_weight=None, max_iter=1000)
tol:用于指定SVM模型迭代的收敛条件,默认为0.0001
C:用于指定目标函数中松弛因子的惩罚系数值,默认为1
fit_intercept:bool类型参数,是否拟合线性“超平面”的截距项,默认为True
intercept_scaling:当参数fit_intercept为True时,该参数有效,通过给参数传递一个浮点值,就相当于在自变量X矩阵中添加一常数列,默认该参数值为1
class_weight:用于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;如果为字符串’balanced’,则每个分类的权重与实际样本中的比例成反比,当各分类存在严重不平衡时,设置为’balanced’会比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最大迭代次数,默认为1000

非线性可分SVM模型

在这里插入图片描述
我们在三维空间去找超平面

目标函数

对于非线性SVM模型而言,需要经过两个步骤,一个是将原始空间中的样本点映射到高维的新空间中,另一个是在新空间中寻找一个用于识别各类别样本点线性“超平面”。
假设原始空间中的样本点为x,将样本通过某种转换fai(x)映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
在这里插入图片描述
对其求解:
在这里插入图片描述
其中核函数是:
在这里插入图片描述
线性核函数:
在这里插入图片描述
多项式核函数:
在这里插入图片描述
高斯核函数:
在这里插入图片描述
Sigmoid核函数:
在这里插入图片描述

函数代码

SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’, coef0=0.0, tol=0.001, class_weight=None, verbose=False, max_iter=-1, random_state=None)
C:用于指定目标函数中松弛因子的惩罚系数值,默认为1(惩罚系数越大,模型越精准,但是需要消耗得运算成本会加高)
kernel:用于指定SVM模型的核函数,该参数如果为’linear’,就表示线性核函数;如果为’poly’,就表示多项式核函数,核函数中的r和p值分别使用degree参数和gamma参数指定;如果为’rbf’,表示径向基核函数(也叫高斯核函数),核函数中的r参数值仍然通过gamma参数指定;如果为’sigmoid’,表示Sigmoid核函数,核函数中的r参数值需要通过gamma参数指定;如果为’precomputed’,表示计算一个核矩阵
degree:用于指定多项式核函数中的p参数值
gamma:用于指定多项式核函数或径向基核函数或Sigmoid核函数中的r参数值
coef0:用于指定多项式核函数或Sigmoid核函数中的r参数值
tol:用于指定SVM模型迭代的收敛条件,默认为0.001
class_weight:用于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;如果为字符串’balanced’,则每个分类的权重与实际样本中的比例成反比,当各分类存在严重不平衡时,设置为’balanced’会比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最大迭代次数,默认为-1,表示不限制迭代次数

示例

手写体字母识别

  1. 导入功能包
# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics # 模型度量方法
  1. 查看数据
# 读取外部数据
letters = pd.read_csv(r'D:\pythonProject\data\letterdata.csv')
# 数据前5行
letters.head()

在这里插入图片描述

  1. 处理数据
    拆分数据集
# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter, test_size = 0.25, random_state = 1234)
  1. 模型拟合与预测
    首先来看看线性SVM,SVM有个缺点就是计算特别慢,对于大数据来说现在是不合适用此模型的。
# 选择线性可分SVM模型
linear_svc = svm.LinearSVC()
# 模型在训练数据集上的拟合
linear_svc.fit(X_train,y_train)
# 模型在测试集上的预测
pred_linear_svc = linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)

输出:0.4412
能看到准确率是很低的,紧接着我们用高斯SVM

# 选择非线性SVM模型
nolinear_svc = svm.SVC(kernel='rbf')
# 模型在训练数据集上的拟合
nolinear_svc.fit(X_train,y_train)
# 模型在测试集上的预测
pred_svc = nolinear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)

输出:0.9238
可以看到效果好了很多。

森林火灾面积预测

  1. 导入功能包
# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics # 模型度量方法
  1. 查看数据
# 读取外部数据
forestfires = pd.read_csv(r'D:\pythonProject\data\forestfires.csv')
# 数据前5行
forestfires.head()

在这里插入图片描述

  1. 处理数据
# 我们认为天不是影响因素所以删除day变量
forestfires.drop('day',axis = 1, inplace = True)
# 将月份作数值化处理
forestfires.month = pd.factorize(forestfires.month)[0]
# 预览数据前5行
forestfires.head()

在这里插入图片描述
紧接着查看数据分布,是否有什么规律

# 导入第三方模块
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm
# 绘制森林烧毁面积的直方图
sns.distplot(forestfires.area, bins = 50, kde = True, fit = norm, hist_kws = {'color':'steelblue'}, kde_kws = {'color':'red', 'label':'Kernel Density'}, fit_kws = {'color':'black','label':'Nomal', 'linestyle':'--'})
# 显示图例
plt.legend()
# 显示图形
plt.show()

在这里插入图片描述

发现数据是极端右偏,偏态式分布,那么我们就要对其进行一个变化,然后计算

  1. 数学变换——对数变换,并作标准化处理
# 导入第三方模块
from sklearn import preprocessing
import numpy as np
from sklearn import neighbors
# 对area变量作对数变换
y = np.log1p(forestfires.area)
# 将X变量作标准化处理
predictors = forestfires.columns[:-1]
X = preprocessing.scale(forestfires[predictors])
# 将数据拆分为训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)
  1. 拟合与预测
# 构建默认参数的SVM回归模型
svr = svm.SVR()
# 模型在训练数据集上的拟合
svr.fit(X_train,y_train)
# 模型在测试上的预测
pred_svr = svr.predict(X_test)
# 计算模型的MSE
metrics.mean_squared_error(y_test,pred_svr)	

误差项得:1.9268192310372871

但这不一定是最好的,我们可以采用网格搜索法,通过自己给定的不同的参数,通过各种组合自己找到最佳的

# 使用网格搜索法,选择SVM回归中的最佳C值、epsilon值和gamma值
epsilon = np.arange(0.1,1.5,0.2)
C= np.arange(100,1000,200)  
gamma = np.arange(0.001,0.01,0.002)
parameters = {'epsilon':epsilon,'C':C,'gamma':gamma}
grid_svr = model_selection.GridSearchCV(estimator = svm.SVR(max_iter=10000),param_grid =parameters, scoring='neg_mean_squared_error',cv=5,verbose =1, n_jobs=2)
# 模型在训练数据集上的拟合
grid_svr.fit(X_train,y_train)
# 返回交叉验证后的最佳参数值
print(grid_svr.best_params_, grid_svr.best_score_)

输出:
Fitting 5 folds for each of 175 candidates, totalling 875 fits
{‘C’: 300, ‘epsilon’: 1.1000000000000003, ‘gamma’: 0.001} -1.9946668196316562
也就是拟合5重,有175种组合,总计完成875次流程计算,得到最佳组合
对比下我们改变后的预测

# 模型在测试集上的预测
pred_grid_svr = grid_svr.predict(X_test)
# 计算模型在测试集上的MSE值
metrics.mean_squared_error(y_test,pred_grid_svr)

输出:
1.745501223882639

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

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

相关文章

HTML标签简明通俗教程

HTML标签简明通俗教程 基本知识 HTML:是超文本标记语言(Hyper Text Markup Language)的缩写,它是用于创建网页的标准标记语言。标签是构成HTML文档的基本单位。 【HTML中的标签(tag)和元素(e…

虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y

新品发布!HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y! PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL,虹科ELPRO提供了一系列高品质的蓝牙(BLE)多用途…

解决Element-ui el-tree数据与显示不对应的问题

如图&#xff1a; 后端返回的权限列表&#xff0c;并没有列表这一项&#xff0c;但是由于父节点 版本打包 为选中状态&#xff0c;导致所有子节点都为选中状态。 实现代码如下&#xff1a; <el-treeref"tree":data"records"show-checkboxnode-key&quo…

BCArchive加密工具实测分享:为何我觉得它很实用?

前言 你是不是经常有这样的烦恼&#xff1a;重要的文件、私密的照片、敏感的资料&#xff0c;总是担心会不小心泄露出去&#xff1f;哎呀&#xff0c;别担心&#xff0c;别担心&#xff0c;我今天要介绍的这款软件&#xff0c;简直就是守护你数据安全的超级英雄&#xff01; 在…

基于Java的流浪动物救助系统---附源码16974

目 录 摘要 1 绪论 1.1 研究背景及意义 1.2 开发现状 1.3论文结构与章节安排 2 流浪动物救助系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析…

webrtc一对一视频通话功能实现

项目效果 实现原理 关于原理我就不做说明&#xff0c;直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器&#xff1a;Ubuntu24.04搭建turn服务器 mkcert的安装和使用&#xff1a;配置https访问 必须使用https协议&#xff0c; 由于浏览器的安全策略导致的&am…

四数相加2 | LeetCode-454 | 哈希集合 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️思路&#xff1a;四数相加 > 两数相加 &#x1f4cc;LeetCode链接&#xff1a;454. 四数相加 II 文章目录 1.题目描述&#x1f34e;2.题解&#x…

php word文档中写入数据

<?phpnamespace app\api\controller;/*** 首页接口*/ class Coursess extends Api {//签订合同public function contract(){$id $this->request->post(id);$qian $this->request->post(qian);if (!$id || !$qian) {$this->error(__(Invalid parameters));…

算法——动态规划:0/1 背包问题

文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组6.1 两行实现6.2 单行实现6.3 优缺点 三、总结 一、问题描述 问题的抽象&#xff1a;给定 n n n 种物品和一个背包&#xff0c;第 i i i 个物品的体积为 c i c_i …

k8s分布式存储-ceph

文章目录 Cephdeploy-ceph部署1.系统环境初始化1.1 修改主机名&#xff0c;DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 **创建** ceph **集群部署用户** cephadmin1.6分发密钥 2. ceph部署2.1 **安装** ceph 部署工具2.2 **初始化** mon **节点**…

子串 前缀和 | Java | (hot100) 力扣560. 和为K的子数组

560. 和为K的子数组 暴力法&#xff08;连暴力法都没想出来……&#xff09; class Solution {public int subarraySum(int[] nums, int k) {int count0;int len nums.length;for(int i0; i<len; i) {int sum0;for(int ji; j<len; j) {sumnums[j];if(sum k) {count;}…

mysql注入-字符编码技巧

一、环境搭建 创建数据表 CREATE TABLE mysql_Bian_Man (id int(10) unsigned NOT NULL AUTO_INCREMENT,username varchar(255) COLLATE latin1_general_ci NOT NULL,password varchar(255) COLLATE latin1_general_ci NOT NULL,PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREME…

Redis 缓存预热、雪崩、穿透、击穿

缓存预热 缓存预热是什么 缓存预热就是系统上线后&#xff0c;提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候&#xff0c;先查询数据库&#xff0c;然后再将数据缓存的问题&#xff01;用户直接查询事先被预热的缓存数据&#xff01;解决方案 使用 PostConstr…

LeetCode旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3]…

opencv实战项目七:帧差法获取运动车辆蒙版

文章目录 一、简介二、实现方案三、算法实现步骤3.1 取出视频中间帧3.2 帧差法形成运动蒙版&#xff1a; 四、代码整体实现五&#xff1a;效果 一、简介 在智能交通系统中&#xff0c;车辆检测是一项重要的技术&#xff0c;而通常情况下一张图片中无用信息过多会带来额外的计算…

Linux--C语言之循环结构

文章目录 一、循环结构&#xff08;一&#xff09;循环的概念&#xff08;二&#xff09;循环的类型&#xff08;三&#xff09;循环的构成&#xff08;四&#xff09;当型循环的实现while死循环 &#xff08;五&#xff09;for...总结死循环 &#xff08;七&#xff09;循环实…

机器学习——逻辑回归(学习笔记)

目录 一、认识逻辑回归 二、二元逻辑回归&#xff08;LogisticRegression&#xff09; 1. 损失函数 2. 正则化 3. 梯度下降 4. 二元回归与多元回归 三、sklearn中的逻辑回归&#xff08;自查&#xff09; 1. 分类 2. 参数列表 3. 属性列表 4. 接口列表 四、逻辑回归…

大厂面试题分享第一期

大厂面试题分享第一期 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制&#xff0c;分别是AOF&#xff08;Append-Only File&a…

Python 数据可视化,怎么选出合适数据的图表

数据可视化最佳实践 1. 引言&#xff1a;为什么数据可视化最佳实践很重要 数据可视化是数据分析和决策过程中不可或缺的一部分。通过有效的可视化&#xff0c;复杂的数据可以转化为易于理解的信息&#xff0c;从而帮助观众快速做出正确的判断。然而&#xff0c;糟糕的可视化可…

单片机IO灌入5V电压导致其他IO电压测量到大于供电电压问题

最近用GD32F103RCT6做项目&#xff0c;用了3个485收发器&#xff0c;都是直接接在单片机IO上的。 485收发器是5V供电的&#xff0c;这个时候就出现5V电平和3.3V电平兼容的问题了。 一开始只用了PA10、PC11这两个串口&#xff0c;他俩是兼容5V的&#xff0c;从手册可以看出IO最…