支持向量机.docx

上传人:b****5 文档编号:11748160 上传时间:2023-03-31 格式:DOCX 页数:16 大小:872.73KB
下载 相关 举报
支持向量机.docx_第1页
第1页 / 共16页
支持向量机.docx_第2页
第2页 / 共16页
支持向量机.docx_第3页
第3页 / 共16页
支持向量机.docx_第4页
第4页 / 共16页
支持向量机.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

支持向量机.docx

《支持向量机.docx》由会员分享,可在线阅读,更多相关《支持向量机.docx(16页珍藏版)》请在冰豆网上搜索。

支持向量机.docx

支持向量机

支持向量机(SVM)

%matplotlibinline

importnumpyasnp

importmatplotlib.pyplotasplt

fromscipyimportstats

#useseabornplottingdefaults

importseabornassns;sns.set()

#随机来点数据

fromsklearn.datasets.samples_generatorimportmake_blobs

X,y=make_blobs(n_samples=50,centers=2,

random_state=0,cluster_std=0.60)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

随便的画几条分割线,哪个好来这?

xfit=np.linspace(-1,3.5)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plt.plot([0.6],[2.1],'x',color='red',markeredgewidth=2,markersize=10)

form,bin[(1,0.65),(0.5,1.6),(-0.2,2.9)]:

plt.plot(xfit,m*xfit+b,'-k')

plt.xlim(-1,3.5);

SupportVectorMachines:

最小化 雷区

xfit=np.linspace(-1,3.5)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

form,b,din[(1,0.65,0.33),(0.5,1.6,0.55),(-0.2,2.9,0.2)]:

yfit=m*xfit+b

plt.plot(xfit,yfit,'-k')

plt.fill_between(xfit,yfit-d,yfit+d,edgecolor='none',

color='#AAAAAA',alpha=0.4)

plt.xlim(-1,3.5);

训练一个基本的SVM

fromsklearn.svmimportSVC#"Supportvectorclassifier"

model=SVC(kernel='linear')

model.fit(X,y)

#绘图函数

defplot_svc_decision_function(model,ax=None,plot_support=True):

"""Plotthedecisionfunctionfora2DSVC"""

ifaxisNone:

ax=plt.gca()

xlim=ax.get_xlim()

ylim=ax.get_ylim()

#creategridtoevaluatemodel

x=np.linspace(xlim[0],xlim[1],30)

y=np.linspace(ylim[0],ylim[1],30)

Y,X=np.meshgrid(y,x)

xy=np.vstack([X.ravel(),Y.ravel()]).T

P=model.decision_function(xy).reshape(X.shape)

#plotdecisionboundaryandmargins

ax.contour(X,Y,P,colors='k',

levels=[-1,0,1],alpha=0.5,

linestyles=['--','-','--'])

#plotsupportvectors

ifplot_support:

ax.scatter(model.support_vectors_[:

0],

model.support_vectors_[:

1],

s=300,linewidth=1,facecolors='none');

ax.set_xlim(xlim)

ax.set_ylim(ylim)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plot_svc_decision_function(model);

model.support_vectors_

defplot_svm(N=10,ax=None):

X,y=make_blobs(n_samples=200,centers=2,

random_state=0,cluster_std=0.60)

X=X[:

N]

y=y[:

N]

model=SVC(kernel='linear',C=1E10)

model.fit(X,y)

ax=axorplt.gca()

ax.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

ax.set_xlim(-1,4)

ax.set_ylim(-1,6)

plot_svc_decision_function(model,ax)

fig,ax=plt.subplots(1,2,figsize=(16,6))

fig.subplots_adjust(left=0.0625,right=0.95,wspace=0.1)

foraxi,Ninzip(ax,[60,120]):

plot_svm(N,axi)

axi.set_title('N={0}'.format(N))

引入核函数的SVM

∙首先我们先用线性的核来看一下在下面这样比较难的数据集上还能分了吗?

fromsklearn.datasets.samples_generatorimportmake_circles

X,y=make_circles(100,factor=.1,noise=.1)

clf=SVC(kernel='linear').fit(X,y)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plot_svc_decision_function(clf,plot_support=False);

#加入了新的维度r

frommpl_toolkitsimportmplot3d

r=np.exp(-(X**2).sum

(1))

defplot_3D(elev=30,azim=30,X=X,y=y):

ax=plt.subplot(projection='3d')

ax.scatter3D(X[:

0],X[:

1],r,c=y,s=50,cmap='autumn')

ax.view_init(elev=elev,azim=azim)

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('r')

plot_3D(elev=45,azim=45,X=X,y=y)

#加入径向基函数

clf=SVC(kernel='rbf',C=1E6)

clf.fit(X,y)

#这回牛逼了!

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plot_svc_decision_function(clf)

