2016-07-31 67 views
-1

我正在学习SVM并且实现了这个代码,它太基本,原始,花费太多时间,但我只是想看看它是如何工作的。不幸的是,它给了我不好的结果。我错过了什么?一些编码错误或数学错误?如果您想查看数据集,请点击此处链接。我从UCI机器学习库中提取它。感谢您的交易。支持向量机坏结果-python

def hypo(x,q): 
    return 1/(1+np.exp(-x.dot(q))) 

data=np.loadtxt('LSVTVoice',delimiter='\t'); 

x=np.ones(data.shape) 
x[:,1:]=data[:,0:data.shape[1]-1] 
y=data[:,data.shape[1]-1] 

q=np.zeros(data.shape[1]) 
C=0.002 

##mean normalization 
for i in range(q.size-1): 
    x[:,i+1]=(x[:,i+1]-x[:,i+1].mean())/(x[:,i+1].max()-x[:,i+1].min()); 

for i in range(2000): 
    h=x.dot(q) 
    for j in range(q.size): 
     q[j]=q[j]-(C*np.sum( -y*np.log(hypo(x,q))-(1-y)*np.log(1-hypo(x,q))) ) + (0.5*np.sum(q**2)) 

for i in range(y.size): 
    if h[i]>=0: 
     print y[i],'1'  
    else: 
     print y[i],'0' 
+0

也许你应该解释一下,什么样的代码做什么。由于我没有看到任何库调用,我想你自己实现了一些svm算法?哪里?第二个循环?那应该是什么? SGD?协调血统? – sascha

回答

0

根据您的数据,这是很平常的是SVM的简单实现给你坏的结果。您必须尝试SVM实施的高级版本(例如Sickit SVM),您还可以检查:https://github.com/scikit-learn/scikit-learn/tree/master/sklearn/svm

SVM具有不同内核(例如rbf)的实现类型和参数。您必须检查它们并尝试使用不同的参数(取决于您的数据)并将结果相互比较。

您可以使用网格搜索方法来比较(检查:http://scikit-learn.org/stable/modules/grid_search.html

+1

尽管这里有一些事实,但我认为这有些误导。我不会调用基于内核的SVMs *高级*(尽管它们更高效地执行更复杂),它们只是一个不同的模型。虽然有证据表明像rbf这样的内核可以逼近任何线性SVM的解决方案(我认为),但许多应用程序使用线性方法(非常高维的数据,如NLP,其中CV很难找到那工作rbf核心)。另外:不同的svm解算器(切平面,sgd,cd)在解决方案上并没有真正的区别,但效率和参数依赖性 – sascha