【深度学习】线性回归与梯度下降(新手理解-附DEMO)

本文探讨了线性回归的基本概念,包括一元线性回归和回归问题的分类,以及最小二乘估计方法。重点介绍了梯度下降算法,通过实例演示了如何使用梯度下降优化线性回归模型参数。此外,还提及了逻辑回归与Sigmoid函数在二分类问题中的运用。
摘要由CSDN通过智能技术生成

阅读本文你的收获:

1.理解线性回归和梯度下降的前世今生

2.线性回归引导出的维度崩塌问题(字节算法面经)

什么是回归(LinearRegression)?

回归(LinearRegression):Regression的意思是回归。在英文中还有个单词return 也是返回的意思。但我们这里的回归不是“回归(return)祖国”的回归,而是一种“推理”的含义。下面详细解释Regression

首先理解这样一个数据集Datasets=(x1,y1)(x2,y2)...(xn,yn) 这里根据y两种不同的形式来解释:1.y是分类问题标签:比如预测性别问题,y=(男,女);x是是什么?x是样本的特征,样本就是输入的具有xn个的特征和对应的Yn的标签。比如(180cm,160斤,爱好打篮球,一顿三碗大米饭,男)前四个就是样本特征,最后一个就是这个样本的y:男。这样的样本有n个,也就构成了Dataset。那么再给一个(160cm,80斤,爱好化妆)让模型去计算y是男还是女,这是分类问题并不是回归问题。

那么y是连续的变量的时候:比如为1%-100%;是回归问题。比如预测薪资1000-50000,当然分类问题也可转化为回归问题。规定阈值50%,概率值在50%以下的人划为没有肺癌,50%以上则认为患有肺癌。

一元线性回归:用x去预测y,也就是用一条直线去拟合数据。得到一个方程:y = 0.0512x + 7.1884。这时把x=0带入可以得到一个y^值,^的意思是说明y是预测值并不是真实值。所以有了《残差》的概念:真实值和预测值间的差值。

Loss:损失函数:我们有xi样本和对应的yi真实值,将xi放入回归方程y = 0.0512(A)x + 7.1884(B),得到一个预测值y^,ei = y-y^;得到残差。再ei平方消除负数。将每个xi都这样计算一遍求和得到SSE(Sum of Squares for Error)残差平方和(一种计算回归问题的损失函数),显然sse越小说明方程越拟合数据

最小二乘估计

但是回归方程中的参数A,B怎么来的呢?

还是ei=y-y^  -->ei = (Ax+B  -  y)平方,那么ei最小值的时候就得到最合适A和B,利用对A求偏导,先将B看作常数不影响整体。再令偏导为0,得A = y/x,x!=0;

矩阵求导:

二乘法的不足:因为不是所有矩阵都有可逆矩阵,(XT-X)^(-1)无解的矩阵w求不出来。

梯度下降:方向和步伐

方向是计算梯度(对权重的导数)

关于梯度和方向导数的基础知识,看看这里讲的:通俗理解方向导数、梯度|学习笔记 - 知乎 (zhihu.com)

总的来说梯度就是(x,y)这点的分别对x,y的偏导数,其反应:梯度是函数值增长最快的方向。

那么为了找loss最低点,就将w-步长*梯度。

线性回归Demo:

# 定义数据集

# 定义数据特征
#比如是学习时间1h,2h,3h
x_data = [1, 2, 3]

# 定义数据标签
#特征对应的标签,学习成绩2分,4分,6分
y_data = [2, 4, 6]

# 初始化参数W
# 初始化权重,初值。后续通过梯度下降更新。
w = 4

# 定义线性回归的模型
# 这里定义f(x)的具体计算形式,权重*特征。返回值是预测的y^(y_pred)值
def forword(x):
    return x * w

# 定义损失函数
# 损失函数是计算真实值和预测值的差值,为了避免负数,我们给他平方。每一个样本有一个loss,我们计算他们的和,最后返回的是它们的平均数
# 我们这里的loss是一个一元二次的方程,可以求其一阶偏导数,并且当偏导数为0时得到w与x,y的关系式: w = y/x (x不为0)
def cost(xs, ys):
    costvalue = 0
    for x, y in zip(xs, ys):
        y_pred = forword(x)
        costvalue += (y_pred-y)**2
    return costvalue / len(xs)

# 定义计算梯度的函数
# 梯度下降方法,计算对w的偏导数,从而
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w -y)
    return grad / len(xs)


for epoch in range(100):
    cost_val = cost(x_data, y_data)

    grad_val = gradient(x_data, y_data)

    w = w - 0.01 * grad_val


    print('训练轮次:', epoch, "w=", w, "loss", cost_val)


print("100轮后w已经训练好了,此时我们用训练好的w进行推理,学习时间为4个小时的时候最终的得分为:", forword(4))


逻辑回归算法:看似回归实际是二分类任务。

Sigmoid函数:

e为欧拉常数,自变量z取任意实数,函数g(z)值域为[0,1],这就将输入的自变量映射到0-1之间。

z就可以取权重*特征的形式  z = w0*x0+w1*x1+...Wn*xn  +b ,b为常数

值域是0%-100%,我们通过z传入函数g(z)得到一个概率,z的意义是通过特征和权重的运算得到预测值。比如睡觉时间8h,吃东西多少200g,性别1男,工作时间8h  这些数据输入进去w1*8h+...+b

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值