Python中的局部加权线性回归

Python中的局部加权线性回归

本地加权线性回归是一种非参数方法/算法。在线性回归中,数据应该是线性分布的,而局部加权回归则适用于非线性分布的数据。一般来说,在局部加权回归中,离查询点较近的点比离查询点较远的点获得更多的权值。

参数化和非参数化模型

参数化

参数模型是那些将函数简化为已知形式的模型。它有一个参数的集合,通过这些参数来总结数据。

这些参数的数量是固定的,这意味着模型已经知道这些参数,它们不依赖于数据。它们在性质上也与训练样本无关。

作为一个例子,让我们有一个映射函数,如下所述。

b0+b1x1+b2x2=0

从方程中,b0、b1和b2是控制截距和斜率的直线的系数。输入变量由x1和x2表示。

非参数化

非参数算法不对映射函数的种类做出特别的假设。这些算法不接受输入和输出数据之间的特定形式的映射函数为真。

他们可以自由地从训练数据中选择任何函数形式。因此,对于参数模型估计映射函数,它们需要比参数模型多得多的数据。

成本函数和权重的推导

线性回归的成本函数为

Python中的局部加权线性回归

在局部加权线性回归的情况下,成本函数被修改为

Python中的局部加权线性回归

其中𝑤(𝑖)表示第i个训练样本的权重。

加权函数可定义为

Python中的局部加权线性回归

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

因此,

Python中的局部加权线性回归

从上面的例子可以看出,查询点(x)离特定的数据点/样本x(1),x(2),x(3)等越近,w的值就越大,对于远离查询点的数据点,权重会呈指数级下降。

随着x(i)和x之间的距离增加,权重就会减少。这就减少了误差项对成本函数的贡献,反之亦然。

用Python实现

下面的片段演示了一个局部加权的线性回归算法。

提示数据集可从[ 这里 ]下载(https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv)

示例

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()

输出

Python中的局部加权线性回归

什么时候可以使用局部加权的线性回归?

  • 当特征的数量较少时。

  • 当不需要进行特征选择时

局部加权的线性回归的优势

  • 在局部加权线性回归中,局部权重的计算与每个数据点有关,因此出现大误差的机会较少。

  • 我们拟合出一条弧线,结果是误差最小。

  • 在这种算法中,有许多小的局部函数,而不是一个要最小化的全局函数。局部函数在调整变化和误差方面更加有效。

局部加权的线性回归的劣势

  • 这个过程是非常详尽的,可能会消耗大量的资源。

  • 对于线性相关的问题,我们可以简单地避免使用局部加权算法,因为这些问题比较简单。

  • 不能容纳大量的功能。

总结

因此,简而言之,局部加权线性回归更适合于这样的情况:我们有一个非线性分布的数据,但我们仍然希望用回归模型来拟合数据,而不影响预测的质量。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程