第三篇:机器学习之代价函数和梯度下降

2018-08-07 16:52:55 浏览数 (1)

二元、多元线性回归方程:

抽象的模型可以转化为下图(未画入 θ0 )

说明:

左端输入特征值x

连线w代表各自的权重

整合运算后得到预测值y

W 和 θ 皆可以代表权重

增加截距 θ0(偏置项)如图左,右图为逻辑回归的形式

将线性回归得到的预测值代入Sigmoid函数后即可变为逻辑回归,

增加隐层和输出就是神经网络了,如图

可以简单地把神经网络看做逻辑回归元构成的网络

从隐层开始每个神经元是上一层逻辑回归的结果并且作为下一层的输入,篇幅限制,我们将在下一篇将详细介绍逻辑回归的公式与代码

上一篇是线性回归,这一篇我们将学习

  1. 学习计算代价函数
  2. 直观理解梯度下降
  3. 线性回归---预测房价

正文开始

1.代价函数

数理统计中我们常用方差衡量一组数据的离散程度,线性回归中则是通过计算样本集中所有的预测值y与所有对应的真实值Y的方差,比较他们的拟合程度。

以一元线性回归为例

三个样本(1,1)(2,2)(3,3)

初始化参数 θ0=0 θ1=0.5

关于 θ0 θ1 的代价函数为:

解释:上标(i)代表样本序号,m代表样本数量

得到代价函数后,调整参数使它们拟合,一种常用的让代价函数J的值最小的方法叫作梯度下降。

2.梯度下降

举例来看,根据某组数据计算得到的参数为 θ0 θ1的代价函数绘制为下图

开始时,我们初始化参数 θ0 θ1,得到的代价函数的值很大,像位于整个模型的山坡上,这意味着我们的线性回归模型的预测值和真实值误差很大,所以梯度下降形象来说就是“沿着最陡的方向下山”

对代价函数J求出θ0 θ1各自的偏导数,然后同时更新(同时更新非常关键),乘上学习率ɑ得到“要下降的高度”自减即完成一次更新,直到拟合为止。

解答:ɑ代表学习率;对多元函数的某一个参数求偏导可以理解为把其他参数看做常数来后对它求斜率,如图得到θ1的斜率

化简

整理

化简偏导数后得到了一元线性回归的梯度下降算法

编程实战——线性回归预测房租

现有一组数据(样本)房子的面积和对应的租金,试预测其走向

数据

算法

代码语言:javascript复制
# 导入必要的库

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# 得到数据
#  square_feet        price

x = [150,200,250,300,350,400,600] # 7所房子的面积
y =  [6450,7450,8450,9450,11450,15450,18450] # 7种面积对应的房租面积
plt.scatter(x,y)

# 数据预处理(特征缩放)
# 可以优化梯度下降的效率

x = np.reshape(x,newshape=(7,1)) / 1000.0
y = np.reshape(y,newshape=(7,1)) / 10000.0
plt.scatter(x,y)

# 线性方程为:h=b a*x

# 算法模型
def model(a, b, x):
    return a*x   b

# 代价函数
def cost_function(a, b, x, y):
    n = 7
    return 0.5/n * (np.square(y-a*x-b)).sum()

# 优化函数
def optimize(a,b,x,y):
    n = 7                         # 样本数
    alpha = 1e-1                  # 学习率
    y_hat = model(a,b,x)          # 预测值
    da = (1.0/n) * ((y_hat-y)*x).sum()     # 参数 a 的偏导
    db = (1.0/n) * ((y_hat-y).sum())       # 参数 b 的偏导
    a = a - alpha*da
    b = b - alpha*db
    return a, b

# 迭代优化
def iterate(a,b,x,y,times):
    for i in range(times):         # 参数更新 times 次
        a,b = optimize(a,b,x,y)
    y_hat=model(a,b,x)             # 训练完的模型
    cost = cost_function(a, b, x, y)   # 误差
    print (a,b,cost)
    plt.scatter(x,y)
    plt.plot(x,y_hat)              # 绘制图表
    return a,b

# 参数初始化

a = 0.1
b = 0.2

# 训练模型2000次

a,b = iterate(a,b,x,y,2000)

0 人点赞