zoukankan      html  css  js  c++  java
  • 机器学习-线性回归和局部加权线性回归

    机器学习-线性回归

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

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

    线性回归

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

    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('	')) - 1 #get number of fields 
        dataMat = []; labelMat = []
        fr = open(fileName)
        for line in fr.readlines():
            lineArr =[]
            curLine = line.strip().split('	')
            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
    
  • 相关阅读:
    CSS3--5.颜色属性
    CSS3---4.伪元素选择器
    CSS3---3.相对父元素的伪类
    CSS3---2.兄弟选择器(准确来说叫弟弟选择器,只能向下选)
    CSS3---简介与现状
    CSS3---1.属性选择器
    HTML5---22.LocalStorage的应用
    HTML5---21.SessionStorage的应用
    HTML5---19.地理定位的接口使用
    一首新裤子歌曲
  • 原文地址:https://www.cnblogs.com/jiading/p/11701420.html
Copyright © 2011-2022 走看看