支持向量机

支持向量机是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大),当数据集较小时,使用支持向量机进行分类非常有效。支持向量机是最好的现成分类器之一,这里是指分类器不加修改就可以使用的。

在对原始数据分类的过程中,可能无法使用线性方法实现分割,支持向量机在分类时,把无法线性分割的数据映射到高维空间,然后再高维空间找到分类最优的线性分类器。

理论基础

又来了。。简单介绍一下基本原理

  1. 分类
    企业通过笔试,面使的形式招聘员工,分为A级,B级,图中横坐标是笔试成绩,纵坐标是面试成绩,右上角的圆点表示A 级,左下角的就是B级。

    公司希望找收到的都是A 类,关键是如果根据两个成绩确定哪个员工可能是未来的A类员工。虽然可以将成绩标准定的很高,但这样会失去一些优秀员工。所以合理指定成绩标准是很重要的
  2. 分类器

再上图中,用于划分不同类别的直线就是分类器。构造分类器时,找到最优分类器就非常重要。

上图中,右上和右下的分类器都偏向了某一个分类,左下的分类器实现了均分,左下的分类器尽量让两个分类离自己一样远,这样就为每个分类都预留了等量的扩展空间,即使有新的靠近边界的点进来,也可以按照位置划分到对应的分类内。

在已有数据中,找到离分类器最近的点,确保他们离分类器尽可能的远。 这里,离分类器最近的点到分类器的距离称为间隔,我们希望间隔尽可能的大,这样分类器在处理数据时,就会更加准确**。离分类器最近的哪些点就叫支持向量**,这些支持向量决定了分类器所在的位置。

  1. 将不可分变为可分
    上例是非常简单的,用一条直线(线性分类器)就可以完成划分,现实中大多数问题就更加复杂,支持向量机会将不那么容易分类的数据通过函数映射变为可分类的。

例如:豌豆和小米混起来,如果分开他们直线肯定就不行,可以使用直径合适的筛子。这个筛子就是映射操作,可以将豌豆小米有效的分离。支持向量机处理数据时,如果在低纬空间内无法完成分类,就会自动将数据映射到高维空间,使之变成线性可分的。简单来说就是对当前数据进行函数映射操作。


支持向量机可以通过核函数有效降低计算复杂度。

  1. 总结
    实际上支持向量机可以处理任何维度的数据,在不同维度下,支持向量机都会尽可能寻找类似于二维空间中的直线的线性分类器。例如三维中就会寻找一个可以划分数据的平面,更高维中,就寻找一个可以划分当前数据的超平面。一般来说,把可以被一条直线(或者超平面)分割的数据称为线性可分的数据,所以超平面是线性分类器。

支持向量机是由支持向量和机器构成:

  • 支持向量就是离分类器最近的那些点,这些点位于最大间隔上,分类仅依靠这些点,与其他点无关
  • 机器 就是分类器。。

支持向量机 就是一种基于关键点的分类算法。。

SVM 案例介绍

使用支持向量机模块时,需要先使用 svm = cv2.ml.SVM_create() 生成后续训练的空分类器。获取空训练器后,针对该模型使用 训练结果= svm.train(训练数据,训练数据排列格式,训练数据的标签) 对训练数据进行训练。

  • 训练数据:表示原始数据,用来训练分类器。
  • 排列格式,原始数据的排列形式按行排序(cv2.ml.ROW_SAMPLE,每一条训练数据占一行) ,按列排序(cv2.,ml.COL_SAMPLE,每一条数据占一列)两种形式,根据实际选择
  • 训练数据的标签,原始数据的标签
  • 训练结果

完成分类的训练后,使用 svm.predict() 函数即可完成训练好的分类器模型对测试数据进行分类(返回值,返回结果) = svm.predict(测试数据)

这就是基本使用方法,当然实际中还需要对其中的参数进行调整。例如:可以通过 setType()函数设置类别,通过setKernel()函数设置核类型,通过 setC()函数设置支持向量机的参数 C(惩罚系数,即对误差的宽容度,默认值为 0)。

