线性回归
线性回归模型:y^=w1x1+w2x2+b,其中w1,w2称作权重,b称作偏差,它们是线性回归模型的参数。求这些参数的过程就是回归。一旦有了这些参数,在给定输入下做预测也就非常容易了。将输入带入回归方程,即可得到预测值。
训练数据:一组数据称为一个样本,其中x1,x2称为特征,特征用来表征样本的特点,y称为标签。一般我们采集m个样本组成训练数据。
损失函数:在模型训练中,我们需要衡量预测值y^与真实值y之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。
训练模型:训练模型就是找出使得平均误差最小的参数的过程。因为只有这样得到的参数w1,w2,b才可以使得预测值y^更加接近真实值y。
优化算法:梯度下降法。
from numpy import *
import numpy as np
#生成训练数据
w1_=2
w2_=-3.4
b_=4.2 #设置参数w1_,w2_,b_
x_data = np.random.normal(loc=0.0, scale=1.0, size=(1000,2)) #随机生成均值为0 方差为1的正态分布
y_data = w1_ * x_data[:,0] + w2_ * x_data[:,1] + b_ #计算真实值y_data
#损失函数(平均平方误差)
def compute_error(w1,w2,b, x_data, y_data):
totalError = 0
for i in range(0, len(x_data)): #len计算样本个数 通过循环逐个求误差
y_hat=(w1*x_data[i][0]+w2*x_data[i][1])+ b #计算预测值
totalError += (y_data[i] - y_hat) ** 2 #计算每个样本的平方误差并求和
return totalError / float(len(x_data)) / 2.0 #除以样本个数n计算平均值
#梯度下降
def gradient_descent_runner(x_data, y_data,w1,w2, b, lr, epochs): #lr 学习率 epoch 训练次数
# 计算总数据量
m = float(len(x_data))
# 循环epochs次
for i in range(epochs):
w1_grad=0
w2_grad=0
b_grad = 0
# 计算梯度的总和再求平均 (损失函数对每个参数的求导)
for j in range(0, len(x_data)):
w1_grad += (1 / m) * x_data[j][0] * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
w2_grad += (1 / m) * x_data[j][1] * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
b_grad += (1 / m) * (((w1 * x_data[j][0] + w2 * x_data[j][1]) + b) - y_data[j])
# 更新b和k
w1=w1-(lr*w1_grad) #新的参数=旧的参数-学习率*旧的参数
w2=w2-(lr*w2_grad)
b = b - (lr * b_grad)
# 每迭代5次,输出一次图像
error=compute_error(w1,w2,b, x_data, y_data)
if i % 100==0:
print('迭代次数:%d, 误差:%f'%(i,error))
return w1,w2,b
#初始化训练参数
w1=0
w2=0
b=0
lr = 0.01
epochs =500
#训练模型(得出最佳参数)
w1, w2, b=gradient_descent_runner(x_data, y_data,w1,w2, b, lr, epochs)
#初始设置的参数 vs 训练出来的参数
print('w1_=%2f, w2_=%2f, b_=%2f' % (w1_,w2_,b_))
print('w1=%2f, w2=%2f, b=%2f' % (w1,w2,b))
扫一扫,关注我们
每天一个小程序,开开心心学python