当前位置:   article > 正文

梯度下降法求解多元线性回归模型_基于梯度下降的多元线性回归方法

基于梯度下降的多元线性回归方法

机器学习多元线性回归模型

如果有两个或两个以上的自变量,这样的线性回归分析就称为多元线性回归

实际问题中,一个现象往往是受多个因素影响的,所以多元线性回归比一元线性回归的实际应用更广
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

梯度下降法求解线性回归

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
退化到一元线性回归,就有
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

梯度下降法法参数

  • α 在梯度下降算法中被称作为学习率或者步长
  • 这意味着我们可以通过 α 来控制每一步走的距离,以保证不要走太快,错过了最低点;同时也要保证收敛速度不要太慢
  • 所以 α 的选择在梯度下降法中往往是很重要的,不能太大也不能太小

在这里插入图片描述

梯度下降法和最小二乘法

相同点

  • 本质和目标相同:两种方法都是经典的学习算法,在给定已知数据的前提下利用求导算出一个模型(函数),使得损失函数最小,然后对给定的新数据进行估算预测

不同点

  • 损失函数:梯度下降可以选取其它损失函数,而最小二乘一定是平方损失函数
  • 实现方法:最小二乘法是直接求导找出全局最小;而梯度下降是一种迭代法
  • 效果:最小二乘找到的一定是全局最小,但计算繁琐,且复杂情况下未必有解;梯度下降迭代计算简单,但找到的一般是局部最小,只有在目标函数是凸函数时才是全局最小;到最小点附近时收敛速度会变慢,且对初始点的选择极为敏感

代码实现

# 简单线性回归(梯度下降法)
### 0.引入依赖
import numpy as np
import matplotlib.pyplot as plt

### 1.导入数据
points = np.genfromtxt('data.csv',delimiter=',')

points[0,0]

#提取points中的两列数据,分别作为x, y
x = points[:, 0]
y = points[:, 1]

#用plt画出散点图
plt.scatter(x,y)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

### 2.定义损失函数
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)
    
    #逐点计算平方损失误差,然后求平均数
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        total_cost += (y - w*x -b) ** 2
    return total_cost/M

### 3.定义模型的超参数
alpha = 0.0001
initial_w = 0
initial_b = 0
num_iter = 10

### 4.定义核心梯度下降算法的函数
def grad_desc(points, initial_w, initial_b, alpha, num_iter):
    w = initial_w
    b = initial_b
    #定义一个list保存所有的损失函数值,用来显示下降的过程
    cost_list = []
    
    for i in range(num_iter):
        cost_list.append(compute_cost(w, b, points))
        w, b = step_grad_desc(w, b, alpha, points)
        
    return [w, b, cost_list]

def step_grad_desc(current_w, current_b, alpha, points):
    sum_grad_w = 0
    sum_grad_b = 0
    M = len(points)
    
    # 对每个点,代入公式求和
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_grad_w += (current_w * x + current_b - y) * x
        sum_grad_b += (current_b * x + current_b - y)
        
    # 用公式求当前梯度
    grad_w = 2/M * sum_grad_w
    grad_b = 2/M * sum_grad_b
    
    # 梯度下降,更新当前的w和b
    updated_w = current_w - alpha * grad_w
    updated_b = current_b - alpha * grad_b
    
    return updated_w, updated_b


### 5.测试:运行梯度下降算法计算最优的w和b
w, b, cost_list = grad_desc(points, initial_w, initial_b, alpha, num_iter)

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, points)
print("cost is : ",cost)

plt.plot(cost_list)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

在这里插入图片描述

### 6.画出拟合曲线
plt.scatter(x, y)

# 针对每一个x,计算得出预测的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/477487
推荐阅读
相关标签
  

闽ICP备14008679号