簡體   English   中英

Sklearn SVM 自定義rbf核函數

[英]Sklearn SVM custom rbf kernel function

我正在為 sklearn 的 SVC 類創建自定義 rbf 函數,如下所示:

def rbf_kernel(x, y, gamma):
    dis = np.sqrt(((x.reshape(-1, 1)) - y.reshape(1, -1)) ** 2)
    return np.exp(-(gamma*dis)**2)


def eval_kernel(kernel):
    model = SVC(kernel=kernel, C=C, gamma=gamma, degree=degree, coef0=coef0)
    model.fit(X_train, y_train)
    X_test_predict = model.predict(X_test)
    acc = (X_test_predict == y_test).sum() / y_test.shape[0]
    return acc

for k1, k2 in [('rbf', lambda x, y: rbf_kernel(x, y, gamma))]:
    acc1 = eval_kernel(k1)
    acc2 = eval_kernel(k2)

    assert(abs(acc1 - acc2) < eps)

X_train 的形狀是 (396, 10),y_train 是 (396, 10),X_test 是 (132, 10)。 但是,當我嘗試運行它時,我收到一條錯誤消息:

ValueError: X.shape[1] = 3960 should be equal to 396, the number of samples at training time

似乎錯誤是由於 X_test 和 X_train 的維度不同造成的,但是有什么辦法可以解決這個錯誤?

先感謝您!

您的 rbf 內核編寫不正確。 您需要返回一個矩陣 (n_samples, n_samples)。 在您的代碼中,您基本上解開了所有內容,因此出現了錯誤。 您可以參考sklearn 使用的 rbf_kernel實際代碼,如果我們插入它,它將起作用:

from sklearn.datasets import make_classification
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

X,y = make_classification(528)

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25)

def my_kernel(X, Y, gamma=0.1):
    K = euclidean_distances(X, Y, squared=True)
    K *= -gamma
    np.exp(K, K)  # exponentiate K in-place
    return K

def eval_kernel(kernel):
    model = SVC(kernel=kernel,gamma=0.1)
    model.fit(X_train, y_train)
    X_test_predict = model.predict(X_test)
    acc = (X_test_predict == y_test).sum() / y_test.shape[0]
    return acc

eval_kernel('rbf')
0.8409090909090909

eval_kernel(my_kernel)
0.8409090909090909

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM