2016-02-14 108 views
0

我是scikitlearn lib的新手。我正在使用SVM雙類來進行模式分類。 我的數據集包含1000個樣本(每班500個),但特徵數非常高(3000)。爲什麼支持向量在支持向量機中不會改變?

我把數據集分成3部分:trainset800個樣本,validset100個樣本和測試集是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即使數據具有高維度也可以工作嗎?

+0

我不能使用你提供的數據重現此支持向量的數量按預期變化。你能準確地展示你如何生成trainset和targettrain嗎? –

+0

@ali_m,我編輯了我的代碼。 – Jeanne

+0

我仍然無法用上面的確切代碼重現您所看到的內容。例如,如果我使用'clf = SVC(C = 1)'(默認)進行初始化,則在調用'clf.fit(trainset)後,我會看到'clf.n_support_ == array([270,268],dtype = int32) ,targettrain)'。如果我使用'clf = SVC(C = 0.1)'初始化,我看到'clf.n_support_ == array([371,367],dtype = int32)''。同樣,改變'gamma'也會改變支持向量的數量。你試過了什麼'C'和'gamma'的值?也許你沒有改變它們(嘗試改變它們至少一個數量級)。 –

回答

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分類。但是,實際做的是創建一個未綁定到任何變量名稱的新實例 。因此該行對clf的行爲沒有影響。

第二個問題是您試圖在之後更改參數您已經在您的訓練數據上調用了.fit,這沒有任何意義。

你應該做的,而不是被傳遞所需的參數設定,當您首先實例clf: - 改變是`C`或`gamma`原因

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.