SVM 支持向量机

SVM    

是什么?    分类器

如何分类?   寻找一个超平面进行分类

核 :    

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。

目前,构造SVM多类分类器的方法主要有两类

  (1)直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性” 实现 多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;

  (2)间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

更多关于多分类方法  http://blog.itpub.net/29829936/viewspace-2168864/

具体实现

1.根据  y = x  直线分为两类,通过SVM 分类器分类

import cv2
import numpy as np

datas = [[1,3],[1,2],[1,2.5],[2,3.5],[3,4.5],[3,2],[3,1],[4,1],[4,1.5],[2,1]]
label = [[0],[0],[0],[0],[0],[1],[1],[1],[1],[1]]
datas = np.array(datas,dtype='float32')
label = np.array(label)
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)
#训练
result = svm.train(datas,cv2.ml.ROW_SAMPLE,label)
test = np.array([[5,4]],dtype='float32')
pre = svm.predict(test)
print(pre)

结果还不错,可能是因为数据比较简单

2. 使用SVM 分类手写数字 1  和 2

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 制作数据集和标签,代码可能会有些多余,但是懒得改了,哈哈...

#从测试集前500张图片中取数字1 和 2 作为训练数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('e:/datas/MNIST',one_hot=True)
trainData = mnist.test.images[:500]
trainLabels = mnist.test.labels[:500]
data1=[]
data2=[]
for i in range(500):
    if trainLabels[i,1]==1:
        data1.append(trainData[i])
for i in range(500):
    if trainLabels[i,2]==1:
        data2.append(trainData[i])
print(len(data1))
print(len(data2))
label = []
for i in range(67):
    label.append([1])
for i in range(len(data2)):
    label.append([2])

#  最终 67 张 1  和 55 张2 

#测试数据 , 都是 1 的图片
testData = mnist.test.images[500:550]
testLabel = mnist.test.labels[500:550]
test=[]
for i in range(50):
    if testLabel[i,1]==1:
        test.append(trainData[i])
print(len(test))

#数据格式化

datas = np.vstack((data1,data2))
datas = np.array(datas,dtype='float32')

label = np.array(label)
test = np.array(test)
test = np.array(test,dtype='float32')

#训练
svm = cv2.ml.SVM_create() #ml 机器学习模块    创建了一个支持向量机
#属性设置
svm.setType(cv2.ml.SVM_C_SVC) #SVM type
svm.setKernel(cv2.ml.SVM_LINEAR)# line
svm.setC(0.01)
#训练
result = svm.train(datas,cv2.ml.ROW_SAMPLE,label)

#预测
pre = svm.predict(test)
print(pre)

结果

结果非常不好,5张1 识别出来3张2 

应该是因为 784 列 太大,数据又少,所以导致训练结构很不理想

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值