我想在Python中自己实现高斯核函数,只是为了练习。我正在使用:sklearn.svm.SVC(kernel=my_kernel)
,但我真的不明白发生了什么。
我期望函数my_kernel
将以矩阵X
的列作为参数调用,但我得到的是将X
、X
作为参数调用。看示例也没有更清楚的解释。
我错过了什么?
这是我的代码:
'''
Created on 15 Nov 2014
@author: Luigi
'''
import scipy.io
import numpy as np
from sklearn import svm
import matplotlib.pyplot as plt
def svm_class(fileName):
data = scipy.io.loadmat(fileName)
X = data['X']
y = data['y']
f = svm.SVC(kernel = 'rbf', gamma=50, C=1.0)
f.fit(X,y.flatten())
plotData(np.hstack((X,y)), X, f)
return
def plotData(arr, X, f):
ax = plt.subplot(111)
ax.scatter(arr[arr[:,2]==0][:,0], arr[arr[:,2]==0][:,1], c='r', marker='o', label='Zero')
ax.scatter(arr[arr[:,2]==1][:,0], arr[arr[:,2]==1][:,1], c='g', marker='+', label='One')
h = .02 # step size in the mesh
# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, m_max]x[y_min, y_max].
Z = f.predict(np.c_[xx.ravel(), yy.ravel()])
# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z)
plt.xlim(np.min(arr[:,0]), np.max(arr[:,0]))
plt.ylim(np.min(arr[:,1]), np.max(arr[:,1]))
plt.show()
return
def gaussian_kernel(x1,x2):
sigma = 0.5
return np.exp(-np.sum((x1-x2)**2)/(2*sigma**2))
if __name__ == '__main__':
fileName = 'ex6data2.mat'
svm_class(fileName)
Xval
是我们想要预测的值。我们使用已知标签y
在训练集x
上进行训练,但我们不知道Xval
的标签是什么,因此我们需要对它们进行预测。 - arturompX
和Xval
的大小不需要相同,它们只需要具有相同数量的列(在m
乘以n
矩阵中的n
),就像您期望训练数据和要预测的数据一样(即它们不应该具有相同数量的样本,但应该具有相同数量的特征)。 - arturompX
是一个 622x9 的矩阵,y
是一个 622x1 的矩阵,Xval
(即我的交叉验证集)是 266x9。当我运行上述代码时,在预测时出现以下错误:`svm/base.py",第455行,validate_for_predict (X.shape[1], self.shape_fit[0]))ValueError: X.shape[1] = 9 应该等于 622,即训练时的样本数` - Vinit Nayakmy_array.T
。 - arturomp