简单回归问题

一、梯度下降算法求解二元一次方程

  1. 问题描述
    • 求解 y = w ∗ x + b + e p s y = w*x+b + eps y=wx+b+eps最小值
    • 给出x,y的大量测试点,预测出w和b
  2. 步骤
    • 将方程式转化为 l o s s = ( w ∗ x + b ) 2 loss=(w*x+b)^2 loss=(wx+b)2,由于有大量的测试点,可以求出loss的均值avg来表示。(这就是求解loss函数的式子)
    • 求梯度信息
      1. w ′ = w − l r ∗ ∇ l o s s ∇ w w' = w - lr * \frac{\nabla loss}{\nabla w} w=wlrwloss(lr是learningRate学习率)
      2. b ′ = b − l r ∗ ∇ l o s s ∇ b b' = b - lr * \frac{\nabla loss}{\nabla b} b=blrbloss
    • 给定迭代次数来求取目标解[b,w]
  3. code
# 求解loss = (wx+b-y)^2
import numpy as np


def compute_error_for_line_given_points(b,w,points):
    totalError = 0
    for i in range(0,len(points)):
        x = points[i,0]
        y = points[i,1]
        totalError += (w * x + b - y) ** 2
    return  totalError / float(len(points))
# 计算梯度信息loss = (wx+b-y)^2
# 对w求偏导: 2*(wx+b-y)*x
# 对b求偏导: 2*(wx+b-y)
# 求解迭代的w' = w - lr * (loss/w)(w对loss的偏导)
# 求解迭代的b' = b - lr * (loss/b)(b对loss的偏导)
def step_gradient(b_current,w_current,points,learningRate):
    b_gradient = 0
    w_gradient = 0
    N = float(len(points))
    for i in range(0,N):
        x = points[i,0]
        y = points[i,1]
        w_gradient += (2/N) * (w_current * x + b_current - y) * x  #求w'的avg
        b_gradient += (2/N) * (w_current * x + b_current - y)      #求b'的avg
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b,new_w]

# 循环迭代梯度信息,num_iterations(迭代的次数)
def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):
    b = starting_b
    w = starting_w
    for i in range(num_iterations):
        b,w = step_gradient(b,w,np.array(points),learning_rate)
    return [b,w] # 找到比较优的解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值