一元线性回归
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()
最后的结果:
一元线性回归