利用scikit-learn实现svm

构造训练数据

import numpy as np 
#产生正态分布的数据100组,中心点(0,0),其标准差σ为1
p=np.random.randn(100,2)
#将中心点移动到(3.5,3.5),作为正类
for i in range(100):
    p[i][0]+=3.5
    p[i][1]+=3.5

#产生正态分布的数据100组,中心点(0,0),其标准差σ为1,作为负类
f=np.random.randn(100,2)
import pandas as pd 

#将np数组转换成dataframe
df_p=pd.DataFrame(p,columns=['x','y'])
#加上标签z,正类标签1
df_p['z']=1

#将np数组转换成dataframe
df_f=pd.DataFrame(f,columns=['x','y'])
#加上标签z,负类标签0
df_f['z']=0

#将正负类合并成一个dataframe
res = pd.concat([df_p, df_f], axis=0)
res
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
xyz
04.2506144.0561211
14.6080593.9632561
23.6679282.8442981
35.1103892.2077701
44.5655892.8658351
54.9679363.4284271
64.1644984.7564571
71.9964623.4615551
83.3205373.2367161
92.5522473.7403231
103.5290144.3609951
113.4467572.8995501
122.7650473.3735361
133.2398162.8950961
142.4384222.2517731
153.0017852.5462921
165.2520335.5937791
173.4136212.7578651
183.6249943.7971291
193.2176113.6815061
204.9905722.2560551
214.3505233.6078181
223.5338673.9498001
233.3748153.8827251
244.1123985.0652391
252.8798333.9477351
261.7015582.8325771
271.7845705.2553771
282.8762471.7932521
294.2273316.1787851
............
70-1.0814130.0467190
71-1.0048650.2042340
720.0234500.4534290
73-0.460663-0.6671040
740.935339-1.7478520
75-0.2012280.3478870
760.9879630.7062680
770.268110-1.0240680
780.4083600.6610680
791.5010261.6676130
80-0.508721-1.3145940
81-0.907388-0.1196750
821.227677-1.3050010
83-0.1000750.9559620
842.501123-0.2249450
852.6910641.3439070
860.7449240.0780180
87-0.721247-0.2968320
88-0.602119-0.6311730
890.3086631.2046040
900.5770420.3673470
912.394736-0.4124870
920.535134-0.7454680
930.409373-0.2594700
940.4046750.4542160
951.1574581.6429510
960.885934-1.5037370
970.363141-0.9266110
980.1449150.7991920
99-0.325018-1.2835570

200 rows × 3 columns

import matplotlib.pyplot as plt

#绘制出数据集的散点图
plt.scatter(res['x'], res['y'], c=res['z'],cmap=plt.cm.Paired)
plt.xlabel('x')
plt.ylabel('y')
plt.title('random data')
plt.show()

在这里插入图片描述

#重置数据集索引,应为合并后数据索引重复
res.reset_index(inplace=True, drop=True)
#取索引是4的整数倍的的数据做为测试集
test=res[(res.index%4==0)]
#取索引不是4的整数倍的的数据做为训练集
train=res[(res.index%4!=0)]
#选择训练集的特征
X=train[['x','y']]
#选择训练集的标签
Z = train['z']
from sklearn import svm
#新建SVC分类器
clf = svm.SVC(kernel='linear')
#训练
clf.fit(X, Z)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
#在训练集上的准确率
clf.score(X, Z)
0.9933333333333333
#在测试集上的准确率
clf.score(test[['x','y']],test['z'])
1.0
plt.scatter(X['x'], X['y'], c=Z,cmap=plt.cm.Paired)
#坐标系
ax = plt.gca()
#获得坐标系边界
xlim = ax.get_xlim()
ylim = ax.get_ylim()


# 0-1生成300个点
xx = np.linspace(xlim[0], xlim[1], 300)
yy = np.linspace(ylim[0], ylim[1], 300)
#生成网格坐标
YY, XX = np.meshgrid(yy, xx)
#将网格坐标组成样本
xy = np.vstack([XX.ravel(), YY.ravel()]).T
#求xy到分界线的函数距离
height = clf.decision_function(xy).reshape(XX.shape)
# 绘制等高线线,levels=[-1, 0, 1]表示绘制距离
ax.contour(XX, YY, height, colors='k',levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])
# 绘制出支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,linewidth=1, facecolors='none', edgecolors='k')

plt.show()

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值