为什么支持向量的数量在SVM中不会改变?

时间:2016-02-14 12:50:06

标签: numpy machine-learning scikit-learn svm

我是scikitlearn lib的新手。我正在使用SVM双类进行模式分类。 我的数据集包含1000个样本(按类别分列500个),但是数量非常高(3000)。

我将数据集分为3个部分:trainset 800个样本,validset 100个样本,测试集为100个样本。

我正在使用此代码:

class1=numpy.genfromtxt("class1.csv",delimiter=',');
class2=numpy.genfromtxt("class2.csv",delimiter=',');

trainset=numpy.concatenate((class1[0:400,:],class2[0:400,:]));
validset=numpy.concatenate((class1[400:450,:],class2[400:450,:]))
testset=numpy.concatenate((class1[450:500,:],class2[450:500,:]))

targettrain=numpy.reshape(numpy.concatenate((numpy.ones((1,400)),numpy.ones((1,400))*2)),(800,));
targetvalid=numpy.reshape(numpy.concatenate((numpy.ones((1,50)),numpy.ones((1,50))*2)),(100,));
targettest=numpy.reshape(numpy.concatenate((numpy.ones((1,50)),numpy.ones((1,50))*2)),(100,));

clf=SVC();
clf.fit(trainset,targettrain);

SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,decision_function_shape=None,degree=3,gamma=.1,kernel='rbf',
            max_iter=-1,probability=False,random_state=None,shrinking=True,tol=0.001,verbose=False);

print clf.score(validset,targetvalid)

print clf.n_support_

这是我的数据data class1 and class2 我注意到,即使我改变伽玛或C,矢量支持的数量也不会改变。 支持向量始终为[270 268]。 意思是什么?这是诅咒维度的问题吗?我读过SVM即使对于具有高维数的数据也可以工作?

1 个答案:

答案 0 :(得分:2)

看起来好像在这一行:

SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,decision_function_shape=None,
    degree=3,gamma=.1,kernel='rbf',max_iter=-1,probability=False,random_state=None,
    shrinking=True,tol=0.001,verbose=False);

您正在尝试为已经实例化的clf分类器设置参数。但是,实际上这样做是为了创建一个未绑定到任何变量名的 new SVC实例。因此,该行对clf的行为没有影响。

第二个问题是你在训练数据上已经调用了.fit 之后尝试更改参数,这实际上没有任何意义。

当你第一次实例化clf时,你应该做的是传递你想要的一组参数:

clf = SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,
          decision_function_shape=None,degree=3,gamma=.1,kernel='rbf',max_iter=-1,
          probability=False,random_state=None,shrinking=True,tol=0.001,
          verbose=False);

clf.fit(trainset,targettrain)   # etc.