机器学习(七):回归

算法介绍

回归,一般都是指线性回归(linear regression),本文的回归和线性回归代表同一
个意思。线性回归意味着可以将输人项分别乘以一些常量,再将结果加起来得到输出。
应当怎样从一大堆数据里求出回归方程呢?假定输人数据存放在矩阵X中,而回归系数存放
在向量W中。那么对于给定的数据 X 1 X{_{1}} , 预测结果将会通过
Y 1 = X 1 T W Y_{1}= {X_{1}}^{T}W
给出。现在的问题是,手里有一些 X 1 X{_{1}} 和对应的y怎样才能找到W呢? 一个常用的方法就是找出使误差最小的W这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差
平方误差公式:
在这里插入图片描述
用矩阵表示还可以写做

在这里插入图片描述
对W求导,
在这里插入图片描述
令其等于零,解出w如下

在这里插入图片描述

算法实现

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    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.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

def standRegres(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws

测试代码

if __name__ == '__main__':
    xArr,yArr = loadDataSet('ex0.txt')
    ws = standRegres(xArr,yArr)
    print(ws)
    xMat=mat(xArr)
    yMat =mat(yArr)
    yHat = xMat* ws
    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()

得到的ws的结果为

[[ 3.00774324]
[ 1.69532264]]

在这里插入图片描述

总结

发布了44 篇原创文章 · 获赞 0 · 访问量 1036

猜你喜欢

转载自blog.csdn.net/LTC_1234/article/details/102934772
今日推荐