支持向量机也是一种既可以处理分类问题,也可以处理回归问题的算法。
关于支持向量机在回归问题上的应用,请参考:TODO

支持向量机分类广泛应用于图像识别、文本分类、生物信息学(例如基因分类)、手写数字识别等领域。

1. 算法概述

支持向量机的主要思想是找到一个超平面,将不同类别的样本最大化地分隔开。
超平面的位置由支持向量决定,它们是离分隔边界最近的数据点。
对于二分类问题,SVM寻找一个超平面,使得正例和支持向量到超平面的距离之和等于反例和支持向量到超平面的距离之和。
如果这个等式不成立,SVM将寻找一个更远离等式中不利样本的超平面。

下面的示例,演示了支持向量机分类算法在图像识别上的应用。

2. 创建样本数据

这次的样本使用的是scikit-learn自带的手写数字数据集

import matplotlib.pyplot as plt
from sklearn import datasets # 加载手写数据集
data = datasets.load_digits() _, axes = plt.subplots(nrows=2, ncols=4, figsize=(10, 6))
for ax, image, label in zip(np.append(axes[0], axes[1]), data.images, data.target):
ax.set_axis_off()
ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
ax.set_title("目标值: {}".format(label))


这里显示了其中的几个手写数字,这个数据集总共有大约1700多个手写数字。

3. 模型训练

样本数据中,手写数字的图片存储为一个 8x8 的二维数组。
比如:

data.images[0]

# 运行结果
array([[ 0., 0., 5., 13., 9., 1., 0., 0.],
[ 0., 0., 13., 15., 10., 15., 5., 0.],
[ 0., 3., 15., 2., 0., 11., 8., 0.],
[ 0., 4., 12., 0., 0., 8., 8., 0.],
[ 0., 5., 8., 0., 0., 9., 8., 0.],
[ 0., 4., 11., 0., 1., 12., 7., 0.],
[ 0., 2., 14., 5., 10., 12., 0., 0.],
[ 0., 0., 6., 13., 10., 0., 0., 0.]])

所以,在分割训练集测试集之前,我们需要先将手写数字的的存储格式从 8x8二维数组转换为 64x1一维数组

from sklearn.model_selection import train_test_split

n_samples = len(data.images)
X = data.images.reshape((n_samples, -1))
y = data.target # 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

按照9:1的比例来划分训练集和测试集。

然后用scikit-learn中的SVC模型来训练样本:

from sklearn.svm import SVC

# 定义
reg = SVC() # 训练模型
reg.fit(X_train, y_train)

模型的训练效果:

# 在测试集上进行预测
y_pred = reg.predict(X_test) correct_pred = np.sum(y_pred == y_test)
print("预测正确率:{:.2f}%".format(correct_pred / len(y_pred) * 100)) # 运行效果
预测正确率:98.89%

正确率非常高,下面我们看看没识别出来的手写数字是哪些。

wrong_pred = []
for i in range(len(y_pred)):
if y_pred[i] != y_test[i]:
wrong_pred.append(i) print(wrong_pred) # 运行效果
[156, 158]

在测试集中,只有两个手写数字识别错了。

我面看看识别错的2个手写数字是什么样的:

_, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 3))
for i in range(2):
idx = wrong_pred[i]
image = X_test[idx].reshape(8, 8)
axes[i].set_axis_off()
axes[i].imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
axes[i].set_title("预测值({}) 目标值({})".format(y_pred[idx], y_test[idx]))


可以看出,即使人眼去识别,这两个手写数字也不太容易识别。

4. 总结

支持向量机分类算法的优势有:

  1. 有效处理高维数据:对高维数据非常有效,即使在数据维度超过样本数量的情况下也能工作得很好。
  2. 高效:只使用一部分训练数据(即支持向量)来做决策,这使得算法更加内存高效。
  3. 稳定性较好:由于其决策边界取决于支持向量而不是所有的数据点,因此模型的稳定性较好,对噪声和异常值的敏感度较低。

它的劣势主要有:

  1. 对参数和核函数敏感:性能高度依赖于参数设置(如惩罚参数C和核函数的选择)。如果参数选择不当,可能会导致过拟合或欠拟合。
  2. 难以解释:不像决策树那样直观,难以理解和解释。
  3. 处理大规模数据时速度较慢:训练过程涉及到二次规划问题,需要使用复杂的优化算法,因此在处理大规模数据时可能较慢。

【scikit-learn基础】--『监督学习』之 支持向量机分类的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. Python机器学习(基础篇---监督学习(支持向量机))

    支持向量机(分类) 支持向量机分类器根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个.我们会发现决定其直线位置的样本并不是所有训练数据,而是其中的两个空间间隔最小的两个不同类别的数据点,而我们 ...

  5. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  6. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  7. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  8. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  9. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  10. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

随机推荐

  1. Python基础——垃圾回收、格式化输入输出、基本运算符、流程控制

    文章目录 每日测验 垃圾回收机制详解(了解) 引用计数 标记清除 分代回收 与用户交互 接收用户的输入 字符串的格式化输出 填充与格式化 基本运算符 算数运算符 比较运算符: >.>=.& ...

  2. 【ZJCTF 2019】NiZhuanSiWei

    [ZJCTF 2019]NiZhuanSiWei 收获 file_get_contents绕过 include联想伪协议 熟悉__tostring魔术方法的使用 题目 代码: <?php $te ...

  3. 9.12 多校联测 Day2 总结

    还是有不少不该挂的分. 开考看了 T1 约 40min 仍然毫无思路,试着推 mod=2 无果.吸取昨天经验教训,赶紧扔掉看 T2. 在 9:00 想到了 dp 的可能性,苦于设计不出状态.9:20 ...

  4. C函数指针和回调函数

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: t ...

  5. JavaScript 语法:流程控制语句

    作者:WangMin 格言:努力做好自己喜欢的每一件事 JavaScript流程控制语句的三种基本结构:顺序结构,选择结构,循环结构 顺序结构 从上到下执行的代码就是顺序结构,程序默认就是由上到下顺序 ...

  6. Instagram 早期技术架构

    哈喽大家好,我是咸鱼 想必大家都听说过 Instagram ,它是全球最受欢迎的社交媒体平台之一,拥有数十亿的活跃用户 Instagram 诞生于 2010 年,上线一周就坐拥 10 万注册用户,一年 ...

  7. 自定义Graph Component:1-开发指南

      可以使用自定义NLU组件和策略扩展Rasa,本文提供了如何开发自己的自定义Graph Component指南.   Rasa提供各种开箱即用的NLU组件和策略.可以使用自定义Graph Compo ...

  8. 记一次 .NET 某券商论坛系统 卡死分析

    一:背景 1. 讲故事 前几个月有位朋友找到我,说他们的的web程序没有响应了,而且监控发现线程数特别高,内存也特别大,让我帮忙看一下怎么回事,现在回过头来几经波折,回味价值太浓了. 二:程序到底经历 ...

  9. 微服务系列-基于Spring Cloud Eureka进行服务的注册与消费

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 在之前的几个教程中,我们学了: 使用 RestTemplate 的 Spring Boot 微服务通信示例 使用 WebC ...

  10. vue+element-ui小笔记

    1.图片加载失败,给默认图 2.form表单中,输入框加回车事件,页面刷新,如何解决? 3.使用在线主题生成工具,修改element自定义主题色 1.图片加载失败,给默认图,两种解决方法: 方法一: ...