参与:Jane W、蒋思源 支持向量机(SVM)已经成为一种非常流行的算法。本文将尝试解释支持向量机的原理,并列举几个使用 Python Scikits 库的例子。本文的所有代码已经上传 Github。有关使用 Scikits 和 Sklearn 的细节,我将在另一篇文章中详细介绍。 什么是 支持向量机(SVM)? SVM 是一种有监督的机器学习算法,atv直播,可用于分类或回归问题。它使用一种称为核函数(kernel)的技术来变换数据,然后基于这种变换,算法找到预测可能的两种分类之间的最佳边界(optimal boundary)。简单地说,它做了一些非常复杂的数据变换,然后根据定义的标签找出区分数据的方法。 为什么这种算法很强大? 在上面我们说 SVM 能够做分类和回归。在这篇文章中,我将重点讲述如何使用 SVM 进行分类。特别的是,本文的例子使用了非线性 SVM 或非线性核函数的 SVM。非线性 SVM 意味着算法计算的边界不再是直线。它的优点是可以捕获数据之间更复杂的关系,而无需人为地进行困难的数据转换;缺点是训练时间长得多,因为它的计算量更大。 牛和狼的分类问题 什么是核函数技术? 核函数技术可以变换数据。它具备一些好用的分类器的特点,然后输出一些你无需再进行识别的数据。它的工作方式有点像解开一条 DNA 链。从传入数据向量开始,通过核函数,它解开并组合数据,直到形成更大且无法通过电子表格查看的数据集。该算法的神奇之处在于,在扩展数据集的过程中,能发现类与类之间更明显的边界,使得 SVM 算法能够计算更为优化的超平面。 现在假装你是一个农夫,那么你就有一个问题——需要建立一个篱笆,以保护你的牛不被狼攻击。但是在哪里筑篱笆合适呢?如果你真的是一个用数据说话的农夫,一种方法是基于牛和狼在你的牧场的位置,建立一个分类器。通过对下图中几种不同类型的分类器进行比较,我们看到 SVM 能很好地区分牛群和狼群。我认为这些图很好地说明了使用非线性分类器的好处,可以看到逻辑回归和决策树模型的分类边界都是直线。 重现分析过程 想自己绘出这些图吗?你可以在你的终端或你选择的 IDE 中运行代码,在这里我建议使用 Rodeo(Python 数据科学专用 IDE 项目)。它有弹出制图的功能,可以很方便地进行这种类型的分析。它也附带了针对 Windows 操作系统的 Python 内核。此外,感谢 TakenPilot(一位编程者 https://github.com/TakenPilot)的辛勤工作,使得 Rodeo 现在运行闪电般快速。 下载 Rodeo 之后,从我的 github 页面中下载 cows_and_wolves.txt 原始数据文件。并确保将你的工作目录设置为保存文件的位置。 Rodeo 下载地址:https://www.yhat.com/products/rodeo 好了,现在只需将下面的代码复制并粘贴到 Rodeo 中,然后运行每行代码或整个脚本。不要忘了,你可以弹出绘图选项卡、移动或调整它们的大小。 # Data driven farmer goes to the Rodeoimportnumpy asnpimportpylab asplfromsklearn importsvmfromsklearn importlinear_modelfromsklearn importtreeimportpandas aspddefplot_results_with_hyperplane(clf,clf_name,df,plt_nmbr):x_min,x_max =df.x.min()-.5,df.x.max()+.5y_min,y_max =df.y.min()-.5,df.y.max()+.5# step between points. i.e. [0, 0.02, 0.04, ...]step =.02# to plot the boundary, we're going to create a matrix of every possible point# then label each point as a wolf or cow using our classifierxx,yy =np.meshgrid(np.arange(x_min,x_max,step),np.arange(y_min,y_max,step))Z =clf.predict(np.c_[xx.ravel(),yy.ravel()])# this gets our predictions back into a matrixZ =Z.reshape(xx.shape)# create a subplot (we're going to have more than 1 plot on a given image)pl.subplot(2,2,plt_nmbr)# plot the boundariespl.pcolormesh(xx,yy,Z,cmap=pl.cm.Paired)# plot the wolves and cowsforanimal indf.animal.unique():pl.scatter(df[df.animal==animal].x,df[df.animal==animal].y,marker=animal,label="cows"ifanimal=="x"else"wolves",color='black')pl.title(clf_name)pl.legend(loc="best")data =open("cows_and_wolves.txt").read()data =[row.split('t')forrow indata.strip().split('n')]animals =[]fory,row inenumerate(data):forx,item inenumerate(row):# x's are cows, o's are wolvesifitem in['o','x']:animals.append([x,y,item])df =pd.DataFrame(animals,columns=["x","y","animal"])df['animal_type']=df.animal.apply(lambdax:0ifx=="x"else1)# train using the x and y position coordiantestrain_cols =["x","y"]clfs ={"SVM":svm.SVC(),"Logistic":linear_model.LogisticRegression(),"Decision Tree":tree.DecisionTreeClassifier(),}plt_nmbr =1forclf_name,clf inclfs.iteritems():clf.fit(df[train_cols],df.animal_type)plot_results_with_hyperplane(clf,clf_name,df,plt_nmbr)plt_nmbr +=1pl.show() SVM 解决难题 (责任编辑:本港台直播) |