📜  ML |局部加权线性回归(1)

📅  最后修改于: 2023-12-03 14:44:19.443000             🧑  作者: Mango

ML | 局部加权线性回归

简介

局部加权线性回归(Locally Weighted Linear Regression,LWLR)是一种非参数回归方法,通过给每个数据点分配不同的权重来对数据建立局部线性模型。与其他线性回归方法不同,LWLR不仅关注整体数据的趋势,还能考虑数据点之间的差异,能够准确地表示数据的局部特征。在回归预测中,LWLR的表现通常比其他线性回归方法更好。

原理

LWLR采用最小二乘法对线性模型进行拟合,但与简单线性回归不同的是,在预测过程中,它使用核函数(Kernel)来计算每个数据点的权重,将具有相似特征的数据点赋予更高的权重,相反的,与预测点距离较远的数据点则有较低的权重。这样,就可以得到更精准的局部线性模型。值得注意的是,LWLR需要在每个待预测点附近都计算一个局部线性模型,因此它比其他线性回归方法更加计算密集。

实现

下面是LWLR的Python实现,其中核函数可自行选择,如常用的高斯核函数。


import numpy as np

def kernel(point, xmat, k):
    """
    核函数,计算点point与数据集xmat的权重
    """
    m = xmat.shape[0]
    weights = np.eye((m))
    for i in range(m):
        diff = point - xmat[i]
        weights[i, i] = np.exp(diff * diff.T / (-2.0 * k ** 2))
    return weights

def lwlr(testPoint, xmat, ymat, k=1.0):
    """
    局部加权线性回归
    """
    # 数据矩阵和目标变量矩阵
    xmat = np.mat(xmat)
    ymat = np.mat(ymat).T
    m = np.shape(xmat)[0]
    # 初始化权重
    weights = np.mat(np.eye((m)))
    # 循环计算每个数据点的权重
    for i in range(m):
        wei = kernel(testPoint, xmat, k)
        weights[i, i] = wei[i, i]
    # 计算回归系数
    xTx = xmat.T * (weights * xmat)
    if np.linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    ws = xTx.I * (xmat.T * (weights * ymat))
    return testPoint * ws

感谢阅读,希望本文能帮助您更好地理解LWLR算法的原理和实现。