首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python sklearn之支持向量机

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,则结果为:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180921G1N93600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券