我想在sklearn中编写线性内核回归的代码,于是我编写了以下代码:
model = LinearRegression()weights = rbf_kernel(X_train,X_test)for i in range(weights.shape[1]): model.fit(X_train,y_train,weights[:,i]) model.predict(X_test[i])
然后我发现sklearn中有KernelRidge:
model = KernelRidge(kernel='rbf')model.fit(X_train,y_train)pred = model.predict(X_train)
我的问题是:
1-这两个代码之间的区别是什么?2-在KernelRidge()之后的model.fit()中,我在文档中发现可以向fit()函数添加第三个参数“weight”,如果我已经对模型应用了内核函数,我该如何操作?
回答:
- 这两个代码片段之间的区别是什么?
基本上,它们没有任何共同点。你的第一个代码片段实现了线性回归,并任意设置了样本的权重。(你怎么会想到这样调用rbf_kernel
?)这仍然只是一个线性模型,仅此而已。你只是(有点随机地)指定了哪些样本重要,然后在特征上循环(?)。这完全没有意义。总的来说:你对rbf_kernel
的使用是完全错误的;这完全不是它应该被使用的方式(这就是为什么当你试图将其传递给fit方法时会出错,你最终不得不进行循环并单独传递每一列)。
将这种模型拟合到均值为0的余弦数据的示例:
- 我发现
KernelRidge()
之后的model.fit()
函数的文档中可以添加第三个参数weight
。如果我已经对模型应用了内核函数,我应该这样做吗?
这是真正的内核方法,内核不是样本加权。(人们可能会使用内核函数来分配权重,但这不是“线性内核回归”或一般“内核方法”中内核的含义。)内核是一种向分类器引入非线性的方法,这源于许多方法(包括线性回归)可以表示为向量之间的点积,可以用内核函数替代,从而在不同的空间中解决问题(再生希尔伯特内核空间),该空间可能具有非常高的复杂性(如RBF内核诱导的连续函数的无限维空间)。
拟合到上述相同数据的示例:
from sklearn.linear_model import LinearRegressionfrom sklearn.kernel_ridge import KernelRidgeimport numpy as npfrom matplotlib import pyplot as pltX = np.linspace(-10, 10, 100).reshape(100, 1)y = np.cos(X)for model in [LinearRegression(), KernelRidge(kernel='rbf')]: model.fit(X, y) p = model.predict(X) plt.figure() plt.title(model.__class__.__name__) plt.scatter(X[:, 0], y) plt.plot(X, p) plt.show()