Ответ 1
Прочитав ответ выше, а также некоторые другие вопросы и сайты (1, 2, 3, 4, 5), я поставил это вместе для гауссовского ядра в svm.SVC()
.
Вызовите svm.SVC()
с kernel=precomputed
svm.SVC()
.
Затем вычислите матрицу грамм aka Kernel Matrix (часто сокращенно K).
Затем используйте эту матрицу грамм в качестве первого аргумента (то есть X) для svm.SVC().fit()
:
Я начинаю со следующего кода:
C=0.1
model = svmTrain(X, y, C, "gaussian")
который вызывает sklearn.svm.SVC()
в svmTrain()
, а затем sklearn.svm.SVC().fit()
:
from sklearn import svm
if kernelFunction == "gaussian":
clf = svm.SVC(C = C, kernel="precomputed")
return clf.fit(gaussianKernelGramMatrix(X,X), y)
вычисление матрицы Грама - используется как параметр для sklearn.svm.SVC().fit()
- выполняется в gaussianKernelGramMatrix()
:
import numpy as np
def gaussianKernelGramMatrix(X1, X2, K_function=gaussianKernel):
"""(Pre)calculates Gram Matrix K"""
gram_matrix = np.zeros((X1.shape[0], X2.shape[0]))
for i, x1 in enumerate(X1):
for j, x2 in enumerate(X2):
gram_matrix[i, j] = K_function(x1, x2)
return gram_matrix
который использует gaussianKernel()
для получения ядра радиальной базисной функции между x1 и x2 (мерой подобия, основанной на гауссовском распределении, центрированном на x1 с сигма = 0,1):
def gaussianKernel(x1, x2, sigma=0.1):
# Ensure that x1 and x2 are column vectors
x1 = x1.flatten()
x2 = x2.flatten()
sim = np.exp(- np.sum( np.power((x1 - x2),2) ) / float( 2*(sigma**2) ) )
return sim
Затем, как только модель будет обучена этому настраиваемому ядру, мы прогнозируем "ядро [custom] между тестовыми данными и данными обучения":
predictions = model.predict( gaussianKernelGramMatrix(Xval, X) )
Короче говоря, для использования настраиваемого гауссового ядра SVM вы можете использовать этот фрагмент:
import numpy as np
from sklearn import svm
def gaussianKernelGramMatrixFull(X1, X2, sigma=0.1):
"""(Pre)calculates Gram Matrix K"""
gram_matrix = np.zeros((X1.shape[0], X2.shape[0]))
for i, x1 in enumerate(X1):
for j, x2 in enumerate(X2):
x1 = x1.flatten()
x2 = x2.flatten()
gram_matrix[i, j] = np.exp(- np.sum( np.power((x1 - x2),2) ) / float( 2*(sigma**2) ) )
return gram_matrix
X=...
y=...
Xval=...
C=0.1
clf = svm.SVC(C = C, kernel="precomputed")
model = clf.fit( gaussianKernelGramMatrixFull(X,X), y )
p = model.predict( gaussianKernelGramMatrixFull(Xval, X) )