Machine learning 核回归与线性核回归相同吗?
我想在sklearn中编写线性内核回归,因此我编写了以下代码:Machine learning 核回归与线性核回归相同吗?,machine-learning,scikit-learn,regression,Machine Learning,Scikit Learn,Regression,我想在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 = KernelRidg
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-这两种代码之间的区别是什么? 在KernelRidge()之后的model.fit()中,我在文档中发现,我可以为fit()函数添加第三个参数“weight”,如果我已经将一个内核函数应用于该模型,我会这样做吗
rbf\u内核的?)这仍然只是一个线性模型,仅此而已。您只需(随机地)指定哪些样本是重要的,然后在特征(?)上循环。这毫无意义。总的来说:您使用的rbf\u内核
完全是错误的;这完全不是应该如何使用它(以及为什么当您试图将它传递给fit方法时,它会给您错误,而您最终执行了一个循环并分别传递了每个列)
将此类模型拟合为余弦(因此平均值为0)数据的示例:
我在KernelRidge()
之后的model.fit()
函数的文档中发现,我可以添加第三个参数weight
。如果我已经对模型应用了内核函数,我会这样做吗
这是实际的内核方法,内核不是样本权重。(可以使用核函数来分配权重,但这不是“线性核回归”或一般“核方法”中的核的含义。)核是一种将非线性引入分类器的方法,这是因为许多方法(包括线性回归)可以表示为向量之间的点积,它可以被核函数代替,从而在不同的空间(再生希尔伯特核空间)中解决问题,这可能具有非常高的复杂性(如RBF核诱导的连续函数的无限维空间)
与上述数据相同的拟合示例:
首先谢谢,我意识到我的错误,因为我现在知道:在“内核回归”中使用内核不同于在“局部加权线性回归”中使用内核在“内核回归”中我们使用它作为x0和X之间距离的权重,“内核回归”这里是懒惰的学习者,但在“内核线性回归”中我们用它作为一种向模型中引入非线性的方法,“核线性回归”是一种渴望学习的方法。“核回归”是任何使用核技巧的回归的“袋术语”,因此“核线性回归”是“核回归”以及“支持向量回归”的一种特定类型。使用核函数计算权重不是“核回归”。拟合函数中的权重只是数据在梯度下降中构造回归线的权重(就像我们使用boosting时数据中的权重),但是如何将权重项添加到线性回归的闭式解\beta=(K(X^T,X)+\lambda i)^{-1}是的,我想它的名字是Nadaraya–Watson内核回归,它写的是“使用内核作为加权函数”在“内核线性回归”和“局部加权线性回归”之间有区别吗
from sklearn.linear_model import LinearRegression
from sklearn.kernel_ridge import KernelRidge
import numpy as np
from matplotlib import pyplot as plt
X = 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()