提前阅读:
问题:
- 如何使用SVM多分类?
01 SVM理论
- 希望的是找到一个平面作为超平面,它恰好在两个类中间分开,以它为基准画两个与它平行的平面,让这两个平面分别向两个方向平行移动,即一个向类别X聚集的方向移动,一个向非类别X聚集的方向移动。当这两个平面同时(等距离)分别触碰到类别X和非类别X的点时停止下来,记录这个平面的
w
和b
,记录此时的移动距离δ
。这样的平面也许不止一个,但是会找到一个能让δ
尽可能大的值,这个能产生最大δ
值方案的w
和b
所构成的g(v) = wv+b
就是要找的超平面。
01 间隔与支持向量
鸢尾花数据集seroas和versicolor两类样本
02 对偶问题
03 核函数
- 我们平时生产生活中遇到的例子基本都是线性不可分的,SVM就是要解决这个问题。
- 可以看到,在一维空间上解决线性不可分问题是把函数映射到二维空间,使得一维空间上的分类边界是二维空间上的分类函数在一维空间上的投影;而在二维空间上解决线性不可分问题是把函数映射到三维空间,使得二维空间上的分类边界是三维空间上的分类函数在二维空间上的投影。 那么所有的n维空间上的线性不可分的问题都可以考虑映射到n+1维上去构造分类函数,使得它在n维空间上的投影能够将两个类别分开。
- 这个构造过程SVM是有通用的方法可以解决的,就是使用核函数(Kernel) 进行构造。而且,有几个常用的核函数是可以拿来直接使用的,如线性核函数、多项式核函数、径向基核函数(RBF核函数)、高斯核函数等,能够查到的核函数有二三十种之多。
- 核函数的目的很单纯,即只要在当前维度空间的样本是线性不可分的,就一律映射到更高的维度上去,在更高的维度上找到超平面,得到超平面方程。而在更高维度上的超平面方程实际并没有增加更多的维度变量,更高的这个维度只是像在解几何题里使用的辅助线而已,最后得到的方程不会增加其他维度。例如,研究二维空间上的向量分类问题,那么经过核函数映射,最后得到的超平面变成了二维空间上的曲线(但同时也是三维空间上的一次方程);研究三维空间上的向量分类问题,那么经过核函数映射,最后得到的超平面变成了三维空间上的曲面(但同时也是四维空间上的一次方程)。函数表示只是一个变量代换关系。
04 软间隔与正则化
05 代码实践
举例1
from sklearn import svm
#年龄
X = [[34],[33],[32],[31],[30], [30],[25],[23],[22],[18]]
#质量
y = [1,0,1,0,1,1,0,1,0,1]
#现在把训练数据和对应的分类放入分类器中进行训练
#这里使用rbf
clf = svm.SVC(kernel='rbf').fit(X,y)
#预测年龄30的人的质量
p = [[30]]
print(clf.predict(p))
#结果是[1]
举例2
from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
iris = load_iris()
data_tr, data_te, label_tr, label_te = train_test_split(iris.data, iris.target, test_size=0.2)
model = LinearSVC().fit(data_tr, label_tr)
pre = model.predict(data_te)
acc_te = sum(pre == label_te)/len(pre)
acc_te
02 SVM的一些问题
问题1 在空间上线性可分的两类点,分别向SVM分类的超平面上做投影,这些点在超平面上的投影仍然是线性可分的吗?
- 不可分