2016-07-31 2 views
-1

Я изучаю SVM и реализовал этот код, он слишком простой, примитивный и занимает слишком много времени, но я просто хотел посмотреть, как он работает на самом деле. К сожалению, это дает мне плохие результаты. Что я упустил? Некоторая ошибка кодирования или математические ошибки? Если вы хотите посмотреть набор данных, это ссылка здесь. Я взял его из UCI Machine Learning Repository. Спасибо за вашу сделку.Поддержка векторной машины плохие результаты-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

Хотя здесь есть некоторые истины, я думаю, что это немного вводит в заблуждение. Я бы не назвал SVM на основе ядра * расширенным * (хотя они более сложны для эффективного внедрения), это просто другая модель. И хотя есть доказательства, что ядро ​​вроде rbf может аппроксимировать решение любого линейного SVM (я думаю), многие приложения работают лучше с линейным подходом (очень высокоразмерные данные, такие как NLP, где CV слишком много работает, чтобы найти это рабочее rbf-ядро). Также: разные svm-solvers (cut-plane, sgd, cd) на самом деле не отличаются от решений, но эффективность и параметрическая зависимость – sascha