Python 反向支持向量机:计算预测

Python 反向支持向量机:计算预测,python,scikit-learn,regression,svm,Python,Scikit Learn,Regression,Svm,我想知道,考虑到支持向量机回归模型的回归系数,是否可以“手工”计算该模型的预测。 更准确地说,假设: svc = SVR(kernel='rbf', epsilon=0.3, gamma=0.7, C=64) svc.fit(X_train, y_train) 然后,您可以使用 y_pred = svc.predict(X_test) 我想知道如何通过直接计算得到这个结果。从决策函数开始, 其中,K是RBF核函数,b是截距,alpha是对偶系数 因为我使用RBF内核,所以我是这样开始的: d

我想知道,考虑到支持向量机回归模型的回归系数,是否可以“手工”计算该模型的预测。 更准确地说,假设:

svc = SVR(kernel='rbf', epsilon=0.3, gamma=0.7, C=64)
svc.fit(X_train, y_train)
然后,您可以使用

y_pred = svc.predict(X_test)
我想知道如何通过直接计算得到这个结果。从决策函数开始, 其中,
K
是RBF核函数,
b
是截距,alpha是对偶系数

因为我使用RBF内核,所以我是这样开始的:

def RBF(x,z,gamma,axis=None):
    return np.exp((-gamma*np.linalg.norm(x-z, axis=axis)**2))


for i in len(svc.support_):
    A[i] = RBF(X_train[i], X_test[0], 0.7)
然后我算了一下

np.sum(svc._dual_coef_*A)+svc.intercept_
但是,此计算的结果与
y_pred
的第一项不同。我怀疑我的推理不完全正确和/或我的代码不是它应该是的,因此,如果这不是正确的问题,请道歉。在过去的两个小时里,我一直在瞎盯着这个问题,所以任何帮助都将不胜感激

更新

经过进一步研究,我发现了以下帖子:和。 在第一篇文章中,他们讨论了回归,在第二篇文章中讨论了分类,但思想保持不变。在这两种情况下,OP的要求基本相同,但当我尝试实现他们的代码时,我总是在步骤中遇到错误

diff = sup_vecs - X_test
形式

ValueError: operands could not be broadcast together with shapes 

(number equal to amount of support vectors,7) (number equal to len(Xtest),7)
我不明白为什么支持向量的数量应该等于测试数据的数量。据我所知,情况几乎从未如此。那么,有没有人能告诉我们应该如何更普遍地处理这个问题,即如何改进代码,使其适用于多维数组


注意:与问题无关,但更准确地说:7是功能的数量。

您犯的错误是
中的i in len(svc.support):
此循环

在第一个n_SV(支持向量数)训练点上循环,不一定是支持向量。因此,只需在svc.support\u vectors上循环即可获得实际的支持向量。代码的其余部分保持不变。下面我提供了代码和更正

from sklearn import datasets
from sklearn.svm import SVR

# Load the IRIS dataset for demonstration
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Train-test split
X_train, y_train = X[:140], y[:140]
X_test, y_test = X[140:], y[140:]

print(X.shape, X_train.shape, X_test.shape) # prints (150, 4) (140, 4) (10, 4)

# Fit a rbf kernel SVM
svc = SVR(kernel='rbf', epsilon=0.3, gamma=0.7, C=64)
svc.fit(X_train, y_train)

# Get prediction for a point X_test using train SVM, svc
def get_pred(svc, X_test):

    def RBF(x,z,gamma,axis=None):
        return np.exp((-gamma*np.linalg.norm(x-z, axis=axis)**2))

    A = []
    # Loop over all suport vectors to calculate K(Xi, X_test), for Xi belongs to the set of support vectors
    for x in svc.support_vectors_:
        A.append(RBF(x, X_test, 0.7))
    A = np.array(A)

    return (np.sum(svc._dual_coef_*A)+svc.intercept_)

for i in range(X_test.shape[0]):
    print(get_pred(svc, X_test[i]))
    print(svc.predict(X_test[i].reshape(1,-1))) # The same oputput by both