一. 单变量线性回归

(一) 基础知识

第一个机器学习算法—— 单变量线性回归

回归: 突出的数据,在经过一段时间之后,总会回归到大部分数据的水平中

线性回归的t值 线性回归 t值_损失函数

对于一元线性回归(单变量线性回归)来说,学习算法为y = ax + b 在机器学习中,我们可表示为

hθ(x) = θ0 + θ1x1

线性回归的t值 线性回归 t值_损失函数_02

模型:

线性回归的t值 线性回归 t值_梯度下降_03


参数:

θ0, θ1

损失函数:

线性回归的t值 线性回归 t值_线性回归的t值_04


目标: 最小化损失函数hθ (x) - 原函数

线性回归的t值 线性回归 t值_梯度下降_05

Jθ (x) –损失函数

线性回归的t值 线性回归 t值_损失函数_06

(二)梯度下降

线性回归的t值 线性回归 t值_线性回归的t值_07


线性回归的t值 线性回归 t值_损失函数_08


在每个方向上找到梯度下降的最小值,然后合成,就可以使得损失函数最小

算法:

线性回归的t值 线性回归 t值_梯度下降_09


条件: for j =0 and j=1

其中a 是学习率(也就是步长)如果a 太小,那么梯度下降就会很慢

如果a过大,那么梯度下降可能会越过最小值,不仅不会收敛,反而会发散同步更新:

theta0 和 theta1 同时一起更新

线性回归的t值 线性回归 t值_线性回归的t值_10

线性回归的t值 线性回归 t值_损失函数_11


线性回归的t值 线性回归 t值_梯度下降_12


线性回归的t值 线性回归 t值_线性回归的t值_13

非同步更新:

先更新theta0 , 然后再更新theta1.

(这样做出的结果会使theta1 不准确, 因为theta1 在计算的时候theta0 已经改变了)

线性回归的t值 线性回归 t值_梯度下降_14


线性回归的t值 线性回归 t值_损失函数_15


线性回归的t值 线性回归 t值_梯度下降_16


线性回归的t值 线性回归 t值_线性回归的t值_17

线性回归的梯度下降

hθ(x) = θ0 + θ1x1

线性回归的t值 线性回归 t值_损失函数_18


梯度下降算法

重复执行,直到收敛

线性回归的t值 线性回归 t值_梯度下降_19

线性回归的t值 线性回归 t值_梯度下降_20

eg:
共迭代了100次 , 打印出来的是次数和损失函数

import numpy as np
    
    X = 2 * np.random.rand(100, 1)
    Y = 4 + 3 * X + np.random.randn(100, 1)  # randn : 服从标准正态分布的随机数
    # x_b = theta0x0 + theta1x1 中的x0 ,x1 ,其中x0 永远是1
    X_b = np.c_[np.ones((100, 1)), X]
    # print(X_b)
    
    # 学习率
    learning_rate = 0.03
    # 迭代次数
    n_inerations = 100
    
    # 1. 初始化theta
    theta = np.random.randn(2, 1)  # 【【t1】【t2】】
    count = 0
for inerations in range(n_inerations):
    count += 1
    # 2. 求梯度   dot :点乘
    gradient = 1 / 100 * X_b.T.dot(X_b.dot(theta) - Y)
    # 3. 求theta 值
    theta = theta - learning_rate * gradient
    # 4. 利用损失函数监控模型
    loss = 1 / (2 * 100) * np.sum((X_b.dot(theta) - Y) ** 2)
    print(count, loss)

运行结果为:

线性回归的t值 线性回归 t值_线性回归_21


线性回归的t值 线性回归 t值_线性回归的t值_22


eg2: 模拟三个未知数X1,X2,X3, 根据梯度下降的方法来推断出Y 值,打印出来的是循环的次数,theta的值,和推断出的Y值

import numpy as np

