我试图解释通过拟合线性SVM给出的可变权重。
(我正在使用scikit-learn):
from sklearn import svm
svm = svm.SVC(kernel='linear')
svm.fit(features, labels)
svm.coef_
我在文档中找不到任何具体说明如何计算或解释这些权重的信息。
体重的迹象与上课有关系吗?
我试图解释通过拟合线性SVM给出的可变权重。
(我正在使用scikit-learn):
from sklearn import svm
svm = svm.SVC(kernel='linear')
svm.fit(features, labels)
svm.coef_
我在文档中找不到任何具体说明如何计算或解释这些权重的信息。
体重的迹象与上课有关系吗?
Answers:
对于一般内核,很难解释SVM权重,但是对于线性SVM,实际上有一个有用的解释:
1)回想一下,在线性SVM中,结果是一个超平面,该平面将类别尽可能地分开。权重通过提供与该超平面正交的矢量坐标来表示该超平面-这些是svm.coef_给定的系数。我们称这个向量为w。
2)我们可以用这个向量做什么?方向为我们提供了预测的类,因此,如果将任意点的点积与向量相乘,则可以判断出它在哪一侧:如果点积为正,则属于正类,如果为负,则为正类属于负面类别。
3)最后,您甚至可以了解每个功能的重要性。这是我自己的解释,因此请先说服自己。假设svm将仅找到一个可用于分离数据的功能,然后超平面将与该轴正交。因此,您可以说该系数相对于其他系数的绝对大小表明了该功能对分离的重要性。例如,如果仅将第一个坐标用于分隔,则w将具有(x,0)的形式,其中x是某个非零数,然后| x |> 0。
该文档非常完整:对于多类情况,基于libsvm库的SVC使用“一对一”设置。在线性核的情况下,n_classes * (n_classes - 1) / 2
为每个可能的类对拟合单个线性二进制模型。因此,连接在一起的所有原始参数的总形状为[n_classes * (n_classes - 1) / 2, n_features]
(属性中的+ [n_classes * (n_classes - 1) / 2
截距intercept_
)。
对于二进制线性问题,coef_
在此示例中完成了从属性绘制分离超平面的操作。
如果需要有关拟合参数含义的详细信息,尤其是对于非线性核的情况,请查看数学公式和文档中提到的参考。
我试图解释通过拟合线性SVM给出的可变权重。
理解权重是如何计算以及如何在线性SVM情况下解释权重的一个好方法是在一个非常简单的示例上手动执行计算。
考虑以下线性可分离的数据集
import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])
SVM理论告诉我们,边距的“宽度”由给出
重新插入方程式中得到的宽度
(我正在使用scikit-learn)
我是吗,这是一些代码来检查我们的手动计算
from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y)
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
- w = [[0.25 -0.25]] b = [-0.75]
- 支持向量的索引= [2 3]
- 支持向量= [[2. 3.] [6. -1。]]
- 每个类别的支持向量数量= [1 1]
- 决策函数中支持向量的系数= [[0.0625 0.0625]]
体重的迹象与上课有关系吗?
并不是真的,权重的符号与边界平面的方程有关。