数据挖掘领域十大经典算法之—SVM算法(超详细附代码)

article/2025/10/19 22:19:19

相关文章:

  • 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
  • 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码)
  • 数据挖掘领域十大经典算法之—Apriori算法
  • 数据挖掘领域十大经典算法之—EM算法
  • 数据挖掘领域十大经典算法之—PageRank算法
  • 数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)
  • 数据挖掘领域十大经典算法之—K-邻近算法/kNN(超详细附代码)
  • 数据挖掘领域十大经典算法之—朴素贝叶斯算法(超详细附代码)
  • 数据挖掘领域十大经典算法之—CART算法(超详细附代码)

简介

SVM(Support Vector Machine)中文名为支持向量机,是常见的一种判别方法。在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别、分类以及回归分析。

相关概念

分类器:分类器就是给定一个样本的数据,判定这个样本属于哪个类别的算法。例如在股票涨跌预测中,我们认为前一天的交易量和收盘价对于第二天的涨跌是有影响的,那么分类器就是通过样本的交易量和收盘价预测第二天的涨跌情况的算法。

特征:在分类问题中,输入到分类器中的数据叫做特征。以上面的股票涨跌预测问题为例,特征就是前一天的交易量和收盘价。

线性分类器:线性分类器是分类器中的一种,就是判定分类结果的根据是通过特征的线性组合得到的,不能通过特征的非线性运算结果作为判定根据。还以上面的股票涨跌预测问题为例,判断的依据只能是前一天的交易量和收盘价的线性组合,不能将交易量和收盘价进行开方,平方等运算。

线性分类器起源

在实际应用中,我们往往遇到这样的问题:给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。

怎么分呢?把整个空间劈成两半呗(让我想到了盘古)。用二维空间举个例子,如上图所示,我们用一条直线把空间切割开来,直线左边的点属于类别-1(用三角表示),直线右边的点属于类别1(用方块表示)。

如果用数学语言呢,就是这样的:空间是由X1和X2组成的二维空间,直线的方程是X1+X2 = 1,用向量符号表示即为[1,1]^{T}[X1,X2]-1=0 。点x在直线左边的意思是指,当把x放入方程左边,计算结果小于0。同理,在右边就是把x放入方程左边,计算出的结果大于0。都是高中数学知识。

在二维空间中,用一条直线就把空间分割开了:
这里写图片描述
在三维空间中呢,需要用一个平面把空间切成两半,对应的方程是X1+X2+X3=1,也就是[1,1,1]^{T}[X1,X2,X3]-1=0 。
这里写图片描述
在高维(n>3)空间呢?就需要用到n-1维的超平面将空间切割开了。那么抽象的归纳下:

如果用x表示数据点,用y表示类别(y取1或者-1,代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),把空间切割开,这个超平面的方程可以表示为(W^{T}中的T代表转置):
W^{T}X+b=0

感知器模型和逻辑回归:

常见的线性分类器有感知器模型和逻辑回归。上一节举出的例子是感知器模型,直接给你分好类。有时候,我们除了要知道分类器对于新数据的分类结果,还希望知道分类器对于这次分类的成功概率。逻辑回归就可以做这件事情。

逻辑回归(虽然称作回归,但是不是一个回归方法,却是一个分类算法。很蛋疼的说)将线性分类器的超平面方程计算结果通过logistic函数从正负无穷映射到0到1。这样,映射的结果就可以认为是分类器将x判定为类别1的概率,从而指导后面的学习过程。

举个例子,看天气预报,用感知器的天气预报只会告诉你明天要下雨(y=1),或者明天不下雨(y=-1);而用了逻辑回归的天气预报就能告诉你明天有90%的概率要下雨,10%的概率不下雨。

逻辑回归的公式是g(z)=\frac{1}{1+e^{-z}} ,图像大概长这个样子:
这里写图片描述
怎么用呢?比如感知器模型中,将特征代入判别方程中,如果得到的值是-3,我们可以判定类别是-1(因为-3<0)。而逻辑回归中呢,将-3代入g(z),我们就知道,该数据属于类别1的概率是0.05(近似数值,谢谢),那么属于类别-1的概率就是1 – 0.05 = 0.95。也就是用概率的观点描述这个事情。

