Python中的局部加权线性回归
局部加权线性回归是一种非参数方法/算法。在线性回归中,数据应该是线性分布的,而局部加权回归适用于非线性分布的数据。通常,在局部加权回归中,离查询点更近的点比离它远的点更具权重。
参数化和非参数化模型
参数化
参数化模型是将函数简化为已知形式的模型。它通过这些参数来总结数据。
这些参数的数量是固定的,这意味着模型已经知道这些参数,并且它们不依赖于数据。它们在训练样本方面也是相互独立的。
举个示例,让我们有一个如下所述的映射函数。
b0+b1x1+b2x2=0
从这个方程来看,b0、b1和b2是控制截距和斜率的线的系数。输入变量用x1和x2表示。
非参数方法
非参数算法对映射函数的类型不做特定假设。这些算法不接受一个特定形式的映射函数作为真实的输入和输出数据之间的映射。
它们可以从训练数据中选择任何函数形式。因此,为了估计映射函数的参数模型需要比参数模型更多的数据。
代价函数和权重的推导
线性回归的代价函数是
\mathrm{\displaystyle\sum\limits_{i=1}^m (y^{{(i)}} :-:\Theta^Tx)^2}
对于局部加权线性回归,代价函数被修改为
\mathrm{\displaystyle\sum\limits_{i=1}^m w^i(w^{{(i)}} :-:\Theta^Tx)^2}
其中𝑤(𝑖)表示第i个训练样本的权重。
权重函数可以定义为
\mathrm{w(i):=:exp:(-\frac{x^i-x^2}{2\tau^2})}
x是我们想要进行预测的点。x(i)是第i个训练样本
τ可以被称为权重函数的高斯钟形曲线的带宽。
τ的值可以根据与查询点的距离调整w的值。
τ的较小值意味着数据点与查询点的距离较小,w的值变大(更重要),反之亦然。
w的值通常范围从0到1
局部加权回归算法没有训练阶段。所有的权重𝜃都在预测阶段确定。
示例
让我们考虑一个由以下点组成的数据集:
2,5,10,17,26,37,50,65,82
将查询点 x = 7 和数据集中的三个点 5、10、26 进行计算
因此 x(1) = 5,x(2) = 10,x(3) = 26。设定 𝜏 = 0.5
则,
\mathrm{w(1) = exp( – ( 5 – 7 )^2 / 2 x 0.5^2) = 0.00061}
\mathrm{w(2) = exp( – (9 – 7 )^2 / 2 x 0.5^2) = 5.92196849e-8}
\mathrm{w(3) = exp( – (26 – 7 )^2 / 2 x 0.5^2) = 1.24619e-290}
\mathrm{J(\Theta) = 0.00061 * (\Theta^ T x(1) – y(1) ) + 5.92196849e-8 * (\Theta^ T x(2) – y(2) ) + 1.24619e-290 *( \Theta^ T x(3) – y(3) )}
从上述示例可以看出,查询点(x)与特定数据点/样本 x(1),x(2),x(3) 越接近,w 的值越大。对于远离查询点的数据点,权重逐渐减小/指数下降。
随着 x(i) 和 x 的距离增加,权重减小。这减少了误差项对成本函数的贡献,反之亦然。
Python实现
下面的代码段演示了局部加权线性回归算法。
tips数据集可以从 这里 下载。
示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('/content/tips.csv')
features = np.array(df.total_bill)
labels = np.array(df.tip)
def kernel(data, point, xmat, k):
m,n = np.shape(xmat)
ws = np.mat(np.eye((m)))
for j in range(m):
diff = point - data[j]
ws[j,j] = np.exp(diff*diff.T/(-2.0*k**2))
return ws
def local_weight(data, point, xmat, ymat, k):
wei = kernel(data, point, xmat, k)
return (data.T*(wei*data)).I*(data.T*(wei*ymat.T))
def local_weight_regression(xmat, ymat, k):
m,n = np.shape(xmat)
ypred = np.zeros(m)
for i in range(m):
ypred[i] = xmat[i]*local_weight(xmat, xmat[i],xmat,ymat,k)
return ypred
m = features.shape[0]
mtip = np.mat(labels)
data = np.hstack((np.ones((m, 1)), np.mat(features).T))
ypred = local_weight_regression(data, mtip, 0.5)
indices = data[:,1].argsort(0)
xsort = data[indices][:,0]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(features, labels, color='blue')
ax.plot(xsort[:,1],ypred[indices], color = 'red', linewidth=3)
plt.xlabel('Total bill')
plt.ylabel('Tip')
plt.show()
输出
何时可以使用局部加权线性回归?
- 当特征数量较少时。
-
不需要特征选择时。
局部加权线性回归的优势
-
在局部加权线性回归中,每个数据点都计算局部权重,因此出现大误差的机会较少。
-
拟合出一条曲线,从而最小化误差。
-
在该算法中,存在许多小的局部函数,而不是要最小化一个全局函数。局部函数更有效地调整变化和误差。
局部加权线性回归的缺点
-
这个过程非常耗时,可能会消耗大量的资源。
-
对于较简单的线性相关问题,我们可以简单地避免使用局部加权算法。
-
无法容纳大量的特征。
结论
所以,简而言之,局部加权线性回归更适用于数据分布非线性的情况下,我们仍然希望用回归模型拟合数据而不会降低预测质量的情况。