美文网首页
一元线性回归

一元线性回归

作者: WuYankang | 来源:发表于2020-09-24 17:18 被阅读0次

    B站覃秉丰机器学习课程实战练习,感兴趣的小伙伴可以去看原视频学习,老师讲的很仔细,没时间看视频学习的小伙伴也可以看我的练习代码,作为小白的我是从最简单的一元线性回归学起,可能也许大概会持续更新🙃


    基础知识

    回归分析(Regression):建立方程模拟两个或多个变量之间的关联,最简单的回归就是一元线性回归了。

    一元线性回归
    代价函数(Cost Function):用于评估回归方程和真实值之间的误差。对于一元线性回归,代价函数是以θ0和θ1为自变量的函数。
    代价函数
    回归分析目的:求解代价函数的最小值,以确定θ0和θ1。
    梯度下降法(Gradient Descent):梯度下降法求解最优模型,使得代价函数达到全局最小值或局部极小值。梯度下降的过程是先初始化θ0和θ1,之后不断改变θ0和θ1,直到代价函数达到全局最小值或局部最小值。θ0/θ1每次改变多少呢?Δθ的值为代价函数J对θ0或θ1求在(θ0,θ1)处的偏导再乘以学习率(learning rate),分别求出Δθ0和Δθ1后同时更新θ0和θ1。下图是梯度下降的过程。
    梯度下降法
    代价函数求导函数比较简单,结果为下图:
    梯度下降法
    之后就是通过程序实现梯度下降的过程。

    Python实现一元线性回归

    import numpy as np
    import matplotlib.pyplot as plt
    #随机生成x,y,在y=x上下浮动
    x = np.arange(10,100) + np.random.uniform(-10,10,90)
    y = np.arange(10,100) + np.random.uniform(-10,10,90)
    #画个散点图
    plt.scatter(x,y)
    plt.show()
    
    散点图
    #学习率
    lr = 0.0001
    #初始化截距/theta0/bias
    b = 0
    #初始化斜率/theta1
    k = 0
    #最大迭代次数
    epochs = 50
    
    #代价函数
    def cost(b, k, x, y):
        the_cost = 0
        for i in range(len(x)):
            the_cost += ((b + k * x[i]) - y[i])**2
        return the_cost / 2*len(x)
    
    #梯度下降
    def gradient_descent_runner(b,k,x,y,lr,epochs):
        #样本点数量
        m = len(x)
        #循环epochs次进行梯度下降
        for i in range(epochs):
            b_grad = 0
            k_grad = 0
            for j in range(m):
                b_grad += (1/m)*(b+k*x[j]-y[j])
                k_grad += (1/m)*(b+k*x[j]-y[j])*x[j]
            b = b - b_grad * lr
            k = k - k_grad * lr
    
            #每循环5次进行一次输出,感受一下梯度下降的过程
            if i % 5 == 0:
                print('###第{}次循环###'.format(i+1)) 
                print('b={}'.format(b))
                print('k={}'.format(k))
                print('cost is {}'.format(cost(b,k,x,y)))  
                plt.plot(x, y, 'b.')
                plt.plot(x, k*x+b, 'r')
                plt.show()
            
        return b, k
    
    result = gradient_descent_runner(b,k,x,y,lr,epochs)
    print('The final model is:')
    print('b = {}'.format(result[0]))
    print('k = {}'.format(result[1]))
    print('Error = {}'.format(cost(result[0],result[1],x,y)))
      
    

    结果:


    一元线性回归

    Sklearn 实现一元线性回归

    通过sklearn实现一元线性回归就非常简单了。

    from sklearn.linear_model import LinearRegression
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    datadf = pd.read_csv('data0.csv')    #从文件中读取数据,数据和上面类似
    x = datadf['x']     #x,y类型为series      
    y = datadf['y']
    plt.scatter(x, y)
    x = x[:, np.newaxis]    #x在列上新增一维, model输入要求为2D。也可使用reshape
    y = y[:, np.newaxis]    #y可不增加维度
    
    model = LinearRegression()
    model.fit(x, y)
    
    #画模型拟合线
    plt.plot(x, y, 'b.')
    plt.plot(x, model.predict(x), 'r')
    plt.show()
    

    最后的结果:


    一元线性回归

    相关文章

      网友评论

          本文标题:一元线性回归

          本文链接:https://www.haomeiwen.com/subject/xqzzyktx.html