目录

回归问题:

基本步骤:以线性模型为例

step1:模型假设,选择模型框架(线性模型)

step2:模型评估,如何判断众多模型的好坏(损失函数)

step3:模型优化,如何筛选最优的模型(梯度下降)

进一步地:

1.引入1元N次线性函数以构建更强大复杂的模型。

 2.输入处理

 3.正则化 Regularization

demo

ref


回归问题:

建立输入输出的映射关系,相较于分类问题,回归问题的输出为连续数值。

基本步骤:以线性模型为例

下述三个步骤以李宏毅机器学习为框架,结合自身有关认识做整理:

step1:模型假设,选择模型框架(线性模型)

对于线性模型Linear model,依据特征数量多少可分为一元线性模型和多元线性模型。模型可假设为:

回归问题用什么神经网络 回归问题模型_回归

 

回归问题用什么神经网络 回归问题模型_回归_02

:就是各种特征(fetrure),对于一元线性模型,仅有1个特征。

 

回归问题用什么神经网络 回归问题模型_机器学习_03

:各个特征的权重 wcp,whp,ww,wh,⋅⋅w_{cp},w_{hp},w_w,w_h,··wcp,whp,ww,wh,⋅⋅

 

回归问题用什么神经网络 回归问题模型_损失函数_04

:偏移量

回归问题用什么神经网络 回归问题模型_回归问题用什么神经网络_05

step2:模型评估,如何判断众多模型的好坏(损失函数)

对于训练好的模型,如何评价模型拟合的好坏?损失函数即是用来指定优化方向、评价训练效果。

损失函数评价模型预测性能,可用的有k阶距、中心距、原点矩等指标,最常用的是二阶矩。

线性问题类似于最小二乘方法。

回归问题用什么神经网络 回归问题模型_线性模型_06

step3:模型优化,如何筛选最优的模型(梯度下降)

根据计算得到的损失函数数值,需要将误差进行反向传播以修正模型中的参数。
 

回归问题用什么神经网络 回归问题模型_线性模型_07

具体来说,   

步骤1:随机选取一个 w0
步骤2:计算微分,也就是当前的斜率,根据斜率来判定移动的方向
        大于0向右移动(增加w)
        小于0向左移动(减少w)
步骤3:根据学习率(下图中 \eta 参数)移动
重复步骤2和步骤3,直到找到最低点

回归问题用什么神经网络 回归问题模型_线性模型_08

 w和b优化方法相同。以w为例,结合最大似然估计方法,

       

回归问题用什么神经网络 回归问题模型_回归问题用什么神经网络_09

下降速率的求解方法按照梯度进行:

回归问题用什么神经网络 回归问题模型_机器学习_10

 

回归问题用什么神经网络 回归问题模型_线性模型_11

 梯度下降存在的问题:critical points(局部最小、局部最大、鞍点)、梯度爆炸、梯度消失

  • 问题1:当前最优(Stuck at local minima)
  • 问题2:等于0(Stuck at saddle point)
  • 问题3:趋近于0(Very slow at the plateau)

进一步地:

1.引入1元N次线性函数以构建更强大复杂的模型。

毫无疑问,这使得模型的拟合能力提升,但同时导致随着模型参数的增多、对于训练数据拟合能力的增强,有可能产生过拟合的问题,即模型对于训练数据拟合良好、但对于验证或测试数据表现不佳。

回归问题用什么神经网络 回归问题模型_回归_12

 2.输入处理

将不同特征组合成矩阵作为一个输入构建预测模型,同时尽可能增加特征到模型中来

回归问题用什么神经网络 回归问题模型_回归_13

回归问题用什么神经网络 回归问题模型_损失函数_14

 3.正则化 Regularization

回归问题用什么神经网络 回归问题模型_损失函数_15

  • w 越小,表示 function 较平滑的, function输出值与输入值相差不大
  • 在很多应用场景中,并不是 w 越小模型越平滑越好,但是经验值告诉我们 w越小大部分情况下都是好的。
  • b的值接近于0 ,对曲线平滑是没有影响

应该来说,w越小,对应的输入越不敏感,反映到loss function上就越平滑。

demo

按照线性模型进行预测,采用梯度下降来找到合适的w和b。

需要环境:Python、numpy、matplotlib、pylab

回归问题用什么神经网络 回归问题模型_损失函数_16

 

import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

# matplotlib没有中文字体,动态解决
plt.rcParams['font.sans-serif'] = ['Simhei']  # 显示中文
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

x_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.]
y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.]
x_d = np.asarray(x_data)
y_d = np.asarray(y_data)

x = np.arange(-200, -100, 1)
y = np.arange(-5, 5, 0.1)
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)

# loss
for i in range(len(x)):
    for j in range(len(y)):
        b = x[i]
        w = y[j]
        Z[j][i] = 0  # meshgrid吐出结果:y为行,x为列
        for n in range(len(x_data)):
            Z[j][i] += (y_data[n] - b - w * x_data[n]) ** 2
        Z[j][i] /= len(x_data)

# 先给b和w一个初始值,计算出b和w的偏微分
# linear regression
#b = -120
#w = -4
b=-2
w=0.01
lr = 0.000005
iteration = 1400000

b_history = [b]
w_history = [w]
loss_history = []
import time
start = time.time()
for i in range(iteration):
    m = float(len(x_d))
    y_hat = w * x_d  +b
    loss = np.dot(y_d - y_hat, y_d - y_hat) / m
    grad_b = -2.0 * np.sum(y_d - y_hat) / m
    grad_w = -2.0 * np.dot(y_d - y_hat, x_d) / m
    # update param
    b -= lr * grad_b
    w -= lr * grad_w

    b_history.append(b)
    w_history.append(w)
    loss_history.append(loss)
    if i % 10000 == 0:
        print("Step %i, w: %0.4f, b: %.4f, Loss: %.4f" % (i, w, b, loss))
end = time.time()
print("大约需要时间:",end-start)

# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))  # 填充等高线
plt.plot([-188.4], [2.67], 'x', ms=12, mew=3, color="orange")
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$')
plt.ylabel(r'$w$')
plt.title("线性回归")
plt.show()