【问题标题】:sklearn SVM custom kernel raise ValueError: X.shape[0] should be equal to X.shape[1]sklearn SVM 自定义内核引发 ValueError: X.shape[0] 应该等于 X.shape[1]
【发布时间】:2018-10-29 14:22:07
【问题描述】:

我正在尝试实现一个自定义内核,即指数卡方内核,作为参数传递给 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))

有什么帮助吗?

【问题讨论】:

  • 第一篇文章做得很好。

标签: python numpy machine-learning classification svm


【解决方案1】:

我相信卡方内核已经为您实现(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)))

所以本质上,OP 的尝试中的 x - yx + y 是错误的,因为它不是成对的减法或加法。

奇怪的是,自定义版本似乎比 sklearn 的 cythonized 版本更快(至少对于小型数据集?)

【讨论】:

  • 是的,但我需要自己实现
  • 怎么回事? sklearn 的chi2_kernel 在性能上非常优化..
  • 他们要求我去
  • ...自己实现一个内核函数,我选择了这个。所以,我想找到这个错误的解决方案,并更好地理解为什么会出现这个错误,这在未来的情况下也很有用。你能帮忙弄清楚吗?
  • 为什么不使用包含火车标签的 y 数组?当调用 svm 的 fit 函数时,它会将具有特征和标签的两个数组传递给内核,并用于计算
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 2019-09-19
  • 2022-09-28
  • 2018-12-01
  • 2018-04-16
  • 2019-09-09
  • 2021-02-19
  • 2014-05-08
相关资源
最近更新 更多