举个栗子

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 第 1 步 准备数据
# 表现为 A 级的员工的笔试、面试成绩
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
# 表现为 B 级的员工的笔试、面试成绩
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
# 合并数据
data = np.vstack((a,b))
data = np.array(data,dtype='float32')# 第 2 步 建立分组标签,0 代表 A 级,1 代表 B 级
#aLabel 对应着 a 的标签,为类型 0-等级 A
aLabel=np.zeros((20,1))
#bLabel 对应着 b 的标签,为类型 1-等级 B
bLabel=np.ones((20,1))
# 合并标签
label = np.vstack((aLabel, bLabel))
label = np.array(label,dtype='int32')# 第 3 步 训练
# 用 ml 机器学习模块 SVM_create() 创建 svm
svm = cv2.ml.SVM_create()
# 属性设置,直接采用默认值即可
#svm.setType(cv2.ml.SVM_C_SVC) # svm type
#svm.setKernel(cv2.ml.SVM_LINEAR) # line
#svm.setC(0.01)
# 训练
result = svm.train(data,cv2.ml.ROW_SAMPLE,label)# 第 4 步 预测
# 生成两个随机的笔试成绩和面试成绩数据对
test = np.vstack([[98,90],[90,99]])
test = np.array(test,dtype='float32')
# 预测
(p1,p2) = svm.predict(test)# 第 5 步 观察结果
# 可视化
plt.scatter(a[:,0], a[:,1], 80, 'g', 'o')
plt.scatter(b[:,0], b[:,1], 80, 'b', 's')
plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
plt.show()
# 打印原始测试数据 test,预测结果
print(test)
print(p2)[[98. 90.][90. 99.]]
[[1.][1.]]


可看到,测试的两个都是 B 类。

K 均值聚类

预测一个离散值时,做的工作就是分类。当我们要预测一个连续值时,做的工作就是回归。

机器学习模型还可以将训练集中的数据划分为若干个组,每个组称为一个簇。这些自动形成的簇,可能对应不同的潜在概念,例如,运动员面子可以划分为篮球苗子,长跑苗子等。这种学习方式就是 聚类。特点就是学习过程中不需要用标签对训练样本进行标注。也就是说,学习过程可以根据现有训练集自动完成分类。

根据训练数据是否有标签,将机器学习划分为监督学习和无监督学习。前面的K 近邻,支持向量机都是监督学习,提供有标签的数据给算法学习,然后对数据分类,而聚类是无监督学习,不知道分类标签,直接对数据分类。

例如,100个豆子,已知其中40个绿豆,40个大豆,将剩下的20个分类就是监督学习,如果我们仅知道这些豆子由两个品种,但不知道具体是什么品种,此时可以根据豆子的大小,颜色属性,或根据两者组合属性,将其划分为两个类型,这个过程中没有使用已知标签,也同样完成了分类,这时的分类就是一种无监督学习。

理论基础

分豆子

6粒豆子混在一起,不知道豆子类别,按照大小分为两类。测得这些豆子直径大小,1,2,3,10,20,30.标记为 A ,B ,C, D, E, F, 进行分类操作。

  1. 随机选择两个参考豆子,例如选取 A, B 作为分类参考豆子
  2. 计算每粒豆子的直径与 A 和 B 的距离。距离哪个豆子近就将新豆子划分在哪个豆子所在的组。不用想第一组只有A ,剩下五个都是B 。
  3. 分别计算第一组豆子和第二组豆子的直径平均值,然后将各个豆子按照与直径平均值的距离大小分组。第一组平均值 AV1 = 1 ,第二组 AV2= (2+3+10+20+30)/5= 13

    划分为 AV1 组,豆子 A ,B ,C . AV2 组,豆子 D,E,F 。
  4. 重复第三步,知道分组稳定不在变化,即可确定分组完成。

经过一次后还是这个结果,我们就认为分组完成,将直径小的一组称为小豆子,另一组称为大豆子。实际处理中可能需要进行多轮的迭代才能实现数据的收敛,分类不在变化。