支持向量机 VS 感知器和逻辑回归

根据上面的讨论,我们知道了在多维空间下,用一个超平面就把数据分为了两类。这个超平面我们叫它为分离超平面。但是这个分离超平面可以有很多个,那么用哪个呢?
这里写图片描述
上图中,对于目前的训练数据,绿色和黑色的直线(二维特征空间,分离超平面就是直线啦)都可以很可以很好的进行分类。但是,通过已知数据建立分离超平面的目的,是为了对于未知数据进行分类的。在下图中,蓝色的星星图案就是新加入的真实数据。
这里写图片描述
这时候我们就可以看出不同的分离超平面的选择对于分类效果的影响了。有的绿线会将三个点都划归蓝色圆圈,有的绿线会将三个点都划归红色正方形。

那么绿线和黑线留下谁?我们认为,已有的训练数据中,每个元素距离分离超平面都有一个距离。在添加超平面的时候,尽可能的使最靠近分离超平面的那个元素与超平面的距离变大。这样,加入新的数据的时候,分的准的概率会最大化。感知器模型和逻辑回归都不能很好的完成这个工作,该我们的支持向量机(support vector machine,SVM)出场了。

首先,SVM将函数间隔(\left| W^{T}X+b \right| ,将特征值代入分离超平面的方程中,得到的绝对值)归一化,归一化的目的是除掉取值尺度的影响;其次,对所有元素求到超平面的距离,(这个距离是\frac{\left| W^{T}X+b \right| }{\left| W \right| } ,也就是几何间隔)。给定一个超平面P,所有样本距离超平面P的距离可以记为d_{ij}=\frac{\left| W^{T}X+b \right| }{\left| W \right| } ,这其中最小的距离记为D_{P},SVM的作用就是找到D_{P}最大的超平面。

可以看出,大部分数据对于分离超平面都没有作用,能决定分离超平面的,只是已知的训练数据中很小的一部分。这与逻辑回归有非常大的区别。上图中,决定黑色的这条最优分离超平面的数据只有下方的两个红色的数据点和上方的一个蓝色的数据点。这些对于分离超平面有着非常强大影响的数据点也被称为支持向量(看没看到,这就是传说中的支持向量啦,原来如此)。

引入黑科技-核函数

上面说的都是在原始特征的维度上,能直接找到一条分离超平面将数据完美的分成两类的情况。但如果找不到呢?

比如,原始的输入向量是一维的,0< x <1的类别是1,其他情况记做-1。这样的情况是不可能在1维空间中找到分离超平面的(一维空间中的分离超平面是一个点,aX+b=0)。你用一个点切一下试试?
这里写图片描述
这就要说到SVM的黑科技—核函数技巧。核函数可以将原始特征映射到另一个高维特征空间中,解决原始空间的线性不可分问题。

继续刚才那个数轴。
这里写图片描述
如果我们将原始的一维特征空间映射到二维特征空间X^{2}和x,那么就可以找到分离超平面X^{2}-X=0。当X^{2}-X<0的时候,就可以判别为类别1,当X^{2}-X>0 的时候,就可以判别为类别0。如下图:
这里写图片描述
再将X^2-X=0映射回原始的特征空间,就可以知道在0和1之间的实例类别是1,剩下空间上(小于0和大于1)的实例类别都是0啦。
这里写图片描述
利用特征映射,就可以将低维空间中的线性不可分问题解决了。是不是很神奇,这就是特征映射的牛逼之处了。核函数除了能够完成特征映射,而且还能把特征映射之后的内积结果直接返回,大幅度降低了简化了工作,这就是为啥采用核函数的原因。

SVM三种模型

SVM有三种模型,由简至繁为

  • 当训练数据训练可分时,通过硬间隔最大化,可学习到硬间隔支持向量机,又叫线性可分支持向量机
  • 当训练数据训练近似可分时,通过软间隔最大化,可学习到软间隔支持向量机,又叫线性支持向量机
  • 当训练数据训练不可分时,通过软间隔最大化及核技巧(kernel trick),可学习到非线性支持向量机

