Numpy 为什么支持向量机中的支持向量个数不变?
我是ScikitLearnLib的新手。我正在使用SVM双类进行模式分类。 我的数据集包含1000个样本(500个按类),但feautres数非常高(3000个) 我将数据集分为3部分:列车集800个样本,有效集100个样本,测试集100个样本 我正在使用以下代码: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=
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。。。,冗长=错误)代码>。此外,在将分类器安装到训练集之后尝试更改参数也没有任何意义。