plt.scatter(clf.support_vectors_[:

0],clf.support_vectors_[:

1],

s=300,lw=1,facecolors='none');

使用这种核支持向量机,我们学习一个合适的非线性决策边界。

这种核变换策略在机器学习中经常被使用!

调节SVM参数:

SoftMargin问题

调节C参数

∙当C趋近于无穷大时:

意味着分类严格不能有错误

∙当C趋近于很小的时:

意味着可以有更大的错误容忍

X,y=make_blobs(n_samples=100,centers=2,

random_state=0,cluster_std=0.8)

plt.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn');

X,y=make_blobs(n_samples=100,centers=2,

random_state=0,cluster_std=0.8)

fig,ax=plt.subplots(1,2,figsize=(16,6))

fig.subplots_adjust(left=0.0625,right=0.95,wspace=0.1)

foraxi,Cinzip(ax,[10.0,0.1]):

model=SVC(kernel='linear',C=C).fit(X,y)

axi.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plot_svc_decision_function(model,axi)

axi.scatter(model.support_vectors_[:

0],

model.support_vectors_[:

1],

s=300,lw=1,facecolors='none');

axi.set_title('C={0:

.1f}'.format(C),size=14)

X,y=make_blobs(n_samples=100,centers=2,

random_state=0,cluster_std=1.1)

fig,ax=plt.subplots(1,2,figsize=(16,6))

fig.subplots_adjust(left=0.0625,right=0.95,wspace=0.1)

foraxi,gammainzip(ax,[10.0,0.1]):

model=SVC(kernel='rbf',gamma=gamma).fit(X,y)

axi.scatter(X[:

0],X[:

1],c=y,s=50,cmap='autumn')

plot_svc_decision_function(model,axi)

axi.scatter(model.support_vectors_[:

0],

model.support_vectors_[:

1],

s=300,lw=1,facecolors='none');

axi.set_title('gamma={0:

.1f}'.format(gamma),size=14)

Example:

FaceRecognition

Asanexampleofsupportvectormachinesinaction,let'stakealookatthefacialrecognitionproblem.WewillusetheLabeledFacesintheWilddataset,whichconsistsofseveralthousandcollatedphotosofvariouspublicfigures.AfetcherforthedatasetisbuiltintoScikit-Learn:

fromsklearn.datasetsimportfetch_lfw_people

faces=fetch_lfw_people(min_faces_per_person=60)

print(faces.target_names)

print(faces.images.shape)

fig,ax=plt.subplots(3,5)

fori,axiinenumerate(ax.flat):

axi.imshow(faces.images[i],cmap='bone')

axi.set(xticks=[],yticks=[],

xlabel=faces.target_names[faces.target[i]])

∙每个图的大小是[62×47]

∙在这里我们就把每一个像素点当成了一个特征,但是这样特征太多了,用PCA降维一下吧!

fromsklearn.svmimportSVC

#fromsklearn.decompositionimportRandomizedPCA

fromsklearn.decompositionimportPCA

fromsklearn.pipelineimportmake_pipeline

pca=PCA(n_components=150,whiten=True,random_state=42)

svc=SVC(kernel='rbf',class_weight='balanced')

model=make_pipeline(pca,svc)

fromsklearn.model_selectionimporttrain_test_split

Xtrain,Xtest,ytrain,ytest=train_test_split(faces.data,faces.target,

random_state=40)

使用gridsearchcross-validation来选择我们的参数

fromsklearn.model_selectionimportGridSearchCV

param_grid={'svc__C':

[1,5,10],

'svc__gamma':

[0.0001,0.0005,0.001]}

grid=GridSearchCV(model,param_grid)

%timegrid.fit(Xtrain,ytrain)

print(grid.best_params_)

model=grid.best_estimator_

yfit=model.predict(Xtest)

yfit.shape

fig,ax=plt.subplots(4,6)

fori,axiinenumerate(ax.flat):

axi.imshow(Xtest[i].reshape(62,47),cmap='bone')

axi.set(xticks=[],yticks=[])

axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],

color='black'ifyfit[i]==ytest[i]else'red')

fig.suptitle('PredictedNames;IncorrectLabelsinRed',size=14);

fromsklearn.metricsimportclassification_report

print(classification_report(ytest,yfit,

target_names=faces.target_names))

∙精度(precision)=正确预测的个数(TP)/被预测正确的个数(TP+FP)

∙召回率(recall)=正确预测的个数(TP)/预测个数(TP+FN)

∙F1=2精度召回率/(精度+召回率)

fromsklearn.metricsimportconfusion_matrix

mat=confusion_matrix(ytest,yfit)

sns.heatmap(mat.T,square=True,annot=True,fmt='d',cbar=False,

xticklabels=faces.target_names,

yticklabels=faces.target_names)

plt.xlabel('truelabel')

plt.ylabel('predictedlabel');

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1