sklearn SVM пользовательское повышение ядра ValueError: X.shape [0] должен быть равен X.shape [1] - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь реализовать собственное ядро, именно экспоненциальное ядро ​​Chi-Squared, чтобы передать в качестве параметра функции sklearn svm, но когда я запускаю его, возникает следующая ошибка: ValueError: X.shape [0] долженбыть равным X.shape [1]

Я читал об операции вещания, выполняемой функциями numpy для ускорения вычислений, но я не могу справиться с ошибкой.

Код:

import numpy as np
from sklearn import svm, datasets

# 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


def my_kernel(x, y):
    gamma = 1
    return np.exp(-gamma * np.divide((x - y) ** 2, x + y))


classifier = svm.SVC(kernel=my_kernel)

classifier = classifier.fit(train_features, train_labels)

print "Train Accuracy : " + str(classifier.score(train_features, train_labels))

Любая помощь?

1 Ответ

0 голосов
/ 21 мая 2018

Я считаю, что ядро ​​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 (хотя бы для небольшого набора данных?)

...