代码

代码已在github上实现,这里也贴出来

# encoding=utf-8import timeimport numpy as np
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import datasets
from sklearn import svmif __name__ == '__main__':print('prepare datasets...')# Iris数据集# iris=datasets.load_iris()# features=iris.data# labels=iris.target# MINST数据集raw_data = pd.read_csv('../data/train_binary.csv', header=0)  # 读取csv数据,并将第一行视为表头,返回DataFrame类型data = raw_data.valuesfeatures = data[::, 1::]labels = data[::, 0]    # 选取33%数据作为测试集,剩余为训练集train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)time_2=time.time()print('Start training...')clf = svm.SVC()  # svm class   clf.fit(train_features, train_labels)  # training the svc model time_3 = time.time()print('training cost %f seconds' % (time_3 - time_2))print('Start predicting...')test_predict=clf.predict(test_features)time_4 = time.time()print('predicting cost %f seconds' % (time_4 - time_3))score = accuracy_score(test_labels, test_predict)
print("The accruacy score is %f" % score)

测试数据集为经过二分类处理后的MNIST数据集,获取地址train_binary.csv

运行结果

这里写图片描述


http://chatgpt.dhexx.cn/article/SrA5PZ7I.shtml

相关文章

数据挖掘十大算法--Apriori算法

一、Apriori 算法概述 Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法&#xff0c;它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的。它使用一种称作逐层搜索的迭代方法&#xff0c;k- 项集用于探索&#xff08;k1&#xff09;- 项集。首先&#xff0c…

数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)

相关文章&#xff1a; 数据挖掘领域十大经典算法之—C4.5算法&#xff08;超详细附代码&#xff09;数据挖掘领域十大经典算法之—K-Means算法&#xff08;超详细附代码&#xff09;数据挖掘领域十大经典算法之—SVM算法&#xff08;超详细附代码&#xff09;数据挖掘领域十大经…

数据挖掘十大经典算法(包括各自优缺点 / 适用数据场景)

本文主要分析皆来自其他资料&#xff0c;借用较为权威的总结来对我已经学习的这些经典算法做一个极为精简的概述&#xff08;根据自身经验有一定修改&#xff09;&#xff0c;另外同时附上机器学习实战中作者对各种算法的评价。另外机器学习实战这本书是本人看了这么多书籍或者…

一文弄懂数据挖掘的十大算法,数据挖掘算法原理讲解

​一个优秀的数据分析师不仅要掌握基本的统计、数据库、数据分析方法、思维、数据分析工具和技能&#xff0c;还要掌握一些数据挖掘的思路&#xff0c;帮助我们挖掘出有价值的数据&#xff0c;这也是数据分析专家和一般数据分析师的差距之一。 数据挖掘主要分为三类&#xff1a…

数据挖掘领域十大经典算法

一、什么是数据挖掘&#xff1f; 数据挖掘是人工智能和数据库领域研究的热点问题&#xff0c;所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息的非平凡过程。数据挖掘是一种决策支持过程&#xff0c;它主要基于人工智能、机器学习、模式识别、…

数据挖掘的10大算法

一个优秀的数据分析师,除了要掌握基本的统计学、数据库、数据分析方法、思维、数据分析工具技能之外,还需要掌握一些数据挖掘的思想,帮助我们挖掘出有价值的数据,这也是数据分析专家和一般数据分析师的差距之一。 数据挖掘主要分为分类算法,聚类算法和关联规则三大类,这…

数据挖掘十大经典算法,你都知道哪些?

当前时代大数据炙手可热&#xff0c;数据挖掘也是人人有所耳闻&#xff0c;但是关于数据挖掘更具体的算法&#xff0c;外行人了解的就少之甚少了。 数据挖掘主要分为分类算法&#xff0c;聚类算法和关联规则三大类&#xff0c;这三类基本上涵盖了目前商业市场对算法的所有需求…

Vim编辑器(二)

