机器学习-线性回归和局部加权线性回归

限于喜欢 提交于 2020-11-10 02:29:24

机器学习-线性回归

本文代码均来自于《机器学习实战》

分类算法先说到这里,接下来说一个回归算法

线性回归

线性回归比较简单,就不怎么说了,要是模型记不得了就百度一下吧,这里列一下公式就直接上代码了

2019

'''
Created on Jan 8, 2011

@author: Peter
'''
from numpy import *
#加载数据
def loadDataSet(fileName):      #general function to parse tab -delimited floats
    #attribute的个数
    numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields 
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr =[]
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        #dataMat是一个二维矩阵,labelMat是一维的
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat
#就是,简单的线性回归
def standRegres(xArr,yArr):
    #这里没有出现为特征X加1列,因为它已经写在数据中了2333,要是数据中没有的话是要写的。
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat#这个是X的转置乘以X
    if linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    #.I在numpy中是求逆矩阵
    ws = xTx.I * (xMat.T*yMat)
    return ws

线性回归的一个问题就是可能会出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计,所以如果模型欠拟合的话将不能得到最好的预测效果.所以有些方法允许在估计中引如一些偏差,从而降低预测的均方误差。其中一个方法就是局部加权线性回归

---来源当然是《机器学习实战》

局部加权线性回归

这页书中干货比较多,就直接放上来了

22222

看见没,人家是用了核函数的,和你们印象中那个傻白甜的线性回归不一样!知道书里为什么把它放在SVM后面了吧

那么这个局部加权线性回归是何方神圣呢?看到网上一个比较靠谱的博客,摘录如下:

来源:http://cynhard.com/2018/07/13/ML-Locally-Weighted-Linear-Regression/

(由于这位博主用了插件来显示公式,我就偷懒截图了2333)

1571410661767

1571410674874

可以看到,所谓“加权”不是直接加在直线方程上的,而是加在损失函数上、用来使函数“跑偏”的。

划重点:已知样本距离预测样本越近,权重越大;k越大,权重随距离减小的速度越慢

局部加权回归是基于非参数学习算法的思想,使得特征的选择更好。赋予预测点附近每一个点以一定的权值,在这上面基于波长函数来进行普通的线性回归.可以实现对临近点的精确拟合同时忽略那些距离较远的点的贡献,即近点的权值大,远点的权值小,k为波长参数,控制了权值随距离下降的速度,越大下降的越快。越小越精确并且太小可能出现过拟合的问题。

算法的缺点主要在于对于每一个需要预测的点,都要重新依据整个数据集模拟出一个线性回归模型出来,使得算法的代价极高。———————————————— 版权声明:本文为CSDN博主「美麗突然發生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/tianse12/article/details/70161591

局部加权线性回归是不需要“学习”的,属于和KNN一样的性质,这点性质甚至还不如线性回归

代码如下:

'''
Created on Jan 8, 2011

@author: Peter
'''
from numpy import *
#局部加权线性回归,需要手动选择一个合适的k
#输入的是一个向量而不是矩阵,它一次只能处理一个预测!有点捞
def lwlr(testPoint,xArr,yArr,k=1.0):
    #x和y是训练集样本
    xMat = mat(xArr); yMat = mat(yArr).T
    #m是样本个数
    m = shape(xMat)[0]
    #创建一个对角单位矩阵用来保存权重w
    #使用矩阵而不是向量的原因是为了最后用矩阵乘法好算,公式里面也是这样写的
    weights = mat(eye((m)))
    for j in range(m):                      #next 2 lines create weights matrix
        #一个样本计算一遍,填到weight中
        diffMat = testPoint - xMat[j,:]     #
        weights[j,j] = 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
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws
#对多个待回归点进行回归
def lwlrTest(testArr,xArr,yArr,k=1.0):  #loops over all the data points and applies lwlr to each one
    m = shape(testArr)[0]
    yHat = zeros(m)
    for i in range(m):
        yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    return yHat
#输出x和y坐标,比lwlrTest更方便将结果画出来
def lwlrTestPlot(xArr,yArr,k=1.0):  #same thing as lwlrTest except it sorts X first
    yHat = zeros(shape(yArr))       #easier for plotting
    xCopy = mat(xArr)
    xCopy.sort(0)#按第一个特征排个序
    for i in range(shape(xArr)[0]):
        yHat[i] = lwlr(xCopy[i],xArr,yArr,k)
    return yHat,xCopy
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!