SVM算法

简介: 【6月更文挑战第6天】SVM算法。

可使用一条直线将线性可分离的数据分为两组,这条直线在SVM算法中称为“决策边界”;非线性可分离的数据转换为高维数据后可称为线性可分离数据。这是SVM算法的理论基础。
1.图解SVM算法
下面的代码在图像中选择了5个点,分为两类,类别标志分别为0和1。将5个点和标志作为已知分类数据训练SVM模型;然后用模型对图像中的所有点进行分类,根据分类结果设置图像颜色,从而直观显示图像像素的分类结果。
import cv2
import numpy as np
import matplotlib.pyplot as plt

准备训练数据,假设图像高240,宽320,在其中选择5个点。

traindata = np.matrix([[140,60],[80,120],[160,110],[160,190],[240,180]]
,dtype=np.float32)

5个点,前3个点为一类,标志为0;后2个点为一类,标志为1

labels = np.array([0,0,0,1,1])
svm = cv2.ml.SVM_create() #创建SVM分类器
svm.setGamma(0.50625) #设置相关参数
svm.setC(12.5)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-6))
svm.train(traindata, cv2.ml.ROW_SAMPLE, labels) #训练模型
img = np.zeros((240,320,3), dtype="uint8") #创建图像,用于SVM分类
colors = {0:(102,255,204),1:(204,204,102)}

用SVM分类器对图像像素分类,根据结果设置像素颜色

for i in range(240):
for j in range(320):
point = np.matrix([[j,i]],dtype=np.float32) #将像素坐标转换为测试数据
label = svm.predict(point)[1].ravel() #执行预测,返回结果
img[i,j] = colors[label[0]] #根据预测结果,设置像素颜色
svm_vectors = svm.getUncompressedSupportVectors() #获得SVM向量
for i in range(svm_vectors.shape[0]): #在图像中绘制SVM向量(红色圆)
cv2.circle(img, (svm_vectors[i,0],svm_vectors[i,1]),8,(0,0,255),2)

在图像中绘制训练数据点,类别标志0使用蓝色,类别标志1使用绿色

cv2.circle(img, (140,60),5,(255,0,0),-1)
cv2.circle(img, (80,120),5,(255,0,0),-1)
cv2.circle(img, (160,110),5,(255,0,0),-1)
cv2.circle(img, (160,190),5,(0,255,0),-1)
cv2.circle(img, (240,180),5,(0,255,0),-1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换为RGB格式
plt.imshow(img)
plt.show() #显示结果
2.使用SVM算法识别手写数据
前面的例子中,kNN算法直接使用了像素值作为特征向量。SVM算法可使用图像的定向梯度直方图(Histogram of Oriented Gradients,HOG)作为特征向量来对图像进行分类。
import cv2
import numpy as np
def hog(img): #定义HOG描述符计算函数
hog = cv2.HOGDescriptor((20,20),(8,8), #定义HOGDescriptor对象
(4,4),(8,8),9,1,-1,0,0.2,1,64,True)
hog_descriptor=hog.compute(img) #计算HOG描述符
hog_descriptor=np.squeeze(hog_descriptor) #转换为一维数组
return hog_descriptor #返回HOG描述符,144位
img = cv2.imread('digits.png',0)
digits=[np.hsplit(row,100) for row in np.vsplit(img,50)]#分解图像,50行100列
labels = np.repeat(np.arange(10),500)[:,np.newaxis] #定义对应的标记
hogdata = [list(map(hog,row)) for row in digits] #计算图像的HOG描述符
trainData = np.float32(hogdata).reshape(-1,144) #转换为测试数据
svm = cv2.ml.SVM_create() #创建SVM分类器

设置相关参数

svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.setC(2.67)
svm.setGamma(5.383)
svm.train(trainData, cv2.ml.ROW_SAMPLE, labels) #训练模型

用绘图工具创建的手写数字5图像(大小为20*20)进行测试

test= cv2.imread('d5.jpg',0) #打开图像
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32) #转换为测试数据
result = svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))

用绘图工具创建的手写数字8图像(大小为20*20)进行测试

test= cv2.imread('d8.jpg',0)
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32) #转换为测试数据
result = svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))

目录
相关文章
|
30天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第27天】在数据科学和人工智能的领域中,支持向量机(SVM)是一种强大的监督学习模型,它基于统计学习理论中的VC维理论和结构风险最小化原理。本文将详细介绍SVM的工作原理、核心概念以及如何在实际问题中应用该算法进行分类和回归分析。我们还将讨论SVM面临的挑战以及如何通过调整参数和核技巧来优化模型性能。
|
14天前
|
机器学习/深度学习 算法 计算机视觉
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
|
11天前
|
机器学习/深度学习 数据采集 算法
SVM算法
【6月更文挑战第15天】
23 6
|
1月前
|
机器学习/深度学习 数据采集 算法
深入理解并应用机器学习算法:支持向量机(SVM)
【5月更文挑战第13天】支持向量机(SVM)是监督学习中的强分类算法,用于文本分类、图像识别等领域。它寻找超平面最大化间隔,支持向量是离超平面最近的样本点。SVM通过核函数处理非线性数据,软间隔和正则化避免过拟合。应用步骤包括数据预处理、选择核函数、训练模型、评估性能及应用预测。优点是高效、鲁棒和泛化能力强,但对参数敏感、不适合大规模数据集且对缺失数据敏感。理解SVM原理有助于优化实际问题的解决方案。
|
1月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第6天】在数据科学和人工智能的广阔天地中,支持向量机(SVM)以其强大的分类能力与理论深度成为机器学习领域中的一个闪亮的星。本文将深入探讨SVM的核心原理、关键特性以及实际应用案例,为读者提供一个清晰的视角来理解这一高级算法,并展示如何利用SVM解决实际问题。
132 7
|
26天前
|
机器学习/深度学习 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第31天】 在数据科学的广阔天地中,支持向量机(SVM)以其卓越的性能和强大的理论基础脱颖而出。本文将深入剖析SVM的工作原理、核心概念以及实际应用,旨在为读者提供一个清晰的理解视角,并通过实例演示其在分类问题中的有效性。我们将从线性可分的情况出发,逐步过渡到非线性问题的处理方法,并探讨如何通过调整参数来优化模型的性能。
251 0
|
29天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第28天】 在数据科学与人工智能的领域中,支持向量机(Support Vector Machines, SVM)是一种强大的监督学习模型,它基于统计学习理论中的VC维理论和结构风险最小化原则。本文将深入探讨SVM的数学原理、关键概念以及实际应用案例。我们将透过SVM的镜头,理解其在分类和回归问题中的应用,并讨论如何通过核技巧克服维度灾难,提高模型的泛化能力。文章还将展示使用SVM解决实际问题的步骤和注意事项,为读者提供一个清晰的SVM应用指南。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
|
1月前
|
机器学习/深度学习 算法 搜索推荐
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(上)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
|
3天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。