阅读本文你的收获:
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