一元线性回归模型
回归分析
一元线性回归模型如下所示:(我们只需确定此方程的两个参数即可)
第一个参数为截距,第二个参数为斜率
为了求解上述参数,我们在这里引入代价函数(cost function),在这里以一元线性回归模型为例:
上述式子为真实值与预测值之间的差值的平方(当然也可以取绝对值,但为便于后续数值操作取其平方),最后取所有训练集个数的平均值,结合下图直观理解。
上述由一些参数构成的函数称为代价函数,我们的目标就是求解对应的参数使得代价函数达到最小值,最后确定模型:
相关系数(了解)
相关系数用于衡量线性相关性的强弱:
决定系数(了解)
梯度下降:用于确定所需参数
其具体步骤如下图所示:
此方法在一元线性回归中可以用于确定代价函数,因为代价函数是二维的(两个未知量,凸函数),所以理论上可以收敛于全局最小值(对于高次函数就可能达到局部最小值),如下图:
对于初始化操作,一般情况下赋值为0即可。所谓的梯度优化,就是不断的更改参数值,使之最后到达一个全局(局部)最小值。
这里的参数更新要求是同步更新,即最后在对参数进行更新,这里的α为学习率,通常取值为0.01,0.001,0.03,0.003等学习率不易过高也不能过低,当过高是会导致永远到达不了收敛点(发散),当过低时会导致收敛过慢,影响收敛速度;在这里的一元线性回归模型我们确定的参数只有两个,其参数求解方式如下图所示:
实战
方法一:梯度下降法
步骤一:载入库
import numpy as np #导入numpy
import matplotlib.pyplot as plt #导入图像绘制库
步骤二:读取要进行回归的数据(以CSV为例)
#载入数据
#两列数据,逗号为分隔符
#数据和代码在同一目录下可以直接写文件名,否则要加路径
data=np.getfromtxt("data.csv",delimiter=",")
x_data=data[:,0]
y_data=data[:,1]
步骤三:算法编写
# 设置学习率(步长)和初始化线性参数
lr = 0.0001
b = 0
k = 0
# 最大迭代次数
epochs = 50
# 最小二乘法
def compute_error(b, k, x_data, y_data):
totalError = 0
for i in range(0, len(x_data)):
totalError += (y_data[i] - (k * x_data[i] + b)) ** 2
return totalError / float(len(x_data)) / 2.0
def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
# 计算总数据量
m = float(len(x_data))
# 循环epochs次
for i in range(epochs):
b_grad = 0
k_grad = 0
# 计算梯度的总和再求平均
for j in range(0, len(x_data)):
b_grad += (1/m) * (((k * x_data[j]) + b) - y_data[j])
k_grad += (1/m) * x_data[j] * (((k * x_data[j]) + b) - y_data[j])
# 更新b和k
b = b - (lr * b_grad)
k = k - (lr * k_grad)
# 每迭代5次,输出一次图像
if i % 5==0:
print("epochs:",i)
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data + b, 'r')
plt.show()
return b, k
第四步:调用,得到结果
b, k = gradient_descent_runner(x_data, y_data, b, k, lr, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))
方法二:sklearn
步骤一:调用库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
步骤二:载入数据
#载入数据
#这里的x_data和y_data需要增加维度,从(100,)变为(100,1),这是回归算法要求的
data=np.getfromtxt("data.csv",delimiter=",")
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
步骤三:创建并拟合模型
model = LinearRegression()
model.fit(x_data, y_data)
a=model.coef_ #系数
b=model.intercept_ #bias
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()
这是我学习 覃秉丰老师的《机器学习算法基础》的自学笔记,课程在B站中的地址为: