【机器学习-3】支持向量机SVM

1.调用svm.SVC(kernel='linear')计算超平面,并进行预测

from sklearn import  svm

#定义的3个点
x =[[2,0],[1,1],[2,3]]

#y为classlable,在下方为0,上方为1
y = [0,0,1]

#kernel:核函数--线性的核函数
#调用svm的方程svc(向量机)
clf = svm.SVC(kernel='linear')
#调用分类器的函数fit,两个参数
#x特征向量值,y为classlabel
#通过fit建立好模型,算出classfier。算出超平面,与相关属性函数保存在clf分类器中
clf.fit(x,y)

print(clf)
#查看支持向量
print(clf.support_vectors_)
#查看哪几个点是支持向量(下标)
print(clf.support_)
#查看每个类的支持向量个数
print(clf.n_support_)
#预测一个未知数的函数标记
print(clf.predict([2,0]))


输出结果:

[[1. 1.]
 [2. 3.]]
[1 2]
[1 1]
[0]

2.SKlearnExample

#numpy是python中科学计算库
import numpy as np
#pylab画图包
import pylab as pl
#sklearn是机器学习中常用的第三方模块,包括了许多数据集
from sklearn import svm

#创建40个点,线性可区分
#生成随机数,设置相同的seed,每次产生的随机数(每次生成的每组随机数)相同
#seed(0)中的0只是固定一些值
np.random.seed(0)

#创建可线性分类的数据集与结果集
#np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等(row是行)
#np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等(cloumns是列)
#取20个点,每个点都是二维,即矩阵有20行,每行有2列
#[2,2]属于正太分布,均值是2,方差也为2
#-[2,2]这些点靠左,考下方,右边仍然取20点靠右靠上方
#randn(x,y)+[σ,μ]返回一个样本,具有标准正态分布,x组y维,σ标准差,μ期望
X=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]
#print(X)
#40个点可以被被区分开,前20点标记为0,后20点标记为1
Y=[0]*20+[1]*20
#print(Y)

#建立SVM模型,找到超平面,在这里是一条直线
clf=svm.SVC(kernel='linear')
clf.fit(X,Y)
#查看特征向量点
print(clf.support_vectors_)

#收集这些数据来画平面图,因为这是一个二维的模型。
#因此可以假设超平面方程为 w0x + w1y + b = 0 转为点斜式就是: y = -(w0/w1)x - (b/w1) :
#调用clf,分配给特征的权重,w为划分线性方程wx+b=0的w
w=clf.coef_[0]

#计算斜率
a=-w[0]/w[1]
#p.linspace意在(5,-5)之间一些产生一些连续值用于画线
xx=np.linspace(-5,5)
#clf.intercept_[0]表示的是在w_0x + w_1y +w_3=0中的w_3

#clf.intercept_[0]除以w[1]即取到截距
yy=a*xx-(clf.intercept_[0]/w[1])


#绘制支持向量的超平面平行直线
#clf.support_vectors_[0]取第一个支持向量的点
#一个特征向量点是二维的(x1,y1)
b=clf.support_vectors_[0]

#b[1]-a*b[0]计算出截距
#因为此点在此直线上,因此y1-a*x1即为此线的截距
#b[1]为y,b[0]为x
yy_down=a*xx+(b[1]-a*b[0])

#clf.support_vectors_[-1]取最后一个支持向量的点
b=clf.support_vectors_[-1]
yy_up=a*xx+(b[1]-a*b[0])

print("W: ",w)
print("w[0]: ",w[0])
print("w[1]: ",w[1])
print("a: ",a)
#print("xx: ",xx)
#print("yy: ",yy)

print("support_vectors_: ",clf.support_vectors_)
print("clf.ceof_: ",clf.coef_)


# switching to the generic n-dimensional parameterization of the hyperplan to the 2D-specific equation
# of a line y=a.x +b: the generic w_0x + w_1y +w_3=0 can be rewritten y = -(w_0/w_1) x + (w_3/w_1
#插入线k-是实线,边际最大化的线
pl.plot(xx,yy,'k-')
##插入线k--是虚线
pl.plot(xx,yy_down,'k--')
pl.plot(xx,yy_up,'k--')

#support_vectors单独标记出来,使用scatter圈出
pl.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80,facecolors='none')
#clf.support_vectors_[:,0]表示取所有支持向量点的第一个值
print(clf.support_vectors_[:,0])
print(clf.support_vectors_[:,1])

pl.scatter(X[:,0],X[:,1],c=Y,cmap=pl.cm.Paired)

pl.axis('tight')
pl.show()


运行结果:

[[-1.02126202  0.2408932 ]
 [-0.46722079 -0.53064123]
 [ 0.95144703  0.57998206]]
W:  [0.90230696 0.64821811]
w[0]:  0.9023069585023087
w[1]:  0.6482181136113271
a:  -1.391980476255765
support_vectors_:  [[-1.02126202  0.2408932 ]
 [-0.46722079 -0.53064123]
 [ 0.95144703  0.57998206]]
clf.ceof_:  [[0.90230696 0.64821811]]
[-1.02126202 -0.46722079  0.95144703]
[ 0.2408932  -0.53064123  0.57998206]

3.Error:

W:  [0.90230696 0.64821811]
a:  -1.391980476255765
support_vectors_:  [[-1.02126202  0.2408932 ]
 [-0.46722079 -0.53064123]
 [ 0.95144703  0.57998206]]
clf.ceof_:  [[0.90230696 0.64821811]]
Traceback (most recent call last):
  File "G:\Machine_Learning\Machine_Learning\SVM\SKlearnExample.py", line 68, in <module>
    pl.scatter(clf.support_vectors_[:0],clf.support_vectors_[:1],s=80,facecolors='none')
  File "D:\Program_Files\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 3258, in scatter
    edgecolors=edgecolors, data=data, **kwargs)
  File "D:\Program_Files\Anaconda3\lib\site-packages\matplotlib\__init__.py", line 1818, in inner
    return func(ax, *args, **kwargs)
  File "D:\Program_Files\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 3810, in scatter
    raise ValueError("x and y must be the same size")
ValueError: x and y must be the same size

错误原因:

pl.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80,facecolors='none')

此行代码中[:,0]漏掉了冒号后面的逗号。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值