我正在尝试实现内核 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)
我不确定我的代码是否不正确,或者我对此的理解需要对该主题进行一些澄清,我们将不胜感激。