Я считаю, что ядро Chi-Squared для вас уже реализовано (в from sklearn.metrics.pairwise import chi2_kernel
).
Примерно так:
from functools import partial
from sklearn import svm, datasets
from sklearn.metrics.pairwise import chi2_kernel
# import the iris dataset (http://en.wikipedia.org/wiki/Iris_flower_data_set)
iris = datasets.load_iris()
train_features = iris.data[:, :2] # Here we only use the first two features.
train_labels = iris.target
my_chi2_kernel = partial(chi2_kernel, gamma=1)
classifier = svm.SVC(kernel=my_chi2_kernel)
classifier = classifier.fit(train_features, train_labels)
print("Train Accuracy : " + str(classifier.score(train_features, train_labels)))
====================
РЕДАКТИРОВАТЬ:
Таким образом, выясняется, что вопрос на самом деле о том, как можно реализовать ядро хи-квадрат.Мой выстрел в это будет: -
def my_chi2_kernel(X):
gamma = 1
nom = np.power(X[:, np.newaxis] - X, 2)
denom = X[:, np.newaxis] + X
# NOTE: We need to fix some entries, since division by 0 is an issue here.
# So we take all the index of would be 0 denominator, and fix them.
zero_denom_idx = denom == 0
nom[zero_denom_idx] = 0
denom[zero_denom_idx] = 1
return np.exp(-gamma * np.sum(nom / denom, axis=len(X.shape)))
Так что по сути x - y
и x + y
в попытке ОП неправильны, так как это не парное вычитание или сложение.
Любопытно, чтопользовательская версия, кажется, быстрее, чем цитонизированная версия sklearn (хотя бы для небольшого набора данных?)