svm.SVC()
svm.SVC()使用ovo,每一个类别和其他类别分别构造一个svm,一共n*(n-1)/2svm分类器,当判断一个未知类别的样本,每个分类器对这个点进行分类,最后投票,得票最多的类别为最终类别
构造四个类别:
1 | cls1 = np.array([[0, 1, 0],[1, 1, 0], [2, 1, 0], [3, 1, 0], [4, 1, 0]]) |
分别为A,B,C,D类,AB构造一个分类器y=2x, AC构造一个分类器y=3x, AD构造一个分类器y=4x, BC构造一个分类器y=4x, BD构造一个分类器y=5x, CD构造一个分类器y=6x
当来一个点时,计算它到每个分类平面的距离,如果大于0则分为正类,否则负类,如点(0,1)到这两个平面距离都大于0,得到[Ture,True,True,Ture,True,True],AB分类,A=1;AC分类,A=2;AD分类,A=3;BC分类,B=1;BD分类,B=2;CD分类,C=1;最后A类得分最多,该点被分为A类
sklearn ovo源码:
1 | # multiclass.py |
svm.SVC()有参数 decision_function_shape=’ovr’不过没用,还是采用的ovo的方式
svm.LinearSVC()
svm.LinearSVC 使用ovr进行多分类,每个类别和剩下的类别训练得到一个svm分类器,分类的时候,对于一个未知的点,计算该点到所有超平面的距离(没有除模),最后改样本被分为距离超平面最远的那一个类,之所以不除模,是因为这个超平面可以将绝对距离远的分为正类,而将绝对距离近的超平面分为负类,下面看一个例子,还是上面那四个点,
训练得到的参数w&b:
1 | [[ 0.07355282 -0.82129448] |
测试点(0,1)到四个超平面的距离1
2最大的位置在0,所以该点被分为0类;测试点(0,2)到四个超平面的距离
```[[-1.04376451 -0.39216323 -0.52613543 -0.89956749]]
之所以该点到第二个超平面还更‘近’,是因为它的距离没有除以模
sklearn源码:
1 | # path/linear_model/base.py |
测试样例代码:
1 | import numpy as np |