资讯专栏INFORMATION COLUMN

机器学习 | 预测数值型数据:回归

eternalshallow / 849人阅读

摘要:由于近期学业繁重,所以我就不说废话了,直接上代码线性回归局部加权线性回归代码标准回归函数和数据导入函数默认文本的最后一行为目标值第一列为偏移量,假定为常数第二列为,也就是图中的横坐标计算最佳拟合曲线标识矩阵的转置矩阵转置,变程行向量判断

由于近期学业繁重QAQ,所以我就不说废话了,直接上代码~

线性回归



局部加权线性回归


代码
from numpy import *
import matplotlib.pyplot as plt

#标准回归函数和数据导入函数
#默认文本的最后一行为目标值
#第一列为偏移量,假定为常数1.0
#第二列为x1,也就是图中的横坐标
def loadDataSet(fileName):
    numFeat=len(open(fileName).readline().split("	"))-1
    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.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

#计算最佳拟合曲线
#.T标识矩阵的转置
def standRegres(xArr,yArr):
    xMat=mat(xArr)
    #矩阵转置,变程行向量
    yMat=mat(yArr).T
    #判断xTx的转置与xTx相乘是否为0
    xTx=xMat.T*xMat
    #若为0,那么计算逆矩阵的时候会出错
    if linalg.det(xTx)==0.0:
        print("this matrix is singular,cannot do inverse")
        return
    #计算ws
    #.I返回矩阵的逆
    ws=xTx.I*(xMat.T*yMat)
    return ws
    

#绘制数据集散点图和最佳拟合直线图
def drawFigure():
    xArr,yArr=loadDataSet("ex0.txt")
    ws=standRegres(xArr,yArr)
    xMat=mat(xArr)
    yMat=mat(yArr)
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])
    xCopy=xMat.copy()
    xCopy.sort(0)
    yHat=xCopy*ws
    ax.plot(xCopy[:,1],yHat)
    plt.show()
    
    
#局部加权线性回归
#给待预测的点附近的每个点赋予一定的权重
#在这个子集上基于最小均方差来进行普通的回归
#使用的核为高斯核
#最终构建了一个只含对角元素的权重矩阵w,并且x与x(i)越近,
#w(i,i)将会越大
#局部加权线性回归函数
def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat=mat(xArr)
    yMat=mat(yArr).T
    m=shape(xMat)[0]
    #创建对角矩阵
    #权重矩阵是一个方阵,阶数为样本点的个数
    #该矩阵为每个样本点初始化了一个权重
    weights=mat(eye((m)))
    #遍历数据集,计算每个样本点对应的权重值
    #随着样本点与待预测点距离的递增,权重将以指数级衰减
    #参数k控制衰减的速度
    #权重值大小以指数级衰减
    for j in range(m):
        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):
    m=shape(testArr)[0]
    yHat=zeros(m)
    #为数据集中的每个点调用lwlr()
    for i in range(m):
        yHat[i]=lwlr(testArr[i],xArr,yArr,k)
    return yHat

def drawfigure2():
    xArr,yArr=loadDataSet("ex0.txt")
    #print(yArr[0])
    yHat0=lwlr(xArr[0],xArr,yArr,1.0)
    #print(yHat0)
    yHat=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(111)
    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()
    
    
def main():
    drawfigure2()
    #drawFigure()
    #xArr,yArr=loadDataSet("ex0.txt")
    #ws=standRegres(xArr,yArr)
    #xMat=mat(xArr)
    #yMat=mat(yArr)
    #计算预测值yHat和真实值y的匹配程度——计算两个序列的相关程度
    #yHat=xMat*ws
    #arr=corrcoef(yHat.T,yMat)
    #yHat与yMat的相关系数为0.98
    #[[1.         0.98647356]
    #[0.98647356 1.        ]]
    #print(arr)
    #[[1.0, 0.067732], [1.0, 0.42781],...]
    #print(xArr)
    #[3.176513, 3.816464,...]
    #print(yArr)
    #[[3.00774324]
    #[1.69532264]]
    #Haty=wx[0]*x0+ws[1]*x1
    #print(ws)

if __name__=="__main__":
    main()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43484.html

相关文章

  • 机器学习(三)-单变量线性回归算法

    摘要:在大量对象上应用了回归分析甚至包括人的身高。孩子的高度向着平均高度回退回归。回归的目的是预测数值型的目标值。这就是监督学习算法的一个例子。 @toc 1 预测数值型数据:回归 1.1 什么是回归? 大自然让我们回归到一定的区间范围之内;反过来说就是,有一个平均的水平,可以让突出的事物能向他靠拢。 回归是由达尔文(Charles Darwin)的表兄弟Francis Galton发明的...

    CoderDock 评论0 收藏0

发表评论

0条评论

eternalshallow

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<