Vim编辑器&#xff08;二&#xff09; 一、Vim编辑器概述1、vi编辑器2、vi与Vim编辑器 二、Vim编辑器的三种模式&#xff08;重点&#xff09;1、三种模式2、三种模式之间的关系&#xff1a;3、Vim打开文件的四种方式 三、命令模式1、光标移动① 光标移动到行首与行尾② 翻屏③…

Vim编辑器使用

什么是vim? Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则可以说…

Linux之vim编辑器的使用

目录 一、vim是什么&#xff1f; 试验1&#xff1a; 二.命令模式继承用法&#xff1a; vim命令模式的快捷键: 光标移动: vim文本复制相关操作: vim文本编辑操作: 三.末行模式命令用法 部分快捷键&#xff1a; 四.vim编辑器的配置原理 一、vim是什么&#xff1f; vi…

linux之《vim编辑器》

目录 一.vim的基本概念 ​编辑 命令模式&#xff08;Normal mode&#xff09; 插入模式&#xff08;Insert mode&#xff09; 末行模式&#xff08;last line mode&#xff09; 三者的转换图 二.vim的基本操作 1. 命令模式 2. 插入模式 3. 尾行模式 三. 简单vim配置…

Linux中vi与vim编辑器

初始化的Linux虚拟机是没有vim编辑器的&#xff0c;需要手动下载安装&#xff1a; vim安装命令&#xff1a; yum -y install vim vi profile 打开文件&#xff0c;并将光标置于第8行 vi 8 profile 打开最后一行 vi profile 按n查找下一个&#xff0c;按N查找上一个 打开…

Vim编辑器使用技巧

此文章适合学生、泛linux领域开发运维人员、linux爱好者阅读&#xff0c;希望通过此文章可以帮助大家更轻松的使用vim编辑器。 vim编辑器是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。vim是自由软件。vim普遍被推崇为…

编辑器之神——vim编辑器

编辑器之神——vim编辑器 一、vi介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;类似于windows系统下的notepad&#xff08;记事本&#xff09;编辑器&#xff0c;由于在Unix及Linux系统的任何版本&#xff0c;Vi编辑器是完全相同的&#xff0c;因此可以在其他…

Linux之如何使用Vim编辑器

什么是Vim编辑器 Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 Linux中必须要会使用Vim&#xff08;查看内容&#xff0c;编辑内容&#xff0c;保存内容&#xff09; 简单的来说&#xff0c; …

vim编辑器详细教程

目录 一&#xff0c;第一讲 第一节&#xff1a; 移动光标 第二节 vim的进入和退出 第三节 文本编辑之删除 第四节 文本编辑之插入 第五节 文本编辑之添加 第六节 编辑文件 第一讲小结 二&#xff0c;第二讲 第一节 删除类命令 第二节 更多删除类命令 第三节 关于命令和对象…

vim编辑器使用教程

文章目录 前言一、vim 的三种工作模式二、vim 基本操作1、编辑2、复制粘贴3、撤销4、跳转5、查找和替换6、自动缩进7、分屏8、其他 三、vim 配置文件 前言 vim 是 Linux 系统内置的「文本编辑器」&#xff0c;用于查看或编辑文件的内容&#xff0c;学会使用 vim 编辑器&#x…

vi和vim编辑器

《Linux从入门到精通》 第一章 macOS Linux_CentOS7.6安装 第二章 网络连接的三种模式 第三章 VMware中的虚拟机克隆 第四章 虚拟机快照 第五章 Linux的目录结构 文章目录 《Linux从入门到精通》前言一、vi编辑器简介二、vim基本使用1.一般模式2.编辑模式3.指令模式4.vim配置文…

Linux Vim编辑器使用

1、基本介绍 linux系统会内置 vi 文本编辑器 Vim具有程序编辑的能力&#xff0c;可以看作是Vi的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。代码补完、编译即错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 …

在Windows下安装Vim编辑器

在windows下安装vim其实非常简单&#xff0c;不需要配置什么配置文件之类的。。。就几个步骤搞定的事情非要搞得这么麻烦&#xff0c;真的服了。。。 首先&#xff0c;先去vim的github下载vimPC版 要是你不想麻烦的去找&#xff0c;请直接点击链接直达&#xff1a; 32位:githu…