x1 = 2 * np.random.rand(100, 1)
x2 = 4 * np.random.rand(100, 1)
x3 = 6 * np.random.rand(100, 1)

Y = 4 + 3 * x1 + 4 * x2 + 5 * x3 + np.random.randn(100, 1)梯度下降的分类
# x_b =  theta0 *x0 + theta*x1 + theta2* x2 +theta3* x3
X_b = np.c_[np.ones((100, 1)), x1, x2, x3]
print(X_b)

# 学习率
learning_rate = 0.01

# 迭代次数
n_inerations = 1000
# X_b : 100 *4   4*1
# 1. 初始化theta
theta = np.random.randn(4, 1)  # 【【t1】【t2】[t3] [t4]】
count = 0
for inerations in range(n_inerations):
    count += 1
    # 2. 求梯度   dot :点乘
    gradient = 1 / 100 * X_b.T.dot(X_b.dot(theta) - Y)
    print(gradient)
    # 3. 求theta 值
    theta = theta - learning_rate * gradient
print(count)
print(theta)
X_new = [0, 5, 2, 3]  # 1*4   * 4*1
Y_new = np.array(X_new).dot(theta)
print("Y_new: ", Y_new)

运行结果为:

线性回归的t值 线性回归 t值_损失函数_23

  1. 梯度下降的方向:
  2. 只要对损失函数求导,theta的变化方向就永远趋近于损失函数的最小值

线性回归的t值 线性回归 t值_损失函数_24


线性回归的t值 线性回归 t值_梯度下降_25


2 ). 如果theta已经在最低点,那么梯度将不会改变

  1. 梯度下降的步长
    1 ) 梯度下降中非常重要的参数就是每一步的步长,这取决于超参数的学习率
    如果学习率太低,算法需要经过大量的迭代才能收敛,这样会耗费大量的时间
    如果学习率太高,那么会错过最低点,导致算法发散,值越来越大,最终找不到解决问题的方法
    2 ) 梯度下降的步长会逐渐减小
    3 ) 梯度下降的局部最小问题:

    解决梯度下降局部最小问题:
    1 对于MSE 来说,因为损失函数是一个凸函数,所以不存在局部最小的值,只有一个全局最小的值
    2 通过随机初始化theta , 可以避免局部最小值。
    3 对于多变量,高维度的值,就算在某个维度上陷入局部最小的问题,也可以从别的维度解决这个问题。

二. 多变量线性回归
模型:
之前: hθ(x) = θ0 + θ1x
现在: hθ(x) = θ0 + θ1x1 + θ2x2 + … + θnx
为了保证统一性,给模型加上x0 ,并且使x0 =1

多元梯度下降

模型: hθ(x) = θT x = θ0x0 + θ1x1 + θ2x2 + … + θnxn

梯度下降公式:

线性回归的t值 线性回归 t值_损失函数_26

一元梯度下降: (n=1)

线性回归的t值 线性回归 t值_线性回归的t值_27


线性回归的t值 线性回归 t值_线性回归_28


线性回归的t值 线性回归 t值_线性回归_29

多元梯度下降: (n>1)

线性回归的t值 线性回归 t值_损失函数_30


线性回归的t值 线性回归 t值_线性回归的t值_31


线性回归的t值 线性回归 t值_线性回归_32


线性回归的t值 线性回归 t值_线性回归的t值_33


线性回归的t值 线性回归 t值_线性回归的t值_34

  1. 梯度下降的分类
    1). 批梯度下降: “Batch” Gradient Desecent
    指的是没下降一步,使用所有的训练集来计算梯度值
    2). 随机梯度下降:“ Stochastic" Gradient Descent
    指的是每下降一步,使用一条训练集来计算梯度
    3). “Mini—Batch” 梯度下降: “Mini—balth” Gradient Descent
    指的是每下降一步,使用一部分的训练集来计算梯度

特征缩放(归一化)
特征缩放是为了确保特征在一个数量级上