【机器学习】局部加权线性回归

一、问题引入
这里写图片描述
我们现实生活中的很多数据不一定都能用线性模型描述。依然是房价问题,很明显直线非但不能很好的拟合所有数据点,而且误差非常大,但是一条类似二次函数的曲线却能拟合地很好。为了解决非线性模型建立线性模型的问题,我们预测一个点的值时,选择与这个点相近的点而不是所有的点做线性回归。基于这个思想,便产生了局部加权线性回归算法。在这个算法中,其他离一个点越近,权重越大,对回归系数的贡献就越多。

二、问题分析
本算法依然使用损失函数J,只不过是加权的J函数:
这里写图片描述
其中w(i)是权重,它根据要预测的点与数据集中的点的距离来为数据集中的点赋权值。当某点离要预测的点越远,其权重越小,否则越大。一个比较好的权重函数如下:
这里写图片描述
该函数称为指数衰减函数,其中k为波长参数,它控制了权值随距离下降的速率,该函数形式上类似高斯分布(正态分布),但并没有任何高斯分布的意义。该算法解出回归系数如下:
这里写图片描述
在使用这个算法训练数据的时候,不仅需要学习线性回归的参数,还需要学习波长参数。这个算法的问题在于,对于每一个要预测的点,都要重新依据整个数据集计算一个线性回归模型出来,使得算法代价极高。

三、代码实现
1.Matlab版
(1) 局部加权线性回归函数

% 对所有点计算估计值
function yHat = lwlr(testMat, xMat, yMat, k)
    [row, ~] = size(testMat);
    yHat = zeros(1, row);
    for i = 1:1:row
        yHat(i) = lwlrPoint(testMat(i,:), xMat, yMat, k);
    end
end
% 对单个点计算估计值
function yHatPoint = lwlrPoint(point, xMat, yMat, k)
     [row , ~] = size(xMat);
     weights = zeros(row, row);
     for i = 1:1:row
         diffMat = point - xMat(i, :);
         weights(i,i) = exp(diffMat * diffMat.' / (-2.0 * (k ^ 2)));    %计算权重对角矩阵
     end
     xTx = xMat.' * (weights * xMat);   % 奇异矩阵不能计算
     if det(xTx) == 0
         printf('This matrix is singular, cannot do inverse');
     end
     theta = xTx^-1 * (xMat.' * (weights * yMat));          %计算回归系数
     yHatPoint = point * theta;
end

(2) 导入数据并绘图

clc;
clear all;
data = load('D:\\ex0.txt');
x = data(:,1:2);  
y = data(:,3);
y_hat = lwlr(x, x, y, 0.01);    % 调用局部加权线性回归函数计算估计值
x_axis = (x(:, 2))';            % x坐标轴为x矩阵的第二列数据
y_axis = y';                
sort(x_axis);                   % 对x向量升序排列
plot(x_axis, y, 'r.');          % 散点图
hold on
plot(x_axis, y_hat, 'b.');      %回归曲线图

(3) 分别选取k=1.0,0.01,0.003绘图如下:
这里写图片描述
图1 k=1.0 欠拟合
这里写图片描述
图2 k=0.01 最佳拟合
这里写图片描述
图3 k=0.003 过拟合

2.Python版
(1)局部加权线性回归函数

from numpy import *

# 对某一点计算估计值
def lwlr(testPoint, xArr, yArr, k = 1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye((m)))
    for i in range(m):
        diffMat = testPoint - xMat[i, :]
        weights[i, i] = exp(diffMat * diffMat.T/(-2.0 * k**2))      # 计算权重对角矩阵
    xTx = xMat.T * (weights * xMat)                                 # 奇异矩阵不能计算
    if linalg.det(xTx) == 0.0:
        print('This Matrix is singular, cannot do inverse')
        return
    theta = xTx.I * (xMat.T * (weights * yMat))                     # 计算回归系数
    return testPoint * theta

# 对所有点计算估计值
def lwlrTest(testArr, xArr, yArr, k = 1.0):
    m = shape(testArr)[0]
    yHat = zeros(m)
    for i in range(m):
        yHat[i] = lwlr(testArr[i], xArr, yArr, k)
    return yHat

(2)导入数据并绘图

import matplotlib.pyplot as plt
from locally_weighted_linear_regression import LocallyWeightedLinearRegression as lwlr
from numpy import *

xArr, yArr = lwlr.loadDataSet('ex0.txt')
yHat = lwlr.lwlrTest(xArr, xArr, yArr, 0.01)
xMat = mat(xArr)
strInd = xMat[:, 1].argsort(0)
xSort = xMat[strInd][:, 0, :]

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(xSort[:, 1], yHat[strInd])
ax.scatter(xMat[:, 1].flatten().A[0], mat(yArr).T.flatten().A[0], s = 2, c = 'red')
plt.show()

(3)分别选取k=1.0,0.01,0.003绘图如下:
这里写图片描述
图1 k=1.0 欠拟合
这里写图片描述
图2 k=0.01 最佳拟合
这里写图片描述
图3 k=0.003 过拟合

四、结果分析:很明显,当k=1.0时,回归曲线与散点图欠拟合(underfitting),此时权重很大,如同将所有数据视为等权重,相当于普通线性回归模型;当k=0.01时得到了很好的效果;当k=0.003时,回归曲线与散点图过拟合(overfitting),由于纳入了太多的噪声点,拟合的直线与数据点过于贴近,此时也不属于理想的模型。

  • 16
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
机器学习在金融领域中越来越受到关注,其中股价预测是应用场景之一。机器学习方法预测股价常用的有机森林、lstm、svm、线性回归四种方法。 机森林是一种分类器集成方法,它可以处理高维数据和大规模数据集自动选择特征,通过分离数据集,特征选择和集成分类器生成,可以在股票市场中获得很高的精度。但是随着数据规模的增大,机森林的运行时间会变长,同时机森林难以应对非线性数据。 lstm,长期短时记忆网络,是一种递归神经网络,常用于处理序列信号。在股票市场中,lstm可以利用时间序列数据进行预测。由于股票价格存在明显的时间序列特征,lstm在预测股票价格方面表现良好。但是,lstm对于极端情况下的噪声和可能的局部最优解比较敏感。 支持向量机svm,是一种分类器,它利用核函数将数据从原始空间映射到具有更高维度的特殊空间,从而使数据更容易分类。 在股票市场中,svm通过将数据划分为不同的类别,来预测股票价格的走势。但svm需要更多的数据,因此预测真实效果也需要数据支持。 线性回归是一种简单的机器学习方法之一。它是一种用于估计输入变量与输出变量之间关系的统计学方法。在线性回归模型中,假设输入变量和输出变量之间存在线性关系,通过对所有输入变量进行加权求和和截距项的操作,可以预测股票价格。线性回归具有很好的可解释性,而且速度快,但是线性假设过于简单,不能处理非线性关系,因此需要更复杂的模型。 综上所述,机森林、lstm、svm、线性回归四种方法都有其适用的范围和局限性,在预测股票价格时需要根据具体情况进行选择。当然,这些机器学习方法准确性和预测效果可能会受到很多其他因素的影响,例如数据质量、特征选择和算法优化等。因此,需要针对具体应用场景进行实际测试和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值