我被分配了一个任务,要开发一个自定义的多项式(阶数为3、4、5)核函数用于SVM,并将其准确性与sklearn内置的多项式核函数进行比较(应该几乎相同)。我试图按照多项式核函数的定义来实现,但我的结果似乎不太相似,这是我的代码:
def poly_kernel_fn(X, Y):# 实现一个多项式核函数# - 参数:两个形状为[n_samples, n_features]的numpy数组# - 返回:计算后的核矩阵,形状为[n_samples, n_samples]K = np.zeros((X.shape[0],Y.shape[0]))K = (X.dot(Y.T) + 1)**4return Kclfpoly = svm.SVC(kernel='poly', degree=4)clfpoly.fit(X_train, y_train)zpoly = clfpoly.predict(X_test)print("内置3D多项式核函数的准确率为: ",accuracy_score(y_test, zpoly)*100,"%")clf = svm.SVC(kernel=poly_kernel_fn)clf.fit(X_train, y_train)z = clf.predict(X_test)print("自定义rbf核函数的准确率为: ",accuracy_score(y_test, z)*100,"%")
准确率结果如下:
- 内置4D多项式核函数的准确率为: 56.99999999999999 %
- 自定义核函数的准确率为: 59.0 %
如果我将多项式的阶数改为3或5,准确率变化会更大,所以我不知道是我做错了什么,还是根本不可能匹配内置的准确率。
感谢您的帮助
回答:
你需要查看多项式情况的定义,网址为
https://scikit-learn.org/stable/modules/svm.html#svm-kernels
coef = 0 和 gamma = 1/(n_features*.var())然后你就能得到相同的结果
from sklearn.datasets import make_classificationfrom sklearn import svmimport numpy as npgamma = None def poly_kernel_fn(X, Y): K = np.zeros((X.shape[0],Y.shape[0])) K = (gamma*X.dot(Y.T))**4 return K if __name__=="__main__": X, Y = make_classification(10, 5) # 随机数据 clf1 = svm.SVC(kernel='poly', degree=4) # 内置函数 clf1.fit(X, Y) print("内置函数得分 = ", clf1.score(X,Y)) gamma = 1/(5*X.var()) clf2 = svm.SVC(kernel=poly_kernel_fn) clf2.fit(X, Y) print("自定义函数得分 = ", clf2.score(X,Y))
In [9]: run main.py内置函数得分 = 0.8自定义函数得分 = 0.8