机器学习算法实现——线性回归(python)

线性回归

1.数据集

0.067732,3.176513
0.427810,3.816464
0.995731,4.550095
0.738336,4.256571
0.981083,4.560815
0.526171,3.929515
0.378887,3.526170
0.033859,3.156393
0.132791,3.110301
0.138306,3.149813
0.247809,3.476346
0.648270,4.119688
0.731209,4.282233
0.236833,3.486582
0.969788,4.655492
0.607492,3.965162
0.358622,3.514900
0.147846,3.125947
0.637820,4.094115
0.230372,3.476039
0.070237,3.210610
0.067154,3.190612
0.925577,4.631504
0.717733,4.295890
0.015371,3.085028
0.335070,3.448080
0.040486,3.167440
0.212575,3.364266
0.617218,3.993482
0.541196,3.891471

把数据存到2.txt文件中

2.导入数据集并画出散点图

def loadDataSet(fileName):
    xArr = []; yArr = []
    for line in open(fileName).readlines():
        curLine = line.strip().split(',')
        xonerow = [1.0]   #添加1.0作为第一个系数,则第一个系数的权重用来代表y=wx+b中的b变量
        for i in range(len(curLine)-1):
            xonerow.append(float(curLine[i]))  #最后一列为输出结果值y,前面的值为输入x值
        xArr.append(xonerow)
        yArr.append(float(curLine[-1]))  #添加最后一列为结果值
    return xArr, yArr
def plotDataSet():
    xArr,yArr=loadDataSet('2.txt')
    xcord=[xArr[i][1]for i in range(len(xArr))]
    ycord=[yArr[i] for i in range(len(yArr))]
    fig=plt.figure()
    ax=fig.add_subplot(111)            #参数111代表只有一行一列位置是1
    ax.scatter(xcord,ycord,s=20,c='blue',alpha=1)
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()
plotDataSet()


3.最小二乘法

w=(XTX)1XTy

# 最小二乘法计算回归系数。xArr为样本数据集,包含m个对象,n种属性。yarr为结果数据集
def standRegres(xArr,yArr):
    xMat=np.mat(xArr)       #转化为x矩阵。生成m行n列
    yMat=np.mat(yArr).reshape(len(yArr),1)      #转化为y列向量
    xTx=xMat.T*xMat         #计算回归系数
    if np.linalg.det(xTx)==0.0:     #对不能求逆的结果返回
        print "奇矩阵,不能求逆"
        return
    ws=xTx.I*(xMat.T*yMat)
    return ws
# 绘制样本数据集,求解回归曲线,绘制回归曲线。regression为计算回归系数的函数
def plotRegression(regression):
    # 计算回归系数
    xArr, yArr = loadDataSet('2.txt')  # 加载数据集
    ws = regression(xArr, yArr)  # 计算回归系数列向量
    print(ws)

    xMat = np.mat(xArr)  # 创建xMat矩阵
    yMat = np.mat(yArr)  # 创建yMat矩阵(行向量)
    xarr = xMat[:, 1].flatten().A[0]  # 将矩阵第一列转化为一行矩阵,并获取第一行的列表
    yarr = yMat.flatten().A[0]  # 将矩阵第一列转化为一行矩阵,并获取第一行的行向量
    plt.scatter(xarr, yarr, s=20, c='blue', alpha=.5)  # 绘制样本点

    # 绘制回归系数。通过两个待测点,预测其值。以直线的形式反映出回归系数。
    testArr = np.array([[1, 0], [1, 1]])  # 将对象[1,0]和对象[1,1]最为待测对象,第一个1为常值代表偏量,后面的分量代表属性x的值
    yHat = np.dot(testArr, ws)  # 计算使用线性模型预测的y值。dot就是矩阵乘法。
    plt.plot(testArr[:, 1], yHat, c='red')  # 绘制回归曲线,x为第1列,y为结果列向量,
    plt.xlabel('X');
    plt.ylabel('Y')
    plt.show()

if __name__ == '__main__':
    plotRegression(standRegres)

standRegres函数根据输入输出,计算回归系数w。
plotRegression函数绘制散点图和回归直线。

输出结果为
[[ 3.02863046]
[ 1.6314263 ]]

即线性模型为y=3.02+1.63*x

4.梯度下降

def gradAscent(xArr,yArr):
    xMatrix = np.mat(xArr)                                        #转换成numpy的矩阵。xMatrix每行为一个对象,每列为一种特征属性
    yMatrix = np.mat(yArr).reshape(len(yArr),1)            #转换成numpy的矩阵,并变维成列向量
    m, n = np.shape(xMatrix)                                            #返回dataMatrix的大小。m为样本对象的个数,n为列数。
    alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    maxCycles = 500                                                      #最大迭代次数
    weights = np.ones((n,1))                                             #初始化权重列向量
    for k in range(maxCycles):
        h =  xMatrix * weights                               #梯度上升矢量化公式,计算预测值(列向量)
        error = h - yMatrix                                            #计算误差
        weights = weights - alpha * 2 * xMatrix.T * error                 # 调整回归系数
    return weights.getA()
使用上面的plotRegression函数
if __name__ == '__main__':
    plotRegression(gradAscent)

输出结果

[[ 3.01830318]

 [ 1.65370732]]


参考文章:

https://blog.csdn.net/luanpeng825485697/article/details/78933084

点击打开链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值