机器学习—— 线性回归

一. 单变量线性回归
(一) 基础知识
第一个机器学习算法—— 单变量线性回归
回归: 突出的数据,在经过一段时间之后,总会回归到大部分数据的水平中
在这里插入图片描述

对于一元线性回归(单变量线性回归)来说,学习算法为y = ax + b 在机器学习中,我们可表示为
hθ(x) = θ0 + θ1x1
在这里插入图片描述

模型:

在这里插入图片描述
参数:
θ0, θ1
损失函数:
在这里插入图片描述
目标: 最小化损失函数

hθ (x) - 原函数在这里插入图片描述

Jθ (x) –损失函数
在这里插入图片描述

(二)梯度下降
在这里插入图片描述
在这里插入图片描述
在每个方向上找到梯度下降的最小值,然后合成,就可以使得损失函数最小
算法:
在这里插入图片描述
条件: for j =0 and j=1
其中a 是学习率(也就是步长)如果a 太小,那么梯度下降就会很慢
如果a过大,那么梯度下降可能会越过最小值,不仅不会收敛,反而会发散

同步更新:
theta0 和 theta1 同时一起更新
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

非同步更新:
先更新theta0 , 然后再更新theta1.
(这样做出的结果会使theta1 不准确, 因为theta1 在计算的时候theta0 已经改变了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线性回归的梯度下降

hθ(x) = θ0 + θ1x1
在这里插入图片描述
梯度下降算法
重复执行,直到收敛
在这里插入图片描述

在这里插入图片描述

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)

运行结果为:
在这里插入图片描述
在这里插入图片描述
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)

运行结果为:
在这里插入图片描述

  1. 梯度下降的方向:
  1. 只要对损失函数求导,theta的变化方向就永远趋近于损失函数的最小值
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
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
梯度下降公式:
在这里插入图片描述

一元梯度下降: (n=1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多元梯度下降: (n>1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值