手动实现内核SVM的decision_function()

问题描述 投票:0回答:0

我正在尝试实现内核 SVM 的 decision_function(),这里 decision_function() 意味着基于 decision_function() 模型返回的值将数据点分类为正或负。

我写了下面的代码,但那里有一些错误

def kernel(params, Supp_vecs, X_train):
        return [math.exp(-params['gamma'] * np.dot(i - X_train, i - X_train)) for i in Supp_vecs]
    
def decision_function(params, Supp_vecs, number_of_Supp_vecs, Supp_vecs_dual_coefs, intercept, X_train):
    ''' params = model parameters
        Supp_vecs = support vectors
        number_of_Supp_vecs = # of support vectors per class
        Supp_vecs_dual_coefs  = dual coefficients
        intercept  = intercepts 
        X_train  = feature to predict       
    '''
    # calculating the kernels here:
    k = kernel(params, Supp_vecs, X_train)

    # define the start and end index for support vectors for each class
    start = [sum(number_of_Supp_vecs[:i]) for i in range(len(number_of_Supp_vecs))]
    end = [start[i] + number_of_Supp_vecs[i] for i in range(len(number_of_Supp_vecs))]

    # calculate: sum(a_p * k(x_p, x)) between every 2 classes
    c = [ sum(Supp_vecs_dual_coefs[ i ][p] * k[p] for p in range(start[j], end[j])) +
          sum(Supp_vecs_dual_coefs[j-1][p] * k[p] for p in range(start[i], end[i]))
                for i in range(len(number_of_Supp_vecs)) for j in range(i+1,len(number_of_Supp_vecs))]

    # add the intercept
    return [sum(i) for i in zip(c, intercept)]
# define model
clf = SVC(C=100, kernel='rbf', degree=3, gamma=0.001, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None)

# fit model
clf.fit(X_train,y_train)

# support vectors
indices_SVec = clf.support_
Supp_vecs = clf.support_vectors_   
Supp_vecs_dual_coefs = clf.dual_coef_
intercept = clf.intercept_
number_of_Supp_vecs = clf.n_support_
params = clf.get_params()

当我尝试运行此功能时:

decision = decision_function(params, Supp_vecs, number_of_Supp_vecs, Supp_vecs_dual_coefs, intercept, X_train)

它给我以下错误:

ValueError: shapes (3200,5) and (3200,5) not aligned: 5 (dim 1) != 3200 (dim 0)

所以,我尝试调试我的代码,我认为由于 X_train 和 Supp_vecs 的大小不同,这个错误正在发生。但是,我很困惑,因为两者是非常不同的东西,所以为什么它们的尺寸应该相同。

print(X_train.shape)
print(Supp_vecs.shape)

result is:
(3200, 5)
(613, 5)

我不确定我的代码是否不正确,或者我对此的理解需要对该主题进行一些澄清,我们将不胜感激。

machine-learning scikit-learn svm
© www.soinside.com 2019 - 2024. All rights reserved.