svm 自定义内核 PYTHON 错误

svm CUSTOM KERNEL PYTHON ERROR

我正在尝试在 python 中制作自定义内核。这是我的代码:

from sklearn import datasets
from sklearn.svm import SVC
from sklearn import svm

from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt
import PIL
from PIL import Image
import pylab as pl 
import math

digits = datasets.load_digits()


X = digits.data[:-200]

Y = digits.target[:-200]



def kernal6(x,y):
    d=np.linalg.norm(x-y)
    Xn=np.linalg.norm(x)
    Yn=np.linalg.norm(y)
    return (Xn+Yn-d)/np.sqrt(Xn*Yn)    


clf5 = svm.SVC(kernel=kernal6)
clf5.fit(X,Y)

但我一直收到此错误:

IndexError: 元组索引超出范围

IndexError 表示您正在尝试访问未定义的索引的 array/tuple 值。唯一一次尝试访问元组(它说 tuple 索引超出范围)是在声明 XY 时。因此,这一定是切片符号的问题。我认为原因是因为元组没有多于或等于200个元素(array[:-200] returns len(array) - 200,这可能又是一个负整数);但是,我不能 运行 你的代码,因为我的解释器会抛出错误,所以如果我错了,我很抱歉。

您 return 输入了错误的值。核函数应该return一个矩阵。查看 this 以查看正确内核函数的示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

digits = datasets.load_digits()
X = digits.data[:-200, :2]  #You were doing this wrong too
Y = digits.target[:-200]

def my_kernel(x, y):
    M = np.array([[2, 0], [0, 1.0]])
    return np.dot(np.dot(x, M), y.T) #returns a matrix

def kernal6(x,y):
    d=np.linalg.norm(x-y)
    Xn=np.linalg.norm(x)
    Yn=np.linalg.norm(y)
    return (Xn+Yn-d)/np.sqrt(Xn*Yn) #returns a float    

print "Testing SVC with my_kernel"
clf = svm.SVC(kernel=my_kernel)
clf.fit(X, Y) #works fine
print "Success!"

print "Testing kernal6"
print "kernal6 direct call:",kernal6(X, X) #will return a result
clf = svm.SVC(kernel=kernal6)
try:
    clf.fit(X, Y)#fails
except:
    print "Failed to fit with kernal6"