线性回归

六 线性回归

数据
在这里插入图片描述
在这里插入图片描述
机器学习三要素:数据、算法与模型
根据数据 ,选择算法,生成模型
所以在进行机器学习建模过程中,首先最重要的就是对数据进行分析,进而选择什么模型。
从上表的数据,我们显然可以发现x,y成某种一元线性关系(即成一条直线的关系)

既然我们认为 x 和 y 满足线性相关关系,那么线性函数: y = a + bx,就是我们的模型函数。其中 y 也可以用 f(x) 来表示。
我们要做的是综合利用所有的训练数据(工作年限从0-5的部分)求出 y = a + bx 中常数 a 和 b 的值。

综合利用的原则是什么呢?就是我们要求的这个 a 和 b,在将训练样本的 x 逐个带入后,得出的预测年薪 y’ = a + bx 与真实年薪 y 整体的差异最小。

怎么衡量这个整体差距呢?

Cost Function,形式如下(其中 m 为样本的个数,在本例中 m 取值为6):
在这里插入图片描述

在 y = a + bx 这个模型函数中,a 和 b 是常量参数,x 是自变量,而 y 是因变量。
但到了 J(a,b) 中,x(i) 和y(i) 是常量参数(也就是 m 个样本各自的 x 和 y 值),而 a 和 b 成了自变量,J(a,b) 是因变量。能够让因变量 J(a, b) 取值最小的自变量 a 和 b,就是最好的 a 和 b。

我们要做的,就是找到最好的 a 和 b。
讲求解 a,b 之前,我们先要特别强调一个概念——线性。
线性=直线?

线性概念的混淆

为什么要说线性呢?

因为,很多人简单认为“线性回归模型假设输入数据和预测结果遵循一条直线的关系”。

这种理解是一叶障目,是愚蠢的,是低级的。

线性回归模型是:利用线性函数对一个或多个自变量 (x 或 (x1,x2,…xk))和因变量(y)之间的关系进行拟合的模型。
线性回归模型构建成功后,这个模型表现为线性函数的形式。
线性函数的定义是:一阶(或更低阶)多项式,或零多项式。

在这里插入图片描述
总结一下:特征是一维的,线性模型在二维空间构成一条直线;特征是二维的,线性模型在三维空间中构成一个平面;若特征是三维的,则最终模型在四维空间中构成一个体,以此类推。

但是他们可以映射回一维空间即平面,其表现为一条曲线

用线性回归模型拟合非线性关系

在输入特征只有一个的情况下,是不是只能在二维空间拟合直线呢?其实也不一定。

比如,有一些样本,只有一个特征,我们把特征和结果作图以后发现,是这个样子的:

在这里插入图片描述
这些样本特征和结果关系的走势,根本不是直线嘛。看起来还挺像二阶曲线的。

这个时候,我们完全可以把特征从一个“变成”两个:
在这里插入图片描述
在这里插入图片描述
这样一来,我们只需要在二维向量空间里训练
f(X)=a+BX,就可以了。

当然,这种操作也不限于在一维到二维之间的转换,一维也可以转为三维、四维、n 维;或者原本的 k 维也可以每一维都求平方后作为新特征引入,转为 2k 维,如此种种……依需要而取就好。

七 线性回归—梯度下降法求解目标函数

y = a + bx 的目标函数为:在这里插入图片描述
其实线性回归的目标函数都可以为上式,因为由上式中的计算方法和线性函数构成的目标函数能证明是凸函数。

斜率、导数和偏微分

梯度下降法:从任意点开始,在该点对目标函数求导,沿着导数方向(梯度)“走”(下降)一个给定步长,如此循环迭代,直至“走”到导数为0的位置(最优点位置),则达到极小值。

为什么要求导呢?从下图可以看到:曲线表示一个函数,它在一个点处的导数值就是经过这个点的函数曲线切线的斜率。
导数表现的是函数 f(x) 在 x 轴上某一点 x0 处,沿着 x 轴正方向的变化率/变化趋势,记作 f′(x0)。
在 x 轴上某一点处,如果f′(x0)>0 ,说明 f(x) 的函数值在 x0 点沿 x 轴正方向是趋于增加的;如果 f′(x0)<0,说明 f(x) 的函数值在 x0 点沿 x 轴正方向是趋于减少的。

一元函数在某一点处沿 x 轴正方向的变化率称为导数。但如果是二元或更多元的函数(自变量维度 >=2),则某一点沿某一维度坐标轴正方向的变化率称为偏导数。

导数/偏导数表现的是变化率,而变化本身,用另一个概念来表示,这个概念就是微分(对应偏导数,二元及以上函数有偏微分)。

直观而不严格的来说,(偏)微分就是沿着(偏)导数的方向,产生了一个无穷小的增量
记住常用规则中最常用的几条
在这里插入图片描述

在这里插入图片描述

梯度下降法最重要的就是梯度
梯度就是方向,就是目标函数中所有因变量【即模型函数参数(其实就是模型,模型就是模型参数,即y=ax+b中的a和b)】沿着各自的维度坐标的单位变化。方向就是各维度上的最大单位变化值(增加变化)。所以进行优化时,需要进行反梯度方向。
线性回归代码

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

experiences = np.array([0,1,2,3,4,5,6,7,8,9,10])
salaries = np.array([103100, 104900, 106800, 108700, 110400, 112300, 114200, 116100, 117800, 119700, 121600])

    # 将特征数据集分为训练集和测试集,除了最后 4 个作为测试用例,其他都用于训练
X_train = experiences[:7]
X_train = X_train.reshape(-1,1)
X_test = experiences[7:]
X_test = X_test.reshape(-1,1)

    # 把目标数据(特征对应的真实值)也分为训练集和测试集
y_train = salaries[:7]
y_test = salaries[7:]

    # 创建线性回归模型
regr = linear_model.LinearRegression()

    # 用训练集训练模型——看就这么简单,一行搞定训练过程
regr.fit(X_train, y_train)

    # 用训练得出的模型进行预测
diabetes_y_pred = regr.predict(X_test)

    # 将测试结果以图标的方式显示出来
plt.scatter(X_test, y_test,  color='black')
plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3)

plt.xticks(())
plt.yticks(())
plt.show()

多元线性回归
在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值