K 均值聚类的基本步骤

K均值聚类是一种将数据划分为 k 个簇的简单的聚类算法,该算法不断提取当前分类的中心点,并最终在分类稳定时完成聚类。本质来看就是一种迭代算法。

  1. 随机选取k 个点作为分类的中心点。也可以随机生成 K 个并不存在于原始数据中的数据点作为分类中心点。
  2. 将每个数据点放到离他们最近的中心点所在的类中,
  3. 重新计算各个分类的数据点的平均值,将该平均值作为新的分类中心点。
  4. 重复步骤2,3 知道分类稳定。

K 均值聚类模块

retval, bestLabels, centers=cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)

  • data 输入的待处理数据集合,应该是 np.float32 类型,每个特征放在单独的一列中。
  • K 分出的簇的个数,就是分类的个数,一般就是 K =2 表示二分类。
  • bestLabels 表示计算后各个数据点最终分类标签(索引),实际调用时,设置为None。
  • criteria 算法迭代的终止条件。当达到最大循环数目或者指定的精度阈值时,算法停止继续分类迭代计算。这个参数由三个子参数构成:type, max_iter , eps。type 终止类型,有三种情况。cv2.TERM_CRITERIA_EPS:精度满足 eps 时,停止迭代。。cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过阈值 max_iter 时,停止迭代。。cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:上述两个条件中的任意一个满足时,停止迭代。
  • max_iter 最大迭代次数
  • eps 精确的阈值
  • attempts 让算法使用不同的初始值进行 attempts 次尝试
  • flags 表示选择初始中心点的方法,cv2.KMEANS_RANDOM_CENTERS:随机选取中心点。cv2.KMEANS_PP_CENTERS:基于中心化算法选取中心点。cv2.KMEANS_USE_INITIAL_LABELS:使用用户输入的数据作为第一次分类中心点;如果算法需要尝试多次(attempts 值大于 1 时),后续尝试都是使用随机值或者半随机值作为第一次分类中心点。
  • retval 返回的距离值(也称为密度值或紧密度),返回各个点到相应中心距离的平方和。
  • bestLabels 各个数据点额最终分类标签(索引)
  • centers,每个分类的中心点数据。

示例

# 随机生成两组数组
# 生成 60 个值在[0,50]内的 xiaoMI 直径数据
xiaoMI = np.random.randint(0,50,60)
# 生成 60 个值在[200,250]内的 daMI 直径数据
daMI = np.random.randint(200,250,60)
# 将 xiaoMI 和 daMI 组合为 MI
MI = np.hstack((xiaoMI,daMI))         # 转换为一列
# 使用 reshape 函数将其转换为(120,1)
MI = MI.reshape((120,1))
# 将 MI 转换为 float32 类型
MI = np.float32(MI)
# 调用 kmeans 模块
# 设置参数 criteria 的值,type, max_iter , eps
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.)
# 设置参数 flags 的值
flags = cv2.KMEANS_RANDOM_CENTERS    # 随机选取中心点
# 调用函数 kmeans
retval,bestLabels,centers = cv2.kmeans(MI,2,None,criteria,10,flags)# # 打印返回值
# print(retval)
# print(bestLabels)
# print(centers)# 获取分类结果
XM = MI[bestLabels==0]
DM = MI[bestLabels==1]
# 绘制分类结果
# 绘制原始数据
plt.plot(XM,'ro')                      # 用不同的颜色表示分类
plt.plot(DM,'bo')
# 绘制中心点,中心点是随机的,并且并不是原数据中的点,毕竟经过多次平均怎么可能还是源数据中的。
plt.plot(centers[0],'gx')
plt.plot(centers[1],'gx')
plt.show()

# 读取待处理图像
img = cv2.imread('5.jpg')
# 使用 reshape 将一个像素点的 RGB 值作为一个单元处理,,感觉就是将三个当作一个了,
data = img.reshape((-1,3))
# 转换为 kmeans 可以处理的类型
data = np.float32(data)
# 调用 kmeans 模块
print(data.shape)     # (353500, 3)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 2            # 决定了展示的灰度级
ret,label,center=cv2.kmeans(data,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
# 转换为 uint8 数据类型,将每个像素点都赋值为当前分类的中心点像素值
# 将 center 的值转换为 uint8
center = np.uint8(center)
# 使用 center 内的值替换原像素点的值
res1 = center[label.flatten()]        # 这个索引,,试试center[[0,0]] 就知道了。。
# 使用 reshape 调整替换后的图像
res2 = res1.reshape((img.shape))
# 显示处理结果
cv2.imshow('img',img)
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv入门:支持向量机,K均值聚类相关推荐

  1. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  2. OpenCV学习笔记(十七)——K均值聚类

    当我们要预测的是一个离散值时,做的工作就是"分类".机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个"簇(cluster)".它的重要特点是在 ...

  3. Python OpenCV应用K均值聚类进行颜色量化

    Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...

  4. OpenCV k均值聚类kmeans clustering的实例(附完整代码)

    OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 # ...

  5. Kmeans K均值聚类,OpenCV实现

    Clustering 聚类 kmeans  k均值聚类 Finds centers of clusters and groups input samples around the clusters. ...

  6. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  7. K均值聚类的理解和实现

    目录 1. 距离的测度 1.1 欧式距离 1.2 马氏距离 1.2.1 利用马氏距离对数据进行归一化 1.2.2 利用马氏距离进行分类 2. K均值的基本理论 2.1 K均值的原理和实现 2.2 K均 ...

  8. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  9. matlab传递闭包动态聚类图,用SPSS制作3D散点图全方位动态展示K均值聚类效果

    SPSS系统聚类输出的树状图广受用户喜爱,二阶聚类也可以输出一系列美观的可视化图形用来观察聚类效果,但我们发现Kmeans均值聚类没有提供可视化程度高的图形,那怎么办,我们自己来制作. 数据小兵推荐使 ...

最新文章

  1. 【Go语言】【4】GO语言类型和为类型增加方法
  2. Py之scikiti -survival:scikiti -survival库的简介、安装、使用方法之详细攻略
  3. 将COM+ Events进行到底[转]
  4. 调试U-Boot笔记(一)
  5. 管理处理器的亲和性(affinity)
  6. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
  7. 一台机器上安装两个tomcat
  8. Oracle中CHAR类型不足位数时,用空格自动补足位数
  9. java arraylist 赋值_ArrayList源码解析,老哥,来一起复习一哈?
  10. python之提升程序性能的解决方案
  11. 《Kotlin进化之路》之【第二章:揭开Kotlin的基础面纱】(二)
  12. linux系统支持什么格式的软件吗,UOS系统支持什么样的软件包格式:其实Deb,Rpm,Tar.gz源码包都行...
  13. linux下完全删除mysql
  14. Python高级特性之---切片操作
  15. arcgis android 比例尺,ArcGIS for Android 自定义地图比例尺
  16. 【转】安装虚拟机VMware及在VMware下安装Ghost XP系统图文教程(附PQ分区及VMwa
  17. 逍遥安卓 出现android,解决逍遥安卓模拟器一直卡在99%的方法
  18. 京东接口对接流程(以下举例物流接口):
  19. 有限元三角形单元的等效节点力
  20. 下列对C语言特点的描述中 错误的是,下列对C语言特点的描述中,错误的是。

热门文章

  1. 20位诺奖得主齐聚一堂,世界科技创新论坛探讨未来
  2. 表示转折时yet与but的区别是什么
  3. php 全文搜索引擎-讯搜使用
  4. 齐博万象圈子模板制作心得
  5. 补码一位乘法(Booth算法)
  6. 关于CPLD与FPGA的对比分析
  7. matlab lc滤波,基于MATLAB的LC二阶低通滤波网络频域分析
  8. Flutter自定义IOS的Plugin
  9. UDP服务器开发与nb-iot模组通信(1)----协议篇
  10. css3之BFC、IFC、GFC和FFC