import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
#随机生成两类各num个正态分布的数据,并分别添加类标签
num=15
c0_x0,c0_y0=0,1
c0_xy=np.hstack((c0_x,c0_y))
c0_labels=np.ones((num,1))
#横向拼接,将数据和类标签合并为一个num*2的数组
c0=np.hstack((c0_xy,c0_labels))
#观察类c0
#print('类c0为:\n',c0)
c1_x0,c1_y0=3,3
c1_xy=np.hstack((c1_x,c1_y))
c1_labels=2*np.ones((num,1))
#横向拼接,将数据和类标签合并为一个num*2的数组
c1=np.hstack((c1_xy,c1_labels))
#观察类c1
#print('类c1为:\n',c1)
#将c0和c1两类数据纵向堆叠合并为一个数据集X
X=np.vstack((c0,c1))
#观察X
#print('数据集X为:\n',X)
# 使用支持向量机进行训练
#可选择不同的核函数kernel: 'linear', 'poly', 'rbf','sigmoid'
clf = svm.SVC(kernel='linear',gamma=2)
clf.fit(X[:,0:2], X[:,2])
#可视化
plt.figure(figsize=(4, 3))
plt.clf()
#获得支持向量,绘制其散点图,默认以圆圈表示
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80,
facecolors='none', zorder=10, edgecolors='k')
#print('支持向量support_vectors_的形状为:',clf.support_vectors_.shape)
#print('clf.support_vectors_[:, 0]为:',clf.support_vectors_[:, 0])
#绘制原始数据散点图,以*表示
plt.scatter(X[:, 0], X[:, 1], c=X[:,2],marker='*', zorder=10, cmap=plt.cm.Paired,
edgecolors='k')
#修改x、y坐标的范围让所有的数据显示出来
plt.axis('tight')
x_min =-3
x_max = 6
y_min = -3
y_max = 6
#XX, YY分别从最小值到最大值间均匀取200个数,形状都为200*200
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
#XX.ravel(), YY.ravel()分别将XX, YY展平为40000*1的数组
#np.c_[XX.ravel(), YY.ravel()]的形状为40000*2
#计算XX, YY规定的平面内每个点到分割超平面的函数距离
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])
#print('XX.ravel()的形状为:',XX.ravel().shape)
#print('YY.ravel()的形状为:',YY.ravel().shape)
#print('np.c_[XX.ravel(), YY.ravel()]的形状为',np.c_[XX.ravel(), YY.ravel()].shape)
#print('Z的形状为:',Z.shape)
#设置Z的形状与XX相同,准备将Z的值与XX,YY规定的平面内的每一点的颜色值关联
Z = Z.reshape(XX.shape)
#print('Z的形状为:',Z.shape)
#Z>0返回True或False
#以点到超平面的距离0为分界线(即超平面自身),用两种颜色(1和0)绘制超平面的两侧
plt.pcolormesh(XX, YY, Z>0, cmap=plt.cm.Paired)
#绘制等高线,连接XX,YY规定的平面上具有相同Z值的点,等高线的值由levels规定
plt.contour(XX, YY, Z, colors=['k', 'r', 'k'], linestyles=['--', '-', '--'],
levels=[-.5, 0, .5])
#观察其它值的等高线
#plt.contour(XX, YY, Z, levels=[-5,-4,-3,-2,-1., 0, 1,2,3,4,5])
#对XX,YY规定的平面设置坐标轴刻度范围
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.show()
#使用分类模型进行预测
print('样本(3,3)属于类:',clf.predict([[3, 3]]))
若将核函数换为rbf,则结果为:
领取专属 10元无门槛券
私享最新 技术干货