支持向量机SVM
1.支持向量机原理
2.如何找出边际最大的决策边界
- 假设现在数据集中有N个训练样本,每个训练样本
i 可以表示为(xi,yi) (i=1,2,3...N ),其中xi是(x1i,x2i,x3i...xni )的特征向量。也就是说训练样本中的特征数据只有两种不同形式的特征。二分类的标签yi的取值为(1,-1)这两类结果。接下来可视化我们的N个样本数据的特征数据:(紫色为一类,红色为另一类)
- 让所有紫色点的标签为1,红色点的标签为-1。我们要在这个数据集上寻找一个决策边界,在二维平面上,决 策边界(超平面)就是一条直线。二维平面上的任意一条线可以被表示为:
-
其中[a,-1]是参数向量,X是特征向量,b是截距 -
在一组数据下,给定固定的w和b,就可以固定一条直线,在w和b不确定的情况下,这个表达式可以是任意一条直线。如果在w和b固定时,给定一个唯一的x取值,这个表达式就可以表示一个固定点,固定下来的直线就可以作为SVM的决策边界 -
在SVM中,就是用这个表达式来表示决策边界,目标是求解能够让边际最大化的决策边界,所以要求解参数向量w和b -
如果在决策边界上任意取两个点xa,xb ,则有: -
一个向量的转置乘以另一个向量,可以获得向量的点积(dot product )。两个向量的点积为0表示两个向量的方向是互相垂直的。xa 与xb 是一条直线上的两个点,相减后得到的向量方向是由xa 指向xb ,所以xa-xb 的方向是平行于他们所在的直线【决策边界】。而w与xa-xb 相互垂直,所以参数向量w的方向必然是垂直于我们的决策边界
- 决策边界的两边要有两个超平面,这两个超平面在二维空间中是两条平行线(就是虚拟超平面),他们的距离就是边际d,而决策边界位于这两条线中间,所以两条平行线是对称的,另这两条平行线被表示为:
-
支持向量:
- 让这两条线分别过两类数据中距离我们虚线决策边界最近的点,这些点被称为"支持向量"。另辞色类的点为
xp ,红色类的点为xr (xp和xr 作为支持向量),得到:
- 求最大化d,就是求w的最小值,把求解 的最小值转化为,求解以下函数的最小值:
-
如果wxi+b>=1 ,yi=1 ,则yi(wxi+b)>=1 ,如果wxi+b<=-1 ,yi=-1 ,则yi(wxi+b)>=1 -
最终得到支持向量机的损失函数
3.拉格朗日乘数
- 对损失函数求解,目标是求解让损失函数最小化的w,如果
||w||=0 ,f(w) 必然很小,但是||w||=0 是一个无效值【因为我们的决策边界wx+b=0 ,如果w为0,则这个向量包含的所有元素都为0,就有b=0这个唯一值,如果b和w都为0,决策边界不可能是一条直线,条件yi(wxi+b)>=1 就不可能实现,所以w不可以是一个0向量】 - 即,我们希望找出一种方式,能够让我们的条件
yi(wxi+b)>=1 在计算中也被纳入考虑,就是使用拉格朗日乘数法
4.非线性SVM与核函数
5.示例
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
data=load_breast_cancer()
feature=data.data
target=data.target
feature.shape
np.unique(target)
pca=PCA(n_components=2)
pca_feature=pca.fit_transform(feature)
pca_feature.shape
plt.scatter(feature[:,0],feature[:,1],c=target)
x_train,x_test,y_train,y_test=train_test_split(feature,target,test_size=0.3,random_state=420)
Kernel=['linear','rbf']
for kernel in Kernel:
clf=SVC(kernel=kernel,cache_size=1000)
clf.fit(x_train,y_train)
print('the accuracy under kernel %s is %f' %(kernel,clf.score(x_test,y_test)))
x=StandardScaler().fit_transform(feature)
x_train,x_test,y_train,y_test=train_test_split(x,target,test_size=0.3,random_state=420)
Kernel=['linear','rbf']
for kernel in Kernel:
clf=SVC(kernel=kernel,cache_size=1000)
clf.fit(x_train,y_train)
print("The accuracy under kernel %s is %f" % (kernel,clf.score(x_test,y_test)))
|