前面已经对mnist数据集进行了读取,现在我们可以直接使用sklearn.svm模块中的算法库对mnist数据集进行训练。
【svm模块】
算法库:
sklearn.svm模块中提供了这些库:
大概分成这几类(除了svm_l1_min_c返回的是惩罚参数C的最低界)
由于这次的任务是分类,因此只需要熟悉分类类型的库。
分类库主要参数:
其他参数介绍可以看官方库:
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.svm
或者看看这位博主的总结(总结的很到位):
http://www.cnblogs.com/pinard/p/6117515.html
属性:
方法:
和一般模型都一样,训练用的fit(),评分的score(),预测新样本的predict(),还有计算样本点到分离超平面的距离的decision_function()等等。
【简单比较】
随机生成一组类别为两类,特征维数为2的样本。用聚类(blobs)生成数据。简单的来比较一下三种模型。
##用于可视化图表
import matplotlib.pyplot as plt
##用于做科学计算
import numpy as np
##用于做数据分析
import pandas as pd
##用于加载数据或生成数据等
from sklearn import datasets
##加载svm模型
from sklearn import svm
##随机生成一组特征数量为2,样本数量为80的数据集
X, y = datasets.make_blobs(n_samples=80, n_features=2, centers=2, random_state=3)
fig=plt.figure(figsize=(10,8))
plt.xlim(-8,4) # 设置x轴刻度范围
plt.ylim(-5,8) # 设置y轴刻度范围
plt.scatter(X[:, 0], X[:, 1], c=y, s=30)
plt.show()
输出为:
SVC:
##加载svm的svc模型,选择线性核linear
model_svc=svm.SVC(kernel='linear')
model_svc.fit(X,y)
print("各类的支持向量在训练样本中的索引",model_svc.support_)
print("各类所有的支持向量:\n",model_svc.support_vectors_)
print("各类各有多少个支持向量",model_svc.n_support_)
print("各特征系数",model_svc.coef_)
print("截距",model_svc.intercept_)
print("各样本点到分离超平面的距离:\n",model_svc.decision_function(X))
fig=plt.figure(figsize=(10,8))
plt.xlim(-8,4) # 设置x轴刻度范围
plt.ylim(-5,8) # 设置y轴刻度范围
##显示分离超平面
w1=model_svc.coef_[:,0]
w2=model_svc.coef_[:,1]
b=model_svc.intercept_
x1=np.linspace(-8,6,2)
x2=(w1*x1+b)/(-1*w2)
x2_up=(w1*x1+b+1)/(-1*w2)
x2_down=(w1*x1+b-1)/(-1*w2)
plt.plot(x1,x2,'k-',linewidth=0.8)
plt.plot(x1,x2_up,'k--',linewidth=0.8)
plt.plot(x1,x2_down,'k--',linewidth=0.8)
##显示样本点和支持向量
plt.scatter(X[:, 0], X[:, 1], c=y,s=30)
plt.scatter(model_svc.support_vectors_[:, 0], model_svc.support_vectors_[:, 1],s=80,c='',edgecolors='b')
plt.show()
输出为:
各类的支持向量在训练样本中的索引 [ 3 77 63]
各类所有的支持向量:
[[ 0.21219196 1.74387328]
[-1.23229972 3.89519459]
[-2.94843418 0.3655385 ]]
各类各有多少个支持向量 [2 1]
各特征系数 [[-0.48951758 -0.32852537]]
截距 [-0.32333516]
各样本点到分离超平面的距离:
[-1.96224709 1.96992652 1.61830594 -1.00011347 -3.03968748 -1.91355576
-3.20222196 1.07605938 1.39390527 1.19794817 -3.09852679 -2.99356435
1.83058651 2.46025289 1.84454041 -1.98203511 1.18207352 -2.21362739
-1.93596757 1.5062249 -3.13955464 -1.41328098 2.11163776 -2.0100733
1.23402066 -1.3997197 1.42460256 1.9676612 1.10767531 1.64961948
1.95638419 1.51193805 -1.2642258 2.06733658 1.99862207 1.49307471
-1.44123444 -1.54063897 2.21232256 3.39921728 1.08180429 1.72267793
-3.1813601 1.61914905 1.59985133 -1.70286262 -1.94181226 1.59417872
2.15236394 -2.64