一元线性回归

2020-09-24  本文已影响0人  WuYankang

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()

最后的结果:


一元线性回归
上一篇下一篇

猜你喜欢

热点阅读