Numpy 为什么支持向量机中的支持向量个数不变?

Numpy 为什么支持向量机中的支持向量个数不变?,numpy,machine-learning,scikit-learn,svm,Numpy,Machine Learning,Scikit Learn,Svm,我是ScikitLearnLib的新手。我正在使用SVM双类进行模式分类。 我的数据集包含1000个样本(500个按类),但feautres数非常高(3000个) 我将数据集分为3部分:列车集800个样本,有效集100个样本,测试集100个样本 我正在使用以下代码: class1=numpy.genfromtxt("class1.csv",delimiter=','); class2=numpy.genfromtxt("class2.csv",delimiter=','); trainset=

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

我将数据集分为3部分:列车集800个样本,有效集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_
这是我的数据 我注意到,即使我改变gamma或C,向量支持的数量也不会改变。 支持向量总是[270 268]。
这是什么意思?这是一个诅咒维度的问题吗?我读到支持向量机甚至可以处理高维数据

在这一行中:

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
分类器设置参数。然而,这实际上是创建一个新的
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.

在这一行中看起来:

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
分类器设置参数。然而,这实际上是创建一个新的
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.

我无法使用您提供的数据重现此结果-更改
C
gamma
会导致支持向量的数量按预期变化。您能否准确地显示您是如何生成
列车组
目标列车
?@ali_m,我编辑了我的代码。我仍然无法用上面的确切代码重现您看到的内容。例如,如果我使用
clf=SVC(C=1)
(默认值)初始化,调用
clf.fit(trainset,targettrain)
后,我会看到
clf.n\u support==array([270268],dtype=int32)
。如果我用
clf=SVC(C=0.1)
初始化,我会看到
clf.n\u支持==array([371367],dtype=int32)
。同样,改变
gamma
也会改变支持向量的数量。您尝试过
C
gamma
的哪些值?也许你没有对它们进行足够的修改(尝试至少修改一个数量级)。@ali\m,我的代码设计不正确。在
SVC(C=1,cache\u size=200,class\u weight=None,coef0=0.0,decision\u function\u shape=None,degree=3,gamma=0.1,kernel='rbf',max\u iter=-1,probability=False,random\u state=None,resking=True,tol=0.001,verbose=False)之后,我必须调用
clf.fit(trainset,targettrain)
我怀疑问题在于,您试图设置使用
SVC(C=1,cache_size=200,…)实例化的分类器的参数。。。,‌​冗长=错误),但这会创建一个不绑定到任何变量名的新分类器实例。您应该做的是使用所需参数初始化
clf
,例如
clf=SVC(C=1,cache_size=200。。。,‌​冗长=错误)。此外,在将分类器安装到训练集之后再尝试更改参数也没有任何意义。我无法使用您提供的数据重现此情况-更改
C
gamma
会导致支持向量的数量按预期变化。您能否准确地显示您是如何生成
列车组
目标列车
?@ali_m,我编辑了我的代码。我仍然无法用上面的确切代码重现您看到的内容。例如,如果我使用
clf=SVC(C=1)
(默认值)初始化,调用
clf.fit(trainset,targettrain)
后,我会看到
clf.n\u support==array([270268],dtype=int32)
。如果我用
clf=SVC(C=0.1)
初始化,我会看到
clf.n\u支持==array([371367],dtype=int32)
。同样,改变
gamma
也会改变支持向量的数量。您尝试过
C
gamma
的哪些值?也许你没有对它们进行足够的修改(尝试至少修改一个数量级)。@ali\m,我的代码设计不正确。在
SVC(C=1,cache\u size=200,class\u weight=None,coef0=0.0,decision\u function\u shape=None,degree=3,gamma=0.1,kernel='rbf',max\u iter=-1,probability=False,random\u state=None,resking=True,tol=0.001,verbose=False)之后,我必须调用
clf.fit(trainset,targettrain)
我怀疑问题在于,您试图设置使用
SVC(C=1,cache_size=200,…)实例化的分类器的参数。。。,‌​冗长=错误),但这会创建一个不绑定到任何变量名的新分类器实例。您应该做的是使用所需参数初始化
clf
,例如
clf=SVC(C=1,cache_size=200。。。,‌​冗长=错误)。此外,在将分类器安装到训练集之后尝试更改参数也没